mecab
自然言語処理
NLP
形態素解析
nlp2018

形態素解析ツールの比較 (NLP2018)

NLP2018のワークショップに行ってきたのですが、そこで聞いてきたことのうち、形態素解析ツールに関することを大雑把にまとめておきます。聞いたことをまとめることが目的なので、詳細は各ツールのWebサイトやgithubページへ行ってください。

間違っている部分、追加したい内容があればコメントでお願いします。


追記: 2018/04/02

nlp2018の発表資料が公開されました。

Juman++ (リンク)
MeCab (リンク)
KyTea (リンク)
Unidic (リンク)

https://sites.google.com/view/nlp2018ws/

NLP2018 形態素解析の今とこれから

趣旨: どういう手法・ツールをどのようなタスクに対して使うべきかを選べるように、各ツールの開発者の発表を基に比較してもらうこと。

さまざまな発表がありましたが、形態素解析ツールに焦点を当ててまとめます。

MeCab

MeCabとは、汎用テキスト処理ツールです。
設計的にどの国の言語でも使えるツールですが、日本語として広く用いられています。
これに対し、JUMANやChasenは日本語専用のツールになっています。

アルゴリズムは、最小コスト法・CRFです。

MeCabの出力としてcsv部分がありますが、この部分は辞書にあるものを出すだけで、各カラムに具体的な品詞の定義はありません。

設計思想は、
1. モジュール化
2. シンプル
3. 高速
4. エンジニア志向

というところを重視しているようです。
まずモジュール化という点で言えば、辞書とシステムが分離されており、"grep 名詞"といったコマンドで検索しても何も出てこないように設定等を外部化されています。
外部定義によって、汎用性が高まり、多言語で用いることが可能となっています。

コードがシンプルであるという点の例としては、「辞書の連接表のフォーマット」「機械学習に過度に依存していない」という点が挙げられます。
シンプルであることにより、改造・デバッグしやすいという利点があります。
また、前処理・後処理でできることは追加せず、Chasenの機能過多の反省を踏まえ、APIを充実させています。
シンプルさは柔軟性と速度を高めます。

速度面での工夫として、事前計算できることは前もってやっています。
速度と精度はトレードオフだということです。

エンジニア志向という点で言うと、NLP専門でない人も使えて、中身がちゃんとわかり、精度主義ではないという点が大きな点です。

今後の大幅な修正があるとすれば、ユニットテストを追加する・現代的な開発環境を導入する・オンライン学習への移行・IOの抽象化などの点になるようです。

Juman++

Juman++はRNN言語モデルに基づく形態素解析器です。
Juman++は、JUMANよりも精度が上がっていますが、速度は落ちています。

MeCab同様、辞書とシステムから構成されています。
辞書獲得にも力を入れており、基本語彙は人手で収集し、それ以外はWikipedia等から自動収集しています。構築した辞書は90万語から成ります。

Juman++ v2では、以下がポイントです。
1. 辞書非依存
2. マルチスレッド向け
3. ライブラリ
4. Nベスト出力
5. 部分アノテーションから学習
6. Juman++ v1に比べ大幅に高速化

Juman++開発者による速度の比較は以下となっています。

形態素解析器, 1秒間に処理できる文の数
MeCab, 53000
KyTea, 2000
JUMAN, 8800
Juman++ v1, 16
Juman++ v2, 4800

また、Juman++ v2は、京都コーパス、リードコーパスに対する精度が他のツールに比べて最も高くなっています。

素性の種類は、

  1. 辞書フィールド
  2. 表層の文字
  3. 表層の文字種
  4. 未知語処理からの情報
  5. IF 辞書のマッチ 素性列 ELSE 素性列

パスのスコア付けは2種類あり、ローカルビームとグローバルビームがあります。

KyTea

KyTeaは機械学習を用いた形態素解析器です。
BCCWJによる学習でも論文の精度が出ない場合がありますが、アノテーションによって精度が改善される場合があります。
KyTeaの開発者は、手法の改善よりもアノテーションのほうが重要だと述べており、言語資源を重視しています。
KyTeaの機能として、単語分割とタグ推定があります。
単語分割に用いられる特徴量は文字n-gram、文字種n-gram、単語情報の3種類があり、線形分類器を学習します。

KyTeaは、機能を分離することによって開発を効率化・シンプルな設計になるようになっています。
基本的なステップは、(1)アノテーション, (2)学習, (3)解析という流れになっており、複雑な機能はありません。

アノテーションを重視しているため、フル・部分アノテーションなどのフォーマットを選択でき、複数読みの定義や境界文字の定義等もできるようになっているようです。

Sudachi

Sudachiは製品利用可能な形態素解析器です。
前処理・後処理の機能、正規化機能など、ノウハウを集約することでNLP技術者以外にも使えます。

Sudachiは形態素解析と固有表現抽出を同時に行いますが、分割単位を併用し、A単位、B単位、C単位があります。

A:医薬/品/安全/管理/責任/者
B:医薬品/安全/管理/責任者
C:医薬品安全管理責任者

プラグイン化が可能で、Javaで実装されており、省メモリ設計になっています。
特に、Elasticsearchプラグインが注目されます。

ここからは私の意見

形態素解析ツールを使う側からすれば、内部の実装がどうなっているのかということよりも、以下の点で比較することが重要に思います。

  • 速度
  • 精度
  • 機能性
  • 拡張の容易さ

まず速度という点から言えば、Word2vecの埋め込みベクトルをWikipedia dumpから作成する際のトークナイザとして形態素解析器を使うケースがありますが、こういったケースではJuman++とMeCabが10倍以上も速度に差があることは注目する点だと思います。なぜなら、この種の処理は実行に数日かかるケースもあり、速度の差が大きいと最悪十数日かかる可能性もあります。このような場合は、Juman++ v1はまず使えません。

次に精度ですが、F値が95%から99%にあがった!というような研究者の主張は、ほんとうはどうでもいい場合が多いです。重要なのは精度が数%上がることではなく、目的のタスクに対してそのツールが十分な結果を出してくれるか、ということです。精度ばかりを追求してしまって、速度で使い物にならないツールは実用上、適さない場合があります。Juman++は精度が高いように見えますが、京都コーパスやリードコーパスといったフォーマルなテキストに限定されます。精度を重視するなら、どんな文章を入力として想定するか考慮するべきです。

機能性という点から言えば、Sudachiが秀でているように感じます。ほとんどのエンジニアにとって、NLPの研究の詳細はどうでもよく、自分たちが一から実装しなくて良かったり、他の有名なツールとの連携性があったりするほうに関心があります。

つまり、「最新の手法を使って精度がすごい高くなった!」だけでは不十分で、複数の観点から比較検討し、自分のタスクに対してどのツールが適しているのかを見極める必要があります。

リンク

http://www.anlp.jp/nlp2018/#workshop_info