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


JUMAN++は最近[黒橋・河原研究室](http://nlp.ist.i.kyoto-u.ac.jp/index.php?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がおすすめです。

```bash
$ vagrant init bento/ubuntu-16.04
$ vagrant up --provider virtualbox
$ vagrant ssh
```

ssh接続ができたら、JUMAN++を使うための前提パッケージをインストールしていきます。
(公式ドキュメントではgperftoolsが推奨されていますが、自分の環境では逆に10倍ほど遅くなったので見送りです)

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

これで前提パッケージのインストールは完了です。
いよいよJUMAN++本体をインストールしていきます。

```bash
$ 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``` で好きな文章を形態素解析します。

```bash
$ 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)

```bash
$ brew tap chezou/homebrew-jumanpp
$ brew install jumanpp
```

楽ちん．

#### 



## JUMAN++とMeCabの比較

まず、普通の書き言葉を解析する限りではMeCab＋mecab-ipadic-NEologd(NEologd)より特段優れているとは感じませんでした。
語彙数自体はNEologdが多いので、MeCabの方が高精度なこともあると思います。
ですが、以下のようなケースでは、JUMAN++はMeCabよりも精度を発揮します。

**1.表記揺れ**
**2.話し言葉**
**3.未定義語**

### 1.表記揺れ

例えばGoogleは、グーグル、ぐーぐる、と表記方法が複数存在します。
ひらがなで入力した時に正しく解析できるかテストしてみます。

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

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

思った以上にJUMAN++の圧勝でした。
RNNすごい。

### 2.話し言葉
 
JUMAN++ではくだけた表現に対応するため動的に形態素を認識するので、辞書中と異なる表記でも形態素解析を行うことができます。
そのため「おはよーございます」や「行きたぁぁぁい」のようなくだけた表現の解析が可能になります。


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

```bash:MeCab
ぉぃし  形容詞,自立,*,*,形容詞・イ段,ガル接続,おいしい,オイシ,オイシ
かっ    動詞,自立,*,*,五段・ラ行,連用タ接続,かる,カッ,カッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
で      助詞,接続助詞,*,*,*,*,で,デ,デ
ーー    名詞,一般,*,*,*,*,*
す      動詞,自立,*,*,サ変・スル,文語基本形,する,ス,ス
```

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

### 3.未定義語
正確にはNEologdの未定義語です。
NEologdはWebから大量に情報収集し、ipadicを大幅に強化しますが
* ~~「補殺」や「駐輪所」のような一部の頻出語が含まれていない~~
* 「すもももももも」「なのは完売」等、文章が固有名詞として登録されている
点が個人的に不満でした。
(※以下の結果は2016年7月7日更新のNEologdの結果です．語彙の問題については最新版では改善されているようです)
JUMAN++も同様にWebから辞書を構築しますが、スクレイピングがよりスマートで、必要な語を適切に網羅することに成功しています。



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

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

JUMAN++だと綺麗な境界で区切れています。
(「若沖」(正しくは「若冲」)のような誤字も収集してしまっているので、そうした点は今後の改善が望まれます)

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

### JUMAN++のメリット
* 意味的自然さに基づいた解析が可能
* 話し言葉に強い
* 表記揺れに強い
* 辞書がスマート
* MeCabほど細かくに品詞分けしない(解析結果が理解しやすい)
* カテゴリ・ドメインで意味解析ができる
* Pythonラッパーが存在(インストール方法は[こちら](http://qiita.com/riverwell/items/7a85ebf95647eaf18a6c))

### JUMAN++のデメリット
* 辞書の語彙はNEologdの方が充実している
* MeCabほど細かく品詞分けしない(詳細分析に適さない？)
* 解析が遅い
* 読み獲得ができない文字も存在する

## 感想

スピードが必要とされる場合や、確実に読みを取得したい場合はMeCab。
それ以外はJUMAN++がベストプラクティスかな、と感じました。
また文章の切り出し方も両者それぞれなので、目的や用途によって使い分けてもいいかもしれません。


ただし

* 辞書・モデルの改良が予定されている事
* 動作の高速化が予定されている事
* [部分アノテーション](http://lotus.kuee.kyoto-u.ac.jp/~morita/JUMAN++/pannotation.html)による簡単な精度向上方法が用意されている事

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

### (追記)部分アノテーションについて
通常形態素解析の誤りを修正するのには専門知識が必要ですが、JUMAN++では簡単に誤りを訂正できます。

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

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

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

どんなに高性能の形態素解析器でも解析誤りは避けられませんが、JUMAN++ではこの部分アノテーションを訓練データに追加することで、二度と同じ過ちを繰り返すことがなくなります。
また、公式ホームページの[部分アノテーションを共有するページ](http://lotus.kuee.kyoto-u.ac.jp/~morita/JUMAN++/pannotation.html)にアノテーションを投稿することで学習コーパスに反映され、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