世界最速の日本語形態素解析器Jaggerを使ってみる

# 前書き
人間は文章を産み、文章はAIを育て、AIは人間の時間を浪費させる。

X（旧Twitter）の一日あたりのツイート投稿数は[5億件](https://time.com/6171871/why-elon-musk-wanted-twitter-in-numbers/)ほどとされており、そのうち日本語ツイートは[15%](https://epjdatascience.springeropen.com/articles/10.1140/epjds/s13688-021-00271-0)程度を占めるので、一日あたりおよそ7,500万件の日本語文が生成されていると考えられる。

最も広く普及している日本語形態素解析器の[MeCab](https://taku910.github.io/mecab/)は、1秒あたり10万文程度の日本語テキストを形態素解析することができる。つまり、上記のデータをすべて解析するのにざっくり750秒かかる。

形態素解析はあくまで前処理ツールである。あなたがもし日本語ツイートの経時的分析を目的にしていると仮定すると、一年間におけるすべての日本語ツイートを分析するために、形態素解析だけで76時間かかり、十年分の日本語ツイートを形態素解析するためには760時間かかる。

人生は短い。この前処理をせめて半分以下、欲深い願望がもし叶えられるのなら、十分の一以下の時間で行えたら、それはとてつもなく素晴らしいことである。

じつのところ、その願いはすでに叶えられている。

# Jagger
[Jagger](https://www.tkl.iis.u-tokyo.ac.jp/~ynaga/jagger/index.ja.html)は東京大学生産技術研究所の吉永さんが2023年に公開した世界最速の日本語形態素解析器である（2024年11月現在）。

Jaggerはそれ以前に最速の分かち書き手法であった[最長一致法](https://aclanthology.org/E14-4016/)に、品詞情報を含めた最長一致パターンによる決定的分割のアイディアを加えることで、速度を保ったまま、形態素解析の精度を既存実装（MeCab, [Vaporetto](https://github.com/daac-tools/vaporetto/blob/main/README-ja.md)）と同程度まで押し上げている。

![スクリーンショット 2024-11-21 1.28.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937210/be5dccc0-39ce-a8d1-6a11-421ea0217f4a.png)

[日本語論文](https://www.anlp.jp/proceedings/annual_meeting/2023/pdf_dir/C2-5.pdf), [英語論文](https://aclanthology.org/2023.acl-short.2/)

# インストール・動作確認
[公式ページ](https://www.tkl.iis.u-tokyo.ac.jp/~ynaga/jagger/index.ja.html)の「Download & Setup」における手順だと、最新の開発版（jagger-2024-03-14.tar.gz）がダウンロードできない。以下にURLを変更した手順を示す。
```bash
# 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](https://dumps.wikimedia.org/other/cirrussearch/)から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 |


```bash
# 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は[京都大学コーパス](https://nlp.ist.i.kyoto-u.ac.jp/?%E4%BA%AC%E9%83%BD%E5%A4%A7%E5%AD%A6%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%91%E3%82%B9)（新聞記事）から学習しているので、新聞では出現しない言い回しに対して、より出現頻度の高い文字へと、細かく分割しすぎてしまっていると考えられる。

一方、Jaggerは[KWDLC](https://nlp.ist.i.kyoto-u.ac.jp/?KWDLC)（Webコーパス）から学習しているので、多少砕けた表現にも妥当な分割を出力できている一方、最長一致パターンによる分割のため、不自然に長めの形態素を割り当ててしまっていると考えられる。

# 精度改善案
手軽な改善手法としては、とても解析速度が遅い代わりに高精度な[Juman++](https://nlp.ist.i.kyoto-u.ac.jp/?JUMAN%2B%2B)を使用して、WebコーパスやWikipediaコーパスの形態素解析を行い、その出力結果をMeCab・Jaggerの仮の学習データとする方向性が考えられる。

# 結論
オプション機能や移植実装・ラッパーが充実しており、人間の感覚に近い出力をするMeCab、速度や消費メモリに利があるが、やや不自然な出力をするJagger。

それぞれあなたの必要に応じて使い分けが可能である。

# 後書き
この記事もいつかAIの出力する、意味はあるが価値のない文書の一部としてWebの輪廻を漂うのだろう。そのとき何かの偶然が重なって、ふたたびこの後書きがあなたの手元に現れることがあったのなら――

何も付け加えずにそっと削除して欲しい。