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
開発の経緯に興味がある方は
Naoki Yoshinagaをどうぞ。実装の詳細は Yahoo! JAPAN での招待講演の資料で少し触れています。
記号処理への回帰:パターンに基づく速度指向言語処理
自然言語処理.30巻4号 p. 1266-1271. 2023.
--compact-dict
オプションをつけると、形態素情報を語彙に依存しない品詞・活用情報と語彙に依存する見出し語情報に分割して保持するようにでき、解析は少し遅くなりますが消費メモリを少し減らせます。> wc src/*.{cc,h}
107 615 4725 src/jagger.cc
171 1069 6713 src/jagger.h
266 1968 15854 src/train_jagger.cc
320 2092 14254 src/ccedar_core.h
864 5744 41546 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
言語資源の入手先:
-f
オプション (jagger
)の廃止(::isatty (0) == 0)
のとき full buffering を有効化)コマンドラインで jagger -h
とタイプすると、以下の usage が表示されします。デフォルトではインストール時に指定した辞書とコーパスから学習したモデルを読み込みます。
jagger: Pattern-based Jappanese Morphological Analyzer
Copyright (c) 2023- Naoki Yoshinaga, All rights reserved.
Usage: src/jagger [-m dir w] < input
Options:
-m dir directory for compiled patterns (default: JAGGER_DEFAULT_MODEL)
-w perform only segmentation
-w
オプションをつけて実行すると、単語分割のみを行います。-f
は出力にブロックIOを用いる高速モードです。コマンドライン上でインタラクティブに解析を行いたい場合はつけないでください。
コマンドラインで train_jagger
とタイプすると、以下の usage を表示します。
train_jagger: Extract patterns for Jagger from dictionary and training data
Copyright (c) 2023- Naoki Yoshinaga, All rights reserved.
Usage: src/train_jagger [-m dir -d dict -u dict] train
Options:
-m dir directory to store patterns
-d dict dictionary in CSV format
-u user_dict user-defined dictionary in CSV format
dict
, user_dict
は MeCab (jumandic) 形式の辞書ファイルです(コスト等は無視されます。フィールド数さえ合っていれば良く、0で埋めて良い)。train
は Jagger (MeCab) の出力と同じ形式の品詞タグ付きデータです。
旧バージョンを使うか、パターンに対応する部分学習データ(対象とする形態素と前後文脈のみ学習事例を含む)を train_jagger
に与えてください。将来的には(簡潔な実装を思いつけば)、推論時にパターンを動的に変更する機能を追加する予定です。
参考文献 [1]を確認ください。
C++ 以外のプログラミング言語で Jagger を使いたい方のためのポートやバインディング(ラッパー)には以下があります。
文献 [1] で提案したアルゴリズムを除き、他の高速化手法については、特許が取得されていないかどうかは未確認です。どの手法も既存の OSS で広く実装・利用されているものなので、問題はないだろうと思いますが、本ソフトウェアを商用利用する際は、各自の責任でご使用ください。
本研究は JSPS 科研費 JP21H03494 および JST CREST JPMJCR19A4 の助成を受けたものです。