高速日本語形態素解析 jagger を動かすメモ
背景
LLM 向け日本語データセット構築で, web からのデータセット(おかしい日本語がたくさん)に対して大量の日本語の形態素解析(構文など解析して, おかしい日本語(助動詞が無い文など)を判定して取り除いたりとかしたい)したい.
ginza(spaCy) や sudachipy だと結構遅い...(10 GB 処理に 12 core CPU で並列処理しても 1 日くらいかかる. あと spaCy はそれ自体スレッド処理しているため, Python multiprocess 実行するとハングする + プロセス分けて動かすと性能がおちる)
すごい高精度でなくていいから速いのがほしい...
Jagger - C++ implementation of Pattern-based Japanese Morphological Analyzer
jagger がありました!
ビルドと実行
ビルドは解説ページの通りにすればいけます.
単に動かすだけなら make install
は不要です.
今回は 京都大学ウェブ文書リード文コーパス
を使いました.
辞書の変換と学習は, 10 秒くらいで終わりました.
...
gawk '{ printf "%s", ($1 == "EOS") ? "\n" : $1 }' model/kwdlc/train.JAG > model/kwdlc/train
gawk '{ printf "%s", ($1 == "EOS") ? "\n" : $1 }' model/kwdlc/dev.JAG > model/kwdlc/dev
gawk '{ printf "%s", ($1 == "EOS") ? "\n" : $1 }' model/kwdlc/test.JAG > model/kwdlc/test
Converting corpus into JAGGER format..
Training and testing Jagger..
find /home/syoyo/work/japanese-llama-experiment/jaggar/jagger-2023-02-18/mecab-jumandic-7.0-20130310 -name "*.csv" | sort | xargs cat > model/kwdlc/dict
src/train_jagger -d model/kwdlc/dict model/kwdlc/train.JAG > model/kwdlc/patterns
reading seed patterns from dictionary...done; 702358 words, 752373 features
regarding num / alpha / kana as seed patterns...done; # seeds = 702445
mining patterns from training data...done; 1134266 pattern candidates
pruning patterns...done; 1134266 -> 716731 patterns
src/jagger -m model/kwdlc -f < model/kwdlc/test > model/kwdlc/test.tmp
building DA trie from patterns..done.
/home/syoyo/miniconda3/bin/python3 tools/eval.py model/kwdlc/test.tmp model/kwdlc/test.JAG -l 4
LEVEL 0: P / R / F1 = (0.9749, 0.9771, 0.9760); (tp, fp, fn) = ( 35048, 901, 821)
LEVEL 1: P / R / F1 = (0.9604, 0.9625, 0.9614); (tp, fp, fn) = ( 34524, 1425, 1345)
LEVEL 2: P / R / F1 = (0.9466, 0.9487, 0.9476); (tp, fp, fn) = ( 34028, 1921, 1841)
LEVEL 3: P / R / F1 = (0.9459, 0.9480, 0.9469); (tp, fp, fn) = ( 34004, 1945, 1865)
LEVEL 4: P / R / F1 = (0.9452, 0.9473, 0.9463); (tp, fp, fn) = ( 33980, 1969, 1889)
done.
適当に入力ファイルを作り処理させます!
吾輩は猫である。名前はまだない。
$ ./src/jagger -m model/kwdlc/ < input.txt
(input: stdin)
吾輩 名詞,普通名詞,*,*,吾輩,わがはい,代表表記:我が輩/わがはい カテゴリ:人
は 助詞,副助詞,*,*,は,は,*
猫 名詞,普通名詞,*,*,猫,ねこ,*
である 判定詞,*,判定詞,デアル列基本形,だ,である,*
。 特殊,句点,*,*,。,。,*
名前 名詞,普通名詞,*,*,名前,なまえ,*
は 助詞,副助詞,*,*,は,は,*
まだ 副詞,*,*,*,まだ,まだ,*
ない 形容詞,*,イ形容詞アウオ段,基本形,ない,ない,*
。 特殊,句点,*,*,。,。,*
EOS
voila!
あとは結果を CSV や JSON 出力するなりに改変すればいい感じになりそうです!
ライセンスは?
License: GNU GPLv2, LGPLv2.1, BSD
です. どれかを選べばよいです(ソースコードには SPDX license identifier などは無い)
製品などに組み込むなどではない, 通常の(?)日本語処理のための利用においては特に問題とはならないでしょう.
inference の処理は比較的簡単なので, スマホに組み込んで使いたいときなどの場合は, 動的ダブル配列などふくめ自前実装するのも手でしょうか.
辞書のライセンスは?
京都大学ウェブ文書リード文コーパス
には明確な記載はありません.
基本は cc-by な感じで利用できると思いますが, 自己責任で利用しましょう.
TODO
- 自前コーパスで学習させる
- Python binding や, CSV, JSON での出力オプションをつける
- 文判定のモジュールをどうするか考える. とりま bunkai https://github.com/megagonlabs/bunkai かしら(Python だけど...)
Discussion