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

  • 1035
    いいね
  • 16
    コメント

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