📘

OSCARでHojiChar使ったメモ

2023/08/17に公開

HojiCharはlineのllmで使われた前処理用のライブラリ
https://github.com/HojiChar/HojiChar/tree/v0.9.0

大規模日本語データセットのうち割りとキレイそうなoscarで試してみる
https://oscar-project.org/

huggingfaceからとってこれる
https://huggingface.co/datasets/oscar-corpus/OSCAR-2301/viewer/ja/train

今回作成した処理後のデータセット
https://huggingface.co/datasets/if001/oscar_2023_filtered

oscarのmetadataについて

oscarでは文章に関する情報がmetadataとして付与されている。フィールドのサンプルはドキュメントのlayoutを参照

今回は23.01
https://oscar-project.github.io/documentation/versions/oscar-2301/

22.01から変更の無いフィールドもあるのでこっちも参照
https://oscar-project.github.io/documentation/versions/oscar-2201/

フィールド例
contentに本文のtextが入っている

{
   "content":"English sentence\nphrase en français\n????????????", // 
   "warc_headers":{...
   },
   "metadata":{
      "identification":{ // 
         "label":"fr",
         "prob":0.8938327
      },
      "harmful_pp":4063.1814, // 
      "tlsh":"tlsh:T125315FF2B6088901EEA097015DB39B4600B...", // 
      "quality_warnings":[ // 
         "short_sentences",
         "header",
         "footer"
      ],
      "categories":[ // 
         "examen_pix",
         "liste_bu"
      ],
      "sentence_identifications":[ // 
         {
            "label":"en",
            "prob":0.9992377
         },
         null
      ]
   }
}

harmful_pp

kenLMで計算されたperplixity
詳しくはここ: https://arxiv.org/abs/2212.10440

tlsh

類似ドキュメントに対するハッシュ
重複文章を削除するのに使える

quality_warnings

文章に対して、adult, clean, footer, header Annotation, noisy, short_sentence, tiny の項目を持つ
詳細はここ:https://aclanthology.org/2022.lrec-1.463/

  • header Annotation: 文章の冒頭に短い文章が続いている場合
  • footer: headerと同じ、文章の末尾を見る
  • tiny: 文章が5行以下
  • short_sentence: 短い文章が50%以上
  • noisy: 記号が多いもの
    (unicodeの結合文字、囲み記号などの記号が文字に対して0.5以上だとnoisy判定される)

noisyの例

{"content":"アーカイブ 月を選択 2022年12月 2022年11月 2022年10月 2022年9月 2022年8月 2022年7月 2022年6月 2022年5月 2022年4月 2022年3月 2022年2月 2022年1月 2021年12月 2021年11月 2021年10月 2021年9月 2021年8月 2021年7月 2021年6月 2021年5月 2021年4月 2021年3月 2021年2月 2021年1月 2020年12月 2020年11月 2020年10月 2020年9月 2020年8月 2020年7月 2020年6月 2020年5月 2020年4月 2020年3月 2020年2月 2020年1月 2019年12月 2019年11月 2019年10月 2019年9月 2019年8月 2019年7月 2019年6月 2019年5月 2019年4月 2019年3月 2019年2月 2019年1月 2018年12月 2018年11月 2018年10月 2018年9月 2018年8月 2018年7月 2018年6月 2018年5月 2018年4月 2018年3月 2018年2月 2018年1月 2017年12月 2017年11月 2017年10月 2017年9月 2017年8月 2017年7月 2017年6月 2017年5月 2017年4月 2017年3月 2017年2月 2017年1月 2016年12月 2016年11月 2016年10月 2016年9月 2016年8月 2016年7月 2016年6月 2016年5月 2016年4月 2016年3月 2016年2月 2016年1月 2015年12月 2015年11月 2015年10月 2015年9月 2015年8月 2015年7月 2015年6月 2015年5月 2015年4月 2015年3月 2015年2月 2015年1月 2014年12月 2014年11月 2014年10月 2014年9月 2014年8月 2014年7月 2014年6月 2014年5月 2014年4月 2014年3月 2014年2月 2014年1月 2013年12月 2013年11月 2013年10月 2013年9月 2013年8月 2013年7月 2013年6月 2013年5月 2013年4月 2013年3月 2013年2月 2013年1月 2012年12月 2012年11月 2012年10月 2012年9月 2012年8月 2012年7月 2012年6月 2012年5月 2012年4月 2012年3月 2012年2月 2012年1月 2011年12月 2011年11月 2011年10月 2011年9月 2011年8月 2011年3月 2011年2月 2011年1月 2010年12月 2010年11月 2010年10月 1970年1月","quality_warnings":["tiny","noisy"]}

headerの例

{"content":"Sorry, you have Javascript Disabled! To see this page as it is meant to appear, please enable your Javascript!\nSkip to contentSkip to content\nMenuMenu\nmacatawacyclingclub.org\nカラダの情報局\nサイトマップ\nClose MenuClose Menu\nmacatawacyclingclub.org 日用品,雑貨・小物,雑貨什器 Pieni Sieni のかわいいフェルトフラワーキット\nPieni Sieni のかわいいフェルトフラワーキット\n2022年9月14日2022年9月14日 pikakichi2015@gmail.compikakichi2015@gmail.com 0 Comments\n発売日\n2021-02-21 10:00:00\nジャンル\n雑貨・小物 日用品 雑貨什器 \nメーカー\nコスミック出版 \n品番\ncha_202106cos09796\nJANコード\n4959321009796\n価格\n¥1760\nフェルトフラワーを、 初心者の方でもすぐにはじめられるキット付きレシピブック! 【商品仕様】 フェルトフラワーを、 初心者の方でもすぐにはじめられるキット付きレシピブック。 基本のテクニックから、ちょっとしたアレンジまで、レシピブックも充実! 繊細で立体的で本格的なお花が、簡単に・誰にでも・すぐに作れます。 フェルトのカットを型抜き済みのお花でサポートします。 フラワーづくりの専用ワイヤーやテープなど、手に入りにくいものも全部入っているのでとっても便利でお得なキット。 【キット内容】 型抜き済み お花フェルト : 9種18枚 型抜き済み 葉っぱフェルト : 1種 1枚 フェルト生地 : 1枚 ビーズ : 2色・計28個 ワイヤー :(72cm) 6本、テープ:1本) 冊子(作り方やアレンジを紹介) ●保証期間:3ヶ月間 ●生産国:日本 ご注文後のキャンセルは原則、承っておりません。 事前に十分にご検討いただいた上でご注文ください。\nDMMで見る\nRelated posts:\nデオシート 消臭フレグランス フローラルシャボンの香り レギュラー 84枚\nグラスフラワー C2055544\nフッテドボウル トールフラワー K21306128\n投稿ナビゲーション\nPrevious Previous post:\nNext Next post:\nコスミック出版\nLeave a Reply コメントをキャンセル\nメールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です\nコメント ※\n名前 ※\nメール ※\nサイト\n次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。\nYou May Also Like\nグラスフラワー C2055579グラスフラワー C2055579\n本物の生花をシリカゲル乾燥させ、ガラスの中に閉じ込めたインテリア商品です。5年、10年と長期間観賞が楽しめる為、贈り物に最適な商品です。また、生花本来の色合いを残している為、作りもの感がなく、自然本来の見た目を維持しています。1つ1つ手作りで仕上げたボトルフラワーは、30年の歴史の中で、今もなお愛され続けています。 【商品仕様】 ●サイズ:φ14.5×13cm ●材質:ガラス ●箱サイズ:16×16×17.5cm ●原産国:タイ ※こちらの商品は、生花を加工しているため、花の色・形が多少異なる場合がございます。 ご注文後のキャンセルは原則、承っておりません。 事前に十分にご検討いただいた上でご注文ください。 ...\nRead FullRead Full\nデオシート 消臭フレグランス フローラルシャボンの香り ワイド 42枚デオシート 消臭フレグランス フローラルシャボンの香り ワイド 42枚\n■閉めきったお部屋でも、ニオイ快適! 「高速吸収ポリマー」と「ふんわりアロマ成分」のダブル消臭で瞬間&長時間消臭! ■天然の植物成分配合「フローラルシャボン」の香り 天然の植物成分(フラワーブーケ抽出エキス)配合で、安心感のあるやさしい香り ■オシッコ跡の見た目も清潔! 表面に清潔感のある「ふわさら吸収シート」を採用。 香りをイメージした、「ナチュラルピンク」とのシートカラーで、オシッコあとの見た目も清潔!交換も明るく楽しい気分に♪ 【商品仕様】 【材質】 表面材:ポリオレフィン・ポリエステル不織布、香料 吸水材:綿状パルプ、吸水紙、高分子吸水材 防水材:ポリエチレンフィルム 結合材:ホットメルト接着剤 外装材:ポリエチレンフィルム 【商品使用時サイズ】 シートサイズ:60×44cm 【原産国または製造地】 中国 ご注文後のキャンセルは原則、承っておりません。 事前に十分にご検討いただいた上でご注文ください。 ...\nRead FullRead Full\nプリザーブドフラワー Kei 慶S 茜 C3015049プリザーブドフラワー Kei 慶S 茜 C3015049\n造花 【商品仕様】 サイズ…15×30.5×6.5cm 材質…木、ガラス 原産国…中国/日本 補足仕様…★L版(127×89mm)1枚用 注釈…※生花を加工しているため、花の色・形が多少異なる場合がございます。 PKGサイズ:162*162*114 ご注文後のキャンセルは原則、承っておりません。 事前に十分にご検討いただいた上でご注文ください。 ...","quality_warnings"["short_sentences","header"]}

弾いたほうが良さそうなもの

quality_warningsがheader, footer, noisy

quality_warningsがheader, footer, noisyのものはとりあえず弾いて良さそう

単語の羅列

quality_warnings的には問題なさそうだけど、こういうスペースが多いのは弾いたほうが良さそう。

{"content":"2D 3D AR eスポーツ IR Meet Up/hackathon VR アプリ イベント インタビュー エンジニア カリキュラム ゲーム ゲーム業界 ゲーム業界情報 ゲーム業界経験者向け サービス シナリオ ニュース ブロックチェーン メタバース 京都 企画職 兵庫 勉強会 北海道 大阪 学生向け 宮城 広島 愛知 採用 採用セミナー 未経験向け 東京 神奈川 福岡 経営情報 経営者 自社IP 自社開発 調査レポート 講演 転職ノウハウ 静岡",plain""quality_warnings":["tiny"]}

文章が途中で終わってるパターン

「続きを読む」はquality_warningsのheader or footerで判定可能っぽい。

ただ、続きを読むが入っていればquality_warningsによらず全て捨ててしまって良いのでは????

小さ […]\n続きを読む ≫

途切れるパターンは、文章の中を見て排除するか...
どうしたら良いだろ。

どうしても土曜日受診がご ...

全文

{"content":"当院は現在多くのリウマチ膠原病患者さんが来院しております。 そのため初診が大変混雑しており、お受けできない時間帯もございます。 特に土曜日は初診がまったく入れない状況ですので、どうしても土曜日受診がご ...\n初診に関して\n2019/05/11 -クリニックより\nおかげ様で当院の外来も大変混雑しておりまして、新患の初診患者さんが診れない状態が続いております。 他院からの紹介患者さんは早めに見たいと思いますので、予約時におっしゃってください。 関節 ...\n待ち時間を短縮することを目的に予約制を採用しています。当日予約も受け付けていますので、お電話でご確認ください。予約は診療時間内にお願いします。予約患者終了後、お電話がつながらない場合がございます。ご了承ください。","quality_warnings":["short_sentences"]}
{"content":"今回は重ね煮kitchen suzuminagi・北さんの登場です!! 重ね煮の一番の特徴でもある陰と陽に 食材の旨味そのままに旬の野菜をたっぷりと使い おばんざい風に・・・。 ココロにもカラダにも美味しいお料理! 小さ […]\n続きを読む ≫\nヨガ\n6月 Toshinori class\n2018.05.31\nby amagami-beyoga\n0\n6月22日(金) 無理しないアシュタンガヨガ 14:00〜15:30 夜のリラックスヨガ 18:00〜19:30 ・無理しないアシュタンガヨガ カラダの柔軟性や可動域は十人十色、 特にカラダの固い人は無理をせずに自分ので […]\n続きを読む ≫\nイベント/ワークショップ\n6月タッチハグ♡キッズ\n2018.05.30\nby amagami-beyoga\n0\n6月29日(金) 10:00〜11:30 1,500円 音楽に合わせて動いたり、親子で沢山遊びましょう♪ キッズはベビーと違い動いたり立ったりするので 親子ストレッチのような楽しい要素を盛り込んでいます。 歌に合わせて親 […]\n続きを読む ≫\nヨガ\n6月 おやじヨガ\n2018.05.30\nby amagami-beyoga\n0\n普段は女性の方が多いので このクラスは私の中で新しい発見が目白押しです! やっぱり男性と女性ではカラダのしくみが基本的に違うのかな・・・と。 運動不足・ストレス解消・健康なカラダ作り・リラックスしたい・・・ 男性でもそん […]\n続きを読む ≫\nヨガ\n6月 Tomoko 子ども連れクラス\n2018.05.23\nby amagami-beyoga\n0\n6月の子ども連れクラスのスケジュールです。 毎日子育て、家事などで忙しいママたちの ためのクラスです。 お子さんがどれだけ騒いでもぜんぜん構いません!(笑) そしてお子さんが気になってなかなか集中できなくても大丈夫です! […]\n続きを読む ≫\nイベント/ワークショップ\n6月 Voice Workshop\n2018.05.23\nby amagami-beyoga\n0\n4月にシリーズ1が終了しましたが それを惜しむ声が多々あがっていたので シリーズ2を開始することになったんです!! このワークショップ、おもしろいですよ! 自分が普段どれだけ力んでいるかが 分かっちゃいます(笑) 意外に […]\n続きを読む ≫\nヨガ\n6月RUCHICA class\n2018.05.23\nby amagami-beyoga\n0\nキュートでていねいに教えてくれる RUCHICA先生の今月のクラスのお知らせです。 ●ヴィンサヤヨガ 呼吸を通して心と身体を繋げていくクラス。 ポーズの形を意識しすぎて呼吸がおろそかになるのではなく、 呼吸に合わせて流れ […]\n続きを読む ≫\nイベント/ワークショップ\n6月 ベビーマッサージ\n2018.05.23\nby amagami-beyoga\n0\n赤ちゃんが動き始めてしまう前の ほんの数ヶ月の間が一番オススメです♡ 楽しくスキンシップしながら行うベビーマッサージは赤ちゃんの感情面、 肉体面両方の発達に効果があります。 複数組の親子での開催なのでママ同士の情報交換の […]","quality_warnings":["short_sentences","header","footer"]}

hojichar

lineのllmで使われた前処理用のライブラリ

https://engineering.linecorp.com/ja/blog/3.6-billion-parameter-japanese-language-model

https://github.com/HojiChar/HojiChar/tree/v0.9.0

使い方はreadme通り

フィルター

いくつか便利なフィルターが用意してあるのでありがたい

https://github.com/HojiChar/HojiChar/blob/v0.9.0/hojichar/filters/document_filters.py#L320
https://github.com/HojiChar/HojiChar/blob/v0.9.0/hojichar/filters/document_filters.py#L407

重複処理用のフィルター

https://github.com/HojiChar/HojiChar/blob/v0.9.0/hojichar/filters/deduplication.py#L14
GenerateDedupLSH classでhashを計算しておいて、LSHDeduplicator classで弾く
弾く対象をblack_listとして保持しておくとメモリに展開されずに処理できる。
(black_listの保存機能はないので自分で保存する必要がある)

フィルターの作成

自分でフィルターを作るのも簡単に行える
https://github.com/HojiChar/HojiChar/tree/v0.9.0#user-defined-filters
弾きたいデータに対しては、is_rejected = Trueを設定する

処理の並列化

各データに対する処理の並列化も行える
https://github.com/HojiChar/HojiChar/tree/v0.9.0#parallel-application-of-compose
(並列化した場合、is_rejected = Trueがうまく動かなかったので、保存する際にis_rejectedを見る必要があるっぽい)
このあたりが呼ばれる必要がありそうだけど、Parallelの場合呼ばれてない
https://github.com/HojiChar/HojiChar/blob/v0.9.0/hojichar/core/composition.py#L78-L84
重複処理も並列だとうまく動かないっぽい

OSCAR に対してhojicharを試す

OSCARではmetadataにあるquality_warningsを使いたかったのでDocumentにmetadataをもたせる。
LoaderもOSCAR用にmetadataを読み込めるようにclassを作る。

class OscarDocument(Document):
      def __init__(self, *args, **kwargs):
          super().__init__(*args, **kwargs)          
          self.metadata = {}

class OscarJSONLoader(JSONLoader):
    def __init__(self, metadata_keys = [], *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.meta = 'metadata'
        self.metadata_keys = metadata_keys

    def apply(self, document):
        try:
            data = json.loads(document.text)
            document.text = str(data[self.key])
            ## metadataを追加
            for k in self.metadata_keys:     
                document.metadata[k] = data[self.meta][k]                

        except Exception as e:
            if self.ignore:
                document.is_rejected = True
                return document
            else:
                raise e

        return document

filterの処理はこんな感じ
oscarのデータのmetadataにheader、footer、noisyが含まれていれば削除するようにする

class FilterByQualityWarnings(Filter):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.quality_key='quality_warnings'

    def apply(self, doc: OscarDocument):        
        quality = doc.metadata[self.quality_key]
        if 'header' in quality or 'footer' in quality or 'noisy' in quality:
            doc.is_rejected = True
        return doc    

あとは、文章が途中で終わってるパターンとかを弾けると良さそう

oscarのデータセットはzst圧縮されているので、一旦解凍してから使うようにした。
なんかもっと良い方法ありそう

def extract_zst_file(input_file, output_file):
    import zstandard as zstd
    with open(input_file, 'rb') as compressed_file:
        decompressor = zstd.ZstdDecompressor()
        with decompressor.stream_reader(compressed_file) as reader, open(output_file, 'wb') as output:
            while True:
                chunk = reader.read(16384)
                if not chunk:
                    break
                output.write(chunk)

run

とりあえず10000件に対して、10並列で処理してみる。
シンプルにいくつかのfilter処理を並列で行うclean部分と、重複削除のdebup部分のパートに別れている。

cleanで残った文章: 4842個
debupで残った文章: 4636個
大体半分くらいが残りそう。

実行時間は、ダウンロード時間を無視して10000件に対して3mくらい。
clean部分は早いけど、debupが並列にできてないのでその分遅い。

oscarのファイルは分割されており、1ファイルが大体600Mくらいで、全部で119個。

1ファイルの文章数は約380000個。1ファイルに対してかかる時間は3m*38で約114分くらいになりそう。これが118ファイルある、と...

(作ったあとに気づいたけど、1ファイルごとの重複削除しかできないコードになってるので、直さないとだめ)

一旦、debupなしで10000件に対して計測
実行時間は、30s
1ファイルでは、約20mになる計算
199個の全ファイルに対して実行すると、20m * 119で約40hくらいかかる計算

フィルター後のサンプル
https://raw.githubusercontent.com/if001/HojiChar_OSCAR_sample/0.0.3/output/2.jsonl

まぁまぁキレイになったけど、もう少しゴミが残ってそう
https://github.com/HojiChar/HojiChar/blob/v0.9.0/hojichar/filters/token_filters.py#L20

C++でのdedup処理

さすがにpythonでのdedup処理は時間がかかりすぎたので、ChatGPTさんに協力してもらってC++で書き直してもらった。基本的にはHojiCharaのdedup処理を踏襲
https://github.com/HojiChar/HojiChar/blob/main/hojichar/filters/deduplication.py

https://github.com/if001/dedup_sentence

所感

こういう前処理を行う関数とかをまとめてくれているの便利
アダルトや暴力的なキーワードは辞書的に弾けるがそれも用意してあるのありがたい
https://github.com/HojiChar/HojiChar/tree/v0.9.0/hojichar/dict

文章自体をフィルターする以外にもtoken単位で削除することもできるので、もう少しキレイにできそう。実装はこのあたり
https://github.com/HojiChar/HojiChar/blob/v0.9.0/hojichar/filters/tokenization.py

とりあえずで書いた今回のサンプル
https://github.com/if001/HojiChar_OSCAR_sample/tree/0.0.3

Discussion