見出し画像

Google ColabとHojiCharパイプラインを使ってテキストのフィルタリング処理をしてみた!

LINE様が商用利用可能な日本語用LLM(1.7B, 3.6B)を公開してくださいました!

こちらのモデルの特徴として以下の点が挙げられます。

Web由来のテキストから大規模かつ高品質なデータ構築を行うため、OSSライブラリ「HojiChar」を使ったフィルタリング処理を実施。

https://www.itmedia.co.jp/news/articles/2308/14/news138.html

Webから独自に取得した日本語テキストの中から綺麗なテキストだけを抜き出して学習に利用したいため、膨大なテキストデータを一度フィルターにかける必要があります。
そこで利用したライブラリが「HojiChar」とのことです。

今回は、LINE様が学習された LLM の紹介ではなく、テキストのフィルター処理として利用する「HojiChar」の使い方をご紹介します。
コードの実行環境はGoogle Colabを想定しています。

LLM について知りたい方はnpaka様の記事をご覧ください。


Google ColabでHojiCharパイプラインを実行する

ケース1: パイプラインを組んでフィルタリング処理をする

# HojiCharのインストール
!pip install hojichar==0.9.0 -q

# 必要なモジュールのインポート
from hojichar import Compose, document_filters

# Composeオブジェクトの定義
cleaner = Compose([
    document_filters.JSONLoader(key="text"),
    document_filters.AcceptJapanese(),
    document_filters.DocumentLengthFilter(min_doc_len=0, max_doc_len=1000),
    document_filters.ExampleHojiChar(),
    document_filters.JSONDumper()
])

# テストケースを実行する関数
def run_test_case(input_text, expected_output):
    try:
        result = cleaner(input_text)
        print(f"Input: {input_text}")
        print(f"Expected Output: {expected_output}")
        print(f"Actual Output: {result}")
        print("Test Passed!" if result == expected_output else "Test Failed!")
    except Exception as e:
        print(f"Input: {input_text}")
        print(f"Expected Output: {expected_output}")
        print(f"Error: {e}")
        print("Test Failed due to an exception!")
    print("------------------------------------------------")

# テストケース
test_cases = [
    ('{"text": "こんにちは、"}', '{"text": "こんにちは、<hojichar>"}'),             # OK
    ('{"text": "Hello, world!"}', None),                                            # 日本語でないためエラーまたは空の出力
    ('{"text": ""}', None),                                                         # 文字数が0のためエラーまたは空の出力
    ('{"text": "' + "こんにちは、" * 200 + '"}', None),                             # 文字数が1000を超えるためエラーまたは空の出力
    ('{"message": "こんにちは、"}', None),                                          # "text"キーが存在しないためエラーまたは空の出力
    ('{"text: "こんにちは、"}', None),                                              # 不正なJSON形式のためエラーまたは空の出力
    ('{"text": "こんにちは、Hello!"}', '{"text": "こんにちは、Hello!<hojichar>"}')  # OK
]

# テストケースの実行
for input_text, expected_output in test_cases:
    run_test_case(input_text, expected_output)

このコードは、以下のステップを実行します:

  1. JSONオブジェクトの'text'キーから値を抽出します。

  2. 文字列が日本語でない場合は破棄します。

  3. 0文字未満または1000文字を超えるテキストを拒否します。

  4. 文字列に<hojichar>を追加します。

  5. 処理された文字列をキー"text"でJSONとして出力します。

このサンプルコードをGoogle Colabで実行すると、HojiCharパイプラインを使用してテキストのフィルタリング処理を行うことができます。

Compose の部分でパイプラインを定義しているため、コードを実行すれば1~5の処理が順番に適用されていきます。

ケース2: マルチコアのCPUを利用して並列処理を行う

# 必要なライブラリのインストール
!pip install hojichar==0.9.0 -q

# 必要なモジュールのインポート
import hojichar
import os
import json
import random

# 利用可能なCPUコア数の取得
num_cores = os.cpu_count()

# ダミーデータの生成
num_samples = 100000  # 生成するサンプル数
dummy_texts = ["こんにちは、これはテストデータです。", "ダミーテキストのサンプルです。", "HojiCharを使用して前処理を行います。"]

with open("your_text.jsonl", "w") as f:
    for _ in range(num_samples):
        text = random.choice(dummy_texts)
        f.write(json.dumps({"text": text}) + "\n")

# Composeオブジェクトの定義
cleaner = hojichar.Compose([
    hojichar.document_filters.JSONLoader(),
    hojichar.document_filters.DocumentNormalizer(),
    # 必要に応じて他のフィルターを追加
    hojichar.document_filters.JSONDumper(),
])

# 大量のJSON Linesファイルを並列に処理
input_file = "your_text.jsonl"
input_doc_iter = (hojichar.Document(line) for line in open(input_file))

with hojichar.Parallel(cleaner, num_jobs=num_cores) as pfilter:
    out_doc_iter = pfilter.imap_apply(input_doc_iter)
    with open("your_processed_text.jsonl", "w") as fp:
        for doc in out_doc_iter:
            fp.write(doc.text + "\n")

# your_processed_text.jsonlから一部のデータを取り出して表示
num_display = 10  # 表示するデータの数
with open("your_processed_text.jsonl", "r") as f:
    for i, line in enumerate(f):
        if i >= num_display:
            break
        print(line.strip())

このコードは、以下のステップを実行します:

  1. Parallelクラスを使用して、ComposeオブジェクトをDocumentのイテラブルに並列に適用します。

  2. CPUマルチコアを使用して並列処理を行います。

  3. 処理されたドキュメントのイテラブルを取得し、新しいJSON Linesファイルに書き込みます。

  4. 処理したデータの一部を取り出して確認します。

このサンプルコードをGoogle Colabで実行することで、マルチコアのCPUを利用して大量のテキストのフィルタリング処理を高速に行うことができます。

感想

HojiCharパイプラインはParallelクラスが実装されており、お手軽に並列処理することができるので実用的だと思いました。
また、Compose の書き方も分かりやすいため、どんな処理をやっているのか一目で理解できるのが良いですね。

こういった便利なライブラリがあると NLP がやりやすいため、非常に有り難いです~。開発者の方にはとても感謝しています!

ざと様、ありがとうございます!

補足

ケース1のコードでは、文字列に<hojichar>を追加する処理を入れています。これは、特定のタグやマーカーをテキストに追加することで、後続の処理や分析でそのマーカーを基に特定の操作を行うためです。

例えば、以下のような用途が考えられます:

  1. 特定の位置のマーキング: テキスト内の特定の位置やセクションを識別するためのマーカーとして使用することができます。

  2. 後続の処理のトリガー: このマーカーを検出した場合に特定の処理を実行するトリガーとして機能することができます。

  3. デバッグやトラッキング: 前処理の各ステップが正しく機能しているかを確認するためのデバッグ情報として追加することができます。

この記事が気に入ったらサポートをしてみませんか?