Jagger は、辞書に基づく単語分割のための最長一致法と、機械学習の分類器の事前計算に着想を得た、特徴パターンに基づく高速・高精度・省メモリの形態素解析器[1]です。Jagger は形態素解析辞書や学習コーパスから抽出したパターンを入力テキストの先頭から適用し、同時かつ決定的に単語の分割位置、切り出した単語の品詞、見出し語を決定します。最小コスト法や点推定などに基づく既存の効率的な形態素解析器[2,3]と遜色ない解析精度で、1CPUで100万文/秒を超える速度で形態素解析を行うことができます(M2 MacBook Air上)。
Jagger を学術・商用利用する方は以下の参考文献を引用ください。
Naoki Yoshinaga
Back to Patterns: Efficient Japanese Morphological Analysis with Feature-Sequence Trie
The 61st Annual Meeting of the Association for Computational Linguistics (ACL-23). Toronto, Canada. July 2023
取り急ぎ、開発の経緯や実装の詳細を知りたい人は Yahoo! JAPAN での招待講演の資料をどうぞ。
--compact-dict
オプションをつけると、形態素情報を語彙に依存しない品詞・活用情報と語彙に依存する見出し語情報に分割して保持するようにでき、解析は少し遅くなりますが消費メモリを少し減らせます。> wc src/*.{cc,h}
259 1584 11659 src/jagger.cc
165 1115 8709 src/train_jagger.cc
387 2500 17164 src/ccedar_core.h
147 781 5527 src/jagger.h
958 5980 43059 total
License: GNU GPLv2, LGPLv2.1, BSD
> wget http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/jagger/jagger-latest.tar.gz
> tar zxvf jagger-latest.tar.gz
> cd jagger-YYYY-MM-DD
# 1) mecab-jumandic 形式の辞書を用意 (cf. mecab-jumandic-7.0-20130310.tar.gz)
> tar zxvf mecab-jumandic-7.0-20130310.tar.gz
> patch -p0 < mecab-jumandic-7.0-20130310.patch # 助動詞の文字化けを修正
# 2) 京都大学ウェブ文書リード文コーパスを用いる場合 (デフォルト)
> git clone https://github.com/ku-nlp/KWDLC
> configure
# 2') または、京都大学テキストコーパスを用いる場合
> git clone https://github.com/ku-nlp/KyotoCorpus
> cd KyotoCorpus; auto_conv -d PATH_TO_MAINICHI_NEWS_DIR; cd ..
> configure --with-corpus=kyoto
# 3) 標準分割からモデルを学習し、評価も行った上でインストール
> make model-benchmark && make install
# 3') 自分で用意した形態素解析辞書、注釈付き学習データ、評価データを用いて学習・評価を行う場合
> make install
> train_jagger -d DICT_FILE TRAIN_FILE_WITH_POS > PATTERN_DIR/patterns
> jagger -m PATTERN_DIR [-wf] < TEST_FILE > result.JAG
> eval.py result.JAG TEST_FILE_WITH_POS
言語資源の入手先:
コマンドラインで jagger -h
とタイプすると、以下の usage を表示します。デフォルトではインストール時に指定した辞書とコーパスから学習したモデルを読み込みます。
jagger: Pattern-based Jappanese Morphological Analyzer
Usage: jagger -m dir [-wf] < input
Options:
-m dir pattern directory
-w perform only segmentation
-f full buffering (fast but not interactive)
-w
オプションをつけて実行すると、単語分割のみを行います。-f
は出力にブロックIOを用いる高速モードです。コマンドライン上でインタラクティブに解析を行いたい場合はつけないでください。
コマンドラインで train_jagger
とタイプすると、以下の usage を表示します。
train_jagger: extract patterns for Jagger from dictionary and training data
Usage: train_jagger -d dict train > patterns
Options:
-d dict dictionary csv
dict
は MeCab (jumandic) 形式の辞書ファイルです(コスト等は無視されます。フィールド数さえ合っていれば良く、0で埋めて良い)。train
は Jagger (MeCab) の出力と同じ形式の品詞タグ付きデータです。
-d
で指定するオプションで指定する辞書ファイルの末尾に辞書項目を直接追加して下さい。なお、追加した辞書項目の表層が学習データで別の品詞で観測される場合、追加した辞書項目は無視されます。
-m
で指定するパターンディレクトリ内にコンパイル済みパターンpatterns.{c2i,da,fs,p2f}
があれば削除後、同フォルダ内のパターンファイルpatterns
を直接編集してパターンを追加してください。パターンのフォーマットは
パターン頻度\t後文脈表層\t前文脈品詞\t分割位置\t後文脈表層文字種別\t形態素情報
です(パターン頻度は0で良い。後文脈表層文字種別は1(数字), 2(アルファベット), 3(カタカナ), 4(その他)を指定)。なお、一致するパターン(前文脈品詞、形態素情報)が複数あるときは、末尾のパターンで上書きされます。
この辺りの仕様は将来的に改善する予定です。
参考文献 [1]を確認ください。
C++ 以外のプログラミング言語で Jagger を使いたい方のためのポートやバインディング(ラッパー)には以下があります。
文献 [1] で提案したアルゴリズムを除き、他の高速化手法については、特許が取得されていないかどうかは未確認です。どの手法も既存の OSS で広く実装・利用されているものなので、問題はないだろうと思いますが、本ソフトウェアを商用利用する際は、各自の責任でご使用ください。
本研究は JSPS 科研費 JP21H03494 および JST CREST JPMJCR19A4 の助成を受けたものです。