Edited at

新形態素解析器JUMAN++を触ってみたけど思ったより高精度でMeCabから乗り換えようかと思った話

More than 1 year has passed since last update.

JUMAN++は最近黒橋・河原研究室から発表された、JUMANの後継となる形態素解析器です。

これまでの形態素解析器と比べて違うのは、RNN言語モデルを用いて意味的自然さを考慮する、ニューラルネットワークを利用した形態素解析器となっている点です。

速度や語彙等の課題はあるものの、解析能力自体はMeCab以上なので、導入方法と共に触ってみた所感を述べてみます。


導入方法


前提

OS X Yosemite 10.10.5

VirtualBox 5.1.6

Vagrant 1.8.6


インストール

vagrant boxは bento/ubuntu-16.04を使用します。

推奨はCentOSですが、自分の環境ではCentOSではビルドに失敗しました。

また、OSはubuntu16.04でもboxによっては上手くインストールすることができないため、bentoのboxがおすすめです。

$ vagrant init bento/ubuntu-16.04

$ vagrant up --provider virtualbox
$ vagrant ssh

ssh接続ができたら、JUMAN++を使うための前提パッケージをインストールしていきます。

(公式ドキュメントではgperftoolsが推奨されていますが、自分の環境では逆に10倍ほど遅くなったので見送りです)

$ sudo apt install libboost-dev # Boostインストール

$ sudo apt install build-essential # gcc等ビルドツールをインストール

これで前提パッケージのインストールは完了です。

いよいよJUMAN++本体をインストールしていきます。

$ wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.01.tar.xz

$ tar xJvf jumanpp-1.01.tar.xz
$ cd jumanpp-1.01/
$ ./configure
$ make
$ sudo make install

インストールが完了しました。

あとは jumanpp で好きな文章を形態素解析します。

$ jumanpp

見せてもらおうか、JUMAN++の性能とやらを
見せて みせて 見せる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:見せる/みせる 付属動詞候補(タ系) 使役動詞:見る/みる"
もらおう もらおう もらう 接尾辞 14 動詞性接尾辞 7 子音動詞ワ行 12 意志形 4 "代表表記:もらう/もらう"
か か か 助詞 9 接続助詞 3 * 0 * 0 NIL
、 、 、 特殊 1 読点 2 * 0 * 0 NIL
JUMAN JUMAN JUMAN 未定義語 15 その他 1 * 0 * 0 "品詞推定:名詞"
+ + + 未定義語 15 その他 1 * 0 * 0 "品詞推定:名詞"
+ + + 未定義語 15 その他 1 * 0 * 0 "品詞推定:名詞"
の の の 助詞 9 接続助詞 3 * 0 * 0 NIL
性能 せいのう 性能 名詞 6 普通名詞 1 * 0 * 0 "代表表記:性能/せいのう カテゴリ:抽象物"
と と と 助詞 9 格助詞 1 * 0 * 0 NIL
やら やら やら 助詞 9 接続助詞 3 * 0 * 0 NIL
を を を 助詞 9 格助詞 1 * 0 * 0 NIL


(追記)その他


Mac

JUMAN++のHomebrewフォーミュラができたようです.

(参考:http://chezou.hatenablog.com/entry/2016/10/15/162047)

$ brew tap chezou/homebrew-jumanpp

$ brew install jumanpp

楽ちん.


JUMAN++とMeCabの比較

まず、普通の書き言葉を解析する限りではMeCab+mecab-ipadic-NEologd(NEologd)より特段優れているとは感じませんでした。

語彙数自体はNEologdが多いので、MeCabの方が高精度なこともあると思います。

ですが、以下のようなケースでは、JUMAN++はMeCabよりも精度を発揮します。

1.表記揺れ

2.話し言葉

3.未定義語


1.表記揺れ

例えばGoogleは、グーグル、ぐーぐる、と表記方法が複数存在します。

ひらがなで入力した時に正しく解析できるかテストしてみます。


JUMAN++

けんさくえんじんぐーぐる

けんさく けんさく けんさく 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:検索/けんさく カテゴリ:抽象物 ドメイン:家庭・暮らし"
@ けんさく けんさく けんさく 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:建策/けんさく カテゴリ:抽象物"
えんじん えんじん えんじん 名詞 6 普通名詞 1 * 0 * 0 "代表表記:円陣/えんじん カテゴリ:形・模様"
ぐーぐる ぐぐる ぐぐる 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:Wikipedia Wikipediaリダイレクト:Google 非標準表記"


MeCab

けんさくえんじんぐーぐる

けんさ 名詞,サ変接続,*,*,*,*,検査,ケンサ,ケンサ
くえん 動詞,自立,*,*,一段,体言接続特殊,くえる,クエン,クエン
じん 名詞,一般,*,*,*,*,じん,ジン,ジン
ぐー 名詞,形容動詞語幹,*,*,*,*,グー,グー,グー
ぐる 名詞,一般,*,*,*,*,ぐる,グル,グル

思った以上にJUMAN++の圧勝でした。

RNNすごい。


2.話し言葉

JUMAN++ではくだけた表現に対応するため動的に形態素を認識するので、辞書中と異なる表記でも形態素解析を行うことができます。

そのため「おはよーございます」や「行きたぁぁぁい」のようなくだけた表現の解析が可能になります。


JUMAN++

ぉぃしかったでーーす

ぉぃしかった おいしかった おいしい 形容詞 3 * 0 イ形容詞イ段 19 タ形 8 "代表表記:美味しい/おいしい ドメイン:料理・食事 反義:形容詞:まずい/まずい 非標準表記"
@ ぉぃしかった おいしかった おいしい 形容詞 3 * 0 イ形容詞イ段 19 タ形 8 "代表表記:美味しい/おいしい ドメイン:料理・食事 反義:形容詞:まずい/まずい 非標準表記"
でーーす です です 助動詞 5 * 0 無活用型 26 基本形 2 NIL


MeCab

ぉぃし  形容詞,自立,*,*,形容詞・イ段,ガル接続,おいしい,オイシ,オイシ

かっ 動詞,自立,*,*,五段・ラ行,連用タ接続,かる,カッ,カッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
で 助詞,接続助詞,*,*,*,*,で,デ,デ
ーー 名詞,一般,*,*,*,*,*
す 動詞,自立,*,*,サ変・スル,文語基本形,する,ス,ス

くだけた表現が多いSNS等を解析する時、JUMAN++が適していると言えそうです。


3.未定義語

正確にはNEologdの未定義語です。

NEologdはWebから大量に情報収集し、ipadicを大幅に強化しますが

* 「補殺」や「駐輪所」のような一部の頻出語が含まれていない

* 「すもももももも」「なのは完売」等、文章が固有名詞として登録されている

点が個人的に不満でした。

(※以下の結果は2016年7月7日更新のNEologdの結果です.語彙の問題については最新版では改善されているようです)

JUMAN++も同様にWebから辞書を構築しますが、スクレイピングがよりスマートで、必要な語を適切に網羅することに成功しています。


JUMAN++

駐輪所で返却可能

駐輪所 駐輪所 駐輪所 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:Wikipedia Wikipediaページ内一覧:熊本国府高等学校 読み不明"
で で で 助詞 9 格助詞 1 * 0 * 0 NIL
返却 へんきゃく 返却 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:返却/へんきゃく カテゴリ:抽象物"
可能 かのう 可能だ 形容詞 3 * 0 ナ形容詞 21 語幹 1 "代表表記:可能だ/かのうだ 反義:形容詞:不可能だ/ふかのうだ"


MeCab

駐輪所で返却可能

駐 接頭詞,名詞接続,*,*,*,*,駐,チュウ,チュー
輪 名詞,一般,*,*,*,*,輪,ワ,ワ
所 名詞,接尾,一般,*,*,*,所,ショ,ショ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
返却 名詞,サ変接続,*,*,*,*,返却,ヘンキャク,ヘンキャク
可能 名詞,形容動詞語幹,*,*,*,*,可能,カノウ,カノー

JUMAN++だと綺麗な境界で区切れています。

(「若沖」(正しくは「若冲」)のような誤字も収集してしまっているので、そうした点は今後の改善が望まれます)


JUMAN++のメリット・デメリット


JUMAN++のメリット


  • 意味的自然さに基づいた解析が可能

  • 話し言葉に強い

  • 表記揺れに強い

  • 辞書がスマート

  • MeCabほど細かくに品詞分けしない(解析結果が理解しやすい)

  • カテゴリ・ドメインで意味解析ができる

  • Pythonラッパーが存在(インストール方法はこちら)


JUMAN++のデメリット


  • 辞書の語彙はNEologdの方が充実している

  • MeCabほど細かく品詞分けしない(詳細分析に適さない?)

  • 解析が遅い

  • 読み獲得ができない文字も存在する


感想

スピードが必要とされる場合や、確実に読みを取得したい場合はMeCab。

それ以外はJUMAN++がベストプラクティスかな、と感じました。

また文章の切り出し方も両者それぞれなので、目的や用途によって使い分けてもいいかもしれません。

ただし


  • 辞書・モデルの改良が予定されている事

  • 動作の高速化が予定されている事


  • 部分アノテーションによる簡単な精度向上方法が用意されている事

を考えると、いずれはMeCabに代わるデファクトスタンダードとなるかもしれません。


(追記)部分アノテーションについて

通常形態素解析の誤りを修正するのには専門知識が必要ですが、JUMAN++では簡単に誤りを訂正できます。

この 木 の 実は 、 発芽 し ない

を修正する場合、以下のように適切な境界にタブを挿入します。

この木の \t 実 \t は \t   、発芽しない

どんなに高性能の形態素解析器でも解析誤りは避けられませんが、JUMAN++ではこの部分アノテーションを訓練データに追加することで、二度と同じ過ちを繰り返すことがなくなります。

また、公式ホームページの部分アノテーションを共有するページにアノテーションを投稿することで学習コーパスに反映され、JUMAN++の精度が向上していきます。


結論

スピードと語彙数以外はほぼJUMAN++が勝っていそうです。


更新履歴

2016/10/13 比較部分を追記・修正

2016/10/14 部分アノテーションについて追記

2016/10/19 Macインストールについて追記

2016/10/27 NEologd関連の追記・修正

2016/11/01 NEologdの話し言葉の例を最新に修正


参考

黒橋・河原研究室 日本語形態素解析システム JUMAN++

http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN%2B%2B

Ubuntu 14.04 に gcc、gdb などの開発ツールをインストールする

http://qiita.com/moris/items/02c01a239b9701336260

boostのインストール

http://kaworu.jpn.org/cpp/boost%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB#Ubuntu

RNNLMベースの形態素解析器 JUMAN++ をhomebrewでインストールできるようにした

http://chezou.hatenablog.com/entry/2016/10/15/162047