前書き
人間は文章を産み、文章はAIを育て、AIは人間の時間を浪費させる。
X(旧Twitter)の一日あたりのツイート投稿数は5億件ほどとされており、そのうち日本語ツイートは15%程度を占めるので、一日あたりおよそ7,500万件の日本語文が生成されていると考えられる。
最も広く普及している日本語形態素解析器のMeCabは、1秒あたり10万文程度の日本語テキストを形態素解析することができる。つまり、上記のデータをすべて解析するのにざっくり750秒かかる。
形態素解析はあくまで前処理ツールである。あなたがもし日本語ツイートの経時的分析を目的にしていると仮定すると、一年間におけるすべての日本語ツイートを分析するために、形態素解析だけで76時間かかり、十年分の日本語ツイートを形態素解析するためには760時間かかる。
人生は短い。この前処理をせめて半分以下、欲深い願望がもし叶えられるのなら、十分の一以下の時間で行えたら、それはとてつもなく素晴らしいことである。
じつのところ、その願いはすでに叶えられている。
Jagger
Jaggerは東京大学生産技術研究所の吉永さんが2023年に公開した世界最速の日本語形態素解析器である(2024年11月現在)。
Jaggerはそれ以前に最速の分かち書き手法であった最長一致法に、品詞情報を含めた最長一致パターンによる決定的分割のアイディアを加えることで、速度を保ったまま、形態素解析の精度を既存実装(MeCab, Vaporetto)と同程度まで押し上げている。
インストール・動作確認
公式ページの「Download & Setup」における手順だと、最新の開発版(jagger-2024-03-14.tar.gz)がダウンロードできない。以下にURLを変更した手順を示す。
# jaggerの用意
$ wget "https://www.tkl.iis.u-tokyo.ac.jp/~ynaga/jagger/jagger-2024-03-14.tar.gz"
$ tar zxvf jagger-2024-03-14.tar.gz
$ cd ./jagger-2024-03-14/
# mecab-juman辞書の用意
$ wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7X2pESGlLREpxdXM" -O mecab-jumandic-7.0-20130310.tar.gz
$ tar zxvf mecab-jumandic-7.0-20130310.tar.gz
# mecab-juman辞書のパッチ用意
$ wget "https://www.tkl.iis.u-tokyo.ac.jp/~ynaga/jagger/mecab-jumandic-7.0-20130310.patch"
# 学習データの用意(KWDLC)
$ git clone https://github.com/ku-nlp/KWDLC
# jaggerのコンパイル
$ ./configure
$ make model-benchmark && make install
# 形態素解析
$ echo "人生は短い" | jagger
人生 名詞,普通名詞,*,*,人生,じんせい,*
は 助詞,副助詞,*,*,は,は,*
短い 形容詞,*,イ形容詞アウオ段,基本形,短い,みじかい,*
EOS
# 分かち書き
$ echo "人生は短い" | jagger -w
人生 は 短い
比較
設定
日本語WikipediaのCirrus Dumpから10万記事(647.4MB)を取得し、MaCabとJaggerでそれぞれ分かち書きにする。
辞書はどちらもmecab-jumanを使用する。ただしスコアやパターンの学習に用いる学習データが異なるのでフェアな比較ではない。
以下の計算機を使用する
Macbook Air Retina, 13-inch, 2018
CPU: 1.6 GHz デュアルコアIntel Core i5
メモリ: 8 GB 2133 MHz LPDDR3
結果
定量的評価
定量的分析として解析時間と使用メモリ量を比較すると以下のようになる。
大体論文と同程度の数値になっている。
time (s) | memory (MB) | |
---|---|---|
MeCab | 291.7 | 69.7 |
Jagger | 19.1 | 21.9 |
# MeCab
$ /usr/bin/time -l mecab -Owakati -d "/usr/local/lib/mecab/dic/jumandic" -b 5242880 < ./jawiki-20240422_100000.txt > ./jawiki-20240422_100000_mecab.txt
291.66 real 223.49 user 32.74 sys
69718016 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
8634 page reclaims
10885 page faults
0 swaps
0 block input operations
0 block output operations
0 messages sent
0 messages received
0 signals received
337 voluntary context switches
534425 involuntary context switches
1106407465922 instructions retired
705156422081 cycles elapsed
26062848 peak memory footprint
# Jagger
$ /usr/bin/time -l jagger -w < ./jawiki-20240422_100000.txt > ./jawiki-20240422_100000_jagger.txt
19.09 real 15.25 user 0.98 sys
21913600 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
480 page reclaims
5073 page faults
0 swaps
0 block input operations
0 block output operations
0 messages sent
0 messages received
0 signals received
509 voluntary context switches
26916 involuntary context switches
33718289406 instructions retired
35822332288 cycles elapsed
942080 peak memory footprint
定性的評価
分かち書き結果が異なる文を観察する。差異の部分を[]で括った。
MeCab: 人間 が 音声 や 文字 を 用いて 思想 ・ 感情 ・ 意志 [等 々] を 伝達 する ため に 用いる 記号 体系 。
Jagger: 人間 が 音声 や 文字 を 用いて 思想 ・ 感情 ・ 意志 [等々] を 伝達 する ため に 用いる 記号 体系 。
MeCab: 広義 の 言語 に は 、 verbal な ( 言葉 に 表す ) もの と non - verbal な ( 言葉 と して 表さ れ ない ) [も の] ( 各種 記号 、 アイコン 、 図形 、 ボディーランゲージ 等 ) の 両方 を 含み 、 日常 の コミュニケーション で は 狭義 の 言語 表現 に 身振り 、 手振り 、 図示 、 擬音 等 も 加えて 表現 さ れる こと も ある 。
Jagger: 広義 の 言語 に は 、 verbal な ( 言葉 に 表す ) もの と non - verbal な ( 言葉 と して 表さ れ ない ) [もの] ( 各種 記号 、 アイコン 、 図形 、 ボディーランゲージ 等 ) の 両方 を 含み 、 日常 の コミュニケーション で は 狭義 の 言語 表現 に 身振り 、 手振り 、 図示 、 擬音 等 も 加えて 表現 さ れる こと も ある 。
MeCab: 化学 式 は 自然 言語 の 文法 が 作用 して おら ず 、 化学 式 [独特 の] 文法 で 構成 さ れて いる 。
Jagger: 化学 式 は 自然 言語 の 文法 が 作用 して おら ず 、 化学 式 [独特の] 文法 で 構成 さ れて いる 。
MeCab: ジャック ・ デリダ と いう 、 一般に ポスト 構造 主義 の 代表 的 哲学 者 と 位置づけ られて いる フランス の 哲学 者 は 、 「 声 」 を 基礎 と し 文字 を その 代替 と する 発想 が 言語 学 に 存在 する 、 と 主張 し 、 それ に 対する 批判 を [投げ かける] 立場 を 主張 した 。
Jagger: ジャック ・ デリダ と いう 、 一般に ポスト 構造 主義 の 代表 的 哲学 者 と 位置づけ られて いる フランス の 哲学 者 は 、 「 声 」 を 基礎 と し 文字 を その 代替 と する 発想 が 言語 学 に 存在 する 、 と 主張 し 、 それ に 対する 批判 を [投げか ける] 立場 を 主張 した 。
それぞれの誤りの傾向として、MeCabは「等 々」のように正しくは一語になりそうな箇所を分けてしまっており、Jaggerは「独特の」と本来分割されるべき箇所を結合してしまっている(そもそも「独特の」のような不自然な語が辞書に含まれているのは謎であるが)。
MeCabは京都大学コーパス(新聞記事)から学習しているので、新聞では出現しない言い回しに対して、より出現頻度の高い文字へと、細かく分割しすぎてしまっていると考えられる。
一方、JaggerはKWDLC(Webコーパス)から学習しているので、多少砕けた表現にも妥当な分割を出力できている一方、最長一致パターンによる分割のため、不自然に長めの形態素を割り当ててしまっていると考えられる。
精度改善案
手軽な改善手法としては、とても解析速度が遅い代わりに高精度なJuman++を使用して、WebコーパスやWikipediaコーパスの形態素解析を行い、その出力結果をMeCab・Jaggerの仮の学習データとする方向性が考えられる。
結論
オプション機能や移植実装・ラッパーが充実しており、人間の感覚に近い出力をするMeCab、速度や消費メモリに利があるが、やや不自然な出力をするJagger。
それぞれあなたの必要に応じて使い分けが可能である。
後書き
この記事もいつかAIの出力する、意味はあるが価値のない文書の一部としてWebの輪廻を漂うのだろう。そのとき何かの偶然が重なって、ふたたびこの後書きがあなたの手元に現れることがあったのなら――
何も付け加えずにそっと削除して欲しい。