事前学習モデル (chiTra) のクリーニング処理について

# はじめに

こんにちは，ワークス徳島人工知能NLP研究所の山村です．

本記事では，ワークス徳島人工知能NLP研究所が提供している事前学習済み BERT モデルである [chiTra](https://github.com/WorksApplications/SudachiTra) の，事前学習用コーパスのクリーニングについて解説します．
コーパスのクリーニング処理は， chiTra の開発者にとってもユーザにとっても重要な処理です．

なお，実際に chiTra で使っていたコードは，以下のリンクから確認することができます．
https://github.com/WorksApplications/SudachiTra/tree/main/pretraining/bert#2-preprocessing-corpus-cleaning

また最後に，他の事前学習済みモデルで適用されているクリーニング手法についても軽く紹介します．
これから，事前学習済みモデルに利用するコーパスのクリーニングについて知りたい方は参考にしてみてください．

> 本記事を読む前に，chiTra についてざっくりと知りたい方やコードを書いて使ってみたい方は，過去の記事を参考にしてみてください．
[【非専門家向け】BERT - chiVe / chiTra 利活用に向けて Part3. - Qiita](https://qiita.com/masakuri/items/b365474b503713c28715)


# コーパスのクリーニングの重要性

自然言語処理におけるクリーニングとは，テキスト中に含まれるノイズを除去する処理です．

自然言語処理では，利用するテキストコーパスによっては用途と合致していないノイズのような表現が多々存在するため，前処理として除去したり，別の表現に置換（正規化）する必要があります．
chiTra では，事前学習のコーパスに [NWJC: 国語研日本語ウェブコーパス](https://masayu-a.github.io/NWJC/) を使っていますが，様々なウェブ上の日本語テキストが含まれているため，クリーニングする必要があります．

また，クリーニングすることで開発者側にとってもユーザ側にとっても嬉しいメリットがあります．

1つ目は，クリーニングによって効率的に学習できるという点です．
一般に，事前学習モデルを構築するには大量のテキストが必要になります．
しかし，このようなテキストコーパスをすべて学習するには，十分なGPUなどの計算資源や学習時間が必要になります．
クリーニングによって，学習に不必要なテキストを学習コーパスから削除することで，学習に必要なテキストのみを効率的に扱うことができます．

2つ目は，下流タスクにおける事前学習モデルの精度を向上させることができる点です．
事前学習モデル [T5: Text-To-Text Transfer Transformer](https://github.com/google-research/text-to-text-transfer-transformer) を提案した [論文](https://arxiv.org/abs/1910.10683) では，学習コーパスである [C4](https://www.tensorflow.org/datasets/catalog/c4) データセットから，下流タスクに有用ではないと考えられる定型文や不快な言葉，ソースコードなどをテキストから除外することで，下流タスクにおける事前学習モデルの精度が向上することを報告しています．

# chiTra で採用したクリーニング処理

様々なクリーニング処理が考えられますが，chiTra では既存の代表的な言語モデルで採用されているクリーニング処理を踏襲しつつ，+α の処理を適用するというポリシーでクリーニング処理を行っています．

実際に，chiTra で採用したクリーニング処理は以下の通りです．

|    | 引用元     | 適用単位   | 説明                                                                             |
|---:|:-----------|:-----------|:---------------------------------------------------------------------------------|
|  0 | cl-tohoku/bert-japanese | 文         | 短すぎる文（10語未満） ,  長すぎる文（200語超過）を削除                          |
|  1 | cl-tohoku/bert-japanese | 文         | 引用記号などのマークアップを削除 <br>例： 研究[要出典] → 研究                                                 |
|  2 | cl-tohoku/bert-japanese  | 文         | 不可視文字を削除                                                                 |
|  3 | C4 (T5)    | 文書       | 短すぎる文書（5文未満）を削除                                                    |
|  4 | C4 (T5)    | 文書       | ソースコードが含まれるような文書を削除 <br> （波括弧｛｝が含まれている文書をソースコードが含まれていると仮定）                                           |
|  5 | C4 (T5)    | 文書       | NGワードが含まれる文書を削除<br>NGワードは，以下から収集<br>https://github.com/1never/open2ch-dialogue-corpus<br>https://github.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words                                                     |
|  6 | - | 文         | メールアドレスが含まれる文を削除                                                 |
|  7 | - | 文         | URLが含まれる文を削除                                                            |
|  8 | - | 文書       | （主に文分割エラーに起因する）短すぎる文を前の文に結合する <br> 例：「私は...です\n。」→「私は...です。」                       |

> 上記のクリーニング処理を実装したコードは以下のリンクを参考にしてください
https://github.com/WorksApplications/SudachiTra/tree/main/pretraining/bert#2-preprocessing-corpus-cleaning


## 引用したクリーニング処理について

chiTra では，以下の2つの事前学習モデルで用いられているクリーニング処理から一部抜粋して採用しました．

* https://github.com/cl-tohoku/bert-japanese
    * 日本語 Wikipedia に対するクリーニング処理
* https://github.com/google-research/text-to-text-transfer-transformer
    * C4 データセット （Common Crawl から作成したコーパス） に対するクリーニング処理

逆に，これらで適用されているクリーニング処理から採用しなかったものとして，以下のような処理があります．

例えば， `cl-tohoku/bert-japanese` ではコーパスの準備段階で Unicode 正規化（NFKC - 互換合成）を行っています．
https://github.com/cl-tohoku/bert-japanese/blob/main/make_corpus_wiki.py#L55
一方，chiTra ではトークナイズ時にユニコード正規化をするかのオプションが指定できるため （`--do_nfkc` オプション），コーパスの準備段階では適用していません．

他にも，`C4` では [langdetect](https://pypi.org/project/langdetect/) による対象言語のみを選定するための言語判定を適用しています．
しかし，chiTra は [NWJC: 国語研日本語ウェブコーパス](https://masayu-a.github.io/NWJC/) を利用しており，日本語のテキストのみ含まれていると考えられるため，言語判定によるフィルタリング処理は採用していません．


# おまけ：他の事前学習用コーパスで採用されているクリーニング処理

これまでに，日本語で扱える様々な大規模言語モデルが公開されています．
そして，事前学習に利用しているコーパスも様々で，Wikipedia や Twitter，Web Crawl や特定のドメイン（ニュース，ブログ，金融，医療など）から作成したコーパスがあります．

* https://github.com/taishi-i/awesome-japanese-nlp-resources#transformer-based-models
* https://zenn.dev/hellorusk/articles/ddee520a5e4318

特定のドメインを扱う場合は，そのドメインに特化したクリーニング処理が必要になってくることもあります．
例えば，NTT が提供する [日本語対話 Transformer](https://github.com/nttcslab/japanese-dialog-transformers) では，事前学習のテキストに Twitter 上のリプライを利用しています．
このモデルの構築に関する[論文](https://arxiv.org/pdf/2109.05217.pdf)では，Twitter に特有のアカウント名や頻出する絵文字の除去，そして URL を含んだツイートや Bot が投稿しているツイートなどを対象にフィルタリング処理を行っていると報告されています．

また，Wikipedia を対象としている中でも，異なるクリーニング処理が行われている場合があります．
このソースが同じでもクリーニング処理が異なる要因の一つとして，Wikipedia のテキストデータが多様形式で配布されている点があります．
Wikipedia では，ダンプファイル (https://dumps.wikimedia.org/jawiki/latest/) を [WikiExtractor](https://github.com/attardi/wikiextractor) でテキストを抽出する方法もありますが，[Wiki-40B](https://www.tensorflow.org/datasets/catalog/wiki40b) のようにあらかじめ整備されているデータセットを利用すれば，事前学習には不要と考えられるページがフィルタリングされているため，クリーニングをあまり意識せずに利用することができます．

# おわりに

本記事では，クリーニングの重要性と chiTra ・その他のモデルのクリーニング処理について概説しました．
もちろん，本記事で扱えなかったクリーニング処理などもあります．
もっとクリーニング処理について知りたい方は，モデルが公開されているページ (GitHub など）に，事前学習に利用したクリーニング処理のコードや説明がある場合がありますので，そちらをチェックしてみてください．

chiTra は Works Applications が開発・公開しています．
何か困ったことや気になることがありましたら，質問や相談ができる Slack のワークスペースがありますので，ぜひお気軽にご連絡ください．
https://github.com/WorksApplications/SudachiTra#%E9%80%A3%E7%B5%A1%E5%85%88--contact-us