以下で述べるフィルタは、Perspective APIを使って自動生成したラベル付きデータで学習したfastTextベースのフィルタです。 人手で作成したラベル付きデータ LLM-jp Toxicity Dataset で学習した、より精度の高いDeBERTaベースのフィルタは こちら にあります。
pip install fasttext fugashi[unidic-lite]
/path/to/ja_cc/
にフィルタリング対象のファイルCC-MAIN-2013-2016.jsonl.gz
、CC-MAIN-2017-04.jsonl.gz
などがあるとします。ft_model.bin
... フィルタリングに使うfastTextモデルです。predict_ja_cc_gz.py
... モデルとフィルタリング対象のファイルを読み込んで、ファイル中の各text
の有害スコアを計算します。do_filter.py
... 有害スコアに基づいてtext
をフィルタリング(有害か無害かに分類)します。
まずCC-MAIN-2013-2016.jsonl.gz
、CC-MAIN-2017-04.jsonl.gz
などのファイルのリストfile_list
を作り、ファイルごとに、そのファイル中の各text
に対する有害スコアを計算します。
GNU parallel
で並列実行します。
ls /path/to/ja_cc/ | sed 's/\.gz//' > file_list
mkdir toxic_scores/
parallel -j 30 'python3 predict_ja_cc_gz.py \
ft_model.bin /path/to/ja_cc/{}.gz > toxic_scores/{.} ' \
:::: file_list
上記の結果、toxic_scores/
に、CC-MAIN-2013-2016.jsonl.gz
、CC-MAIN-2017-04.jsonl.gz
などのファイルにある各text
に対する有害スコアが出力されます。例えばCC-MAIN-2013-2016.jsonl.gz
の有害スコアはtoxic_scores/CC-MAIN-2013-2016
に出力されます。一行につき1つのtext
に対する有害スコアが記載されます。上記の処理で、だいたい3時間から6時間くらいかかるかもしれません。
次に、有害スコアに基づいて各text
をフィルタリング(有害か無害かに分類)します。
mkdir ja_cc_toxic ja_cc_toxicity_filtered
python3 do_filter.py /path/to/ja_cc/ toxic_scores/ ja_cc_toxic/ ja_cc_toxicity_filtered/
ja_cc_toxic/
に有害なtext
が、ja_cc_toxicity_filtered/
に無害なtext
が出力されます。do_filter.py
にthreshold = 0.99
とありますが、この0.99
が分類閾値です。