neologd辞書をjuman/juman++で使えるようにするスクリプト作った

本スクリプトは、[Insight Tech](http://insight-tech.co.jp/)公開の[リポジトリ](https://github.com/fumankaitori/neologd2juman)から入手可能です。

※ 長く気がついていませんでしたが、辞書生成途中でエラーが起きていて、多くのエントリが変換されないままになっていました。[最新の版](https://github.com/fumankaitori/neologd2juman/tree/0.2)では修正済みです。

# この記事で紹介すること

- neologd辞書の有効性
- neologd辞書をJUMAN/JUMAN++で利用できるようにするためのスクリプト紹介

# neologd辞書とは？

正式には[mecab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd)という名称で、mecabの追加辞書として設計されています。

形態素解析器をweb上のテキストに適用するには、標準の辞書では対応できないケースが多々ありました。特にドラマの名前、スラング的な語(`オマエモナー`など)などが顕著です。

例えば、昨年の年末に話題になった[逃げるは恥だが役に立つ](http://www.tbs.co.jp/NIGEHAJI_tbs/)は標準の`ipadic`では1語と認識できません。

### 標準ipadic

```
% echo "逃げ恥は毎週みている" | mecab
逃げ	名詞,一般,*,*,*,*,逃げ,ニゲ,ニゲ
恥	名詞,一般,*,*,*,*,恥,ハジ,ハジ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
毎週	名詞,副詞可能,*,*,*,*,毎週,マイシュウ,マイシュー
み	動詞,自立,*,*,一段,連用形,みる,ミ,ミ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
EOS
```

### neologd

```
% echo "逃げ恥は毎週みている" | mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd 
逃げ恥	名詞,固有名詞,一般,*,*,*,逃げ恥,ニゲハジ,ニゲハジ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
毎週	名詞,副詞可能,*,*,*,*,毎週,マイシュウ,マイシュー
み	動詞,自立,*,*,一段,連用形,みる,ミ,ミ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
EOS
```

neologdはこのように、次々と世の中に出現する新語に次々と対応していこう！という非常に精力的なプロジェクトです。
neologdのプロジェクトページによると、週に2回の更新が実施されているとのことです。(2017/2/24現在)

# Juman/Juman++とは？

[Juman](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN)/[Juman++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)は京都大学の黒橋・河原研究室で開発されている形態素解析器です。

Jumanはmecabよりも単語の意味分類を細かく実施してくれる点で、大きく異なります。

```
% echo "逃げ恥は毎週みている" | juman  
逃げ にげ 逃げる 動詞 2 * 0 母音動詞 1 基本連用形 8 "代表表記:逃げる/にげる 自他動詞:他:逃がす/にがす"
恥 はじ 恥 名詞 6 普通名詞 1 * 0 * 0 "代表表記:恥/はじ 漢字読み:訓 カテゴリ:抽象物"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
毎週 まいしゅう 毎週 名詞 6 時相名詞 10 * 0 * 0 "代表表記:毎週/まいしゅう カテゴリ:時間"
みて みて みる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:見る/みる 補文ト 自他動詞:自:見える/みえる"
@ みて みて みる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:診る/みる 補文ト ドメイン:健康・医学"
いる いる いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2 "代表表記:いる/いる"
EOS
```

`毎週` の行に`カテゴリ:時間`という表示があるのが見れます。
このように、単語の意味分類を実施しているため、カテゴリを利用した集計も可能です。

一方、Juman++はJumanの後継として2016年に登場した形態素解析器です。
形態素解析時に[RNN](https://en.wikipedia.org/wiki/Recurrent_neural_network)を利用しており、「単語の意味的な類似度」を考慮しながら、単語区切りが可能です。

また、Juman++はJumanと同じフォーマットなので、Jumanで可能だったことをそのまま置き換えることができます。

特に[KNP](http://nlp.ist.i.kyoto-u.ac.jp/?KNP)との組み合わせでは、大きな威力を発揮します。
 `Juman/KNP` という組み合わせを `Juman++/KNP` という組み合わせに置き換えることができます。
 
# neolod2juman

さて、本記事のメイントピックです。

Juman/Juman++ユーザーとしては、毎週のように更新されるneologd言語資源は喉から手が出るほど欲しいものです。

そこで、それを実現してくれるスクリプトを作りました。それが[neologd2juman](https://github.com/fumankaitori/neologd2juman)です。

neologdのエントリをJuman辞書形式に変換してくれます。

ただし、neologdのすべてのエントリを変換するわけではなく、 `名詞/固有名詞` のみです。

neologdとJuman辞書の品詞体系は別の体系を利用しており、1対1の変換関係を構築するのは困難です。固有名詞のみは共通しているだろう。と考え、このようなアプローチにしています。

また、辞書の見出し語が４０文字以上の場合はjuman用の辞書に追加されません。
辞書生成コマンドがエラーを出してしまうからです・・

# スクリプトの実行とインストール

Ubuntu14.04とMac El Capitanで動作確認をしています。

## 必要なもの

- Juman
- Juman++ (Juman++用に辞書を使いたい場合のみ)
- makeコマンド
- python3

## 手順


手順を紹介します。
Juman用に辞書を用意するには、以下の手順でOKです。

1. `git clone git@github.com:fumankaitori/neologd2juman.git`
2. `make`

コマンドが無事に全実行されると、

```
New juman dictionary is at /usr/local/share/juman/juman-neologd-dic
New jumanrc file is at /usr/local/share/juman/jumanrc
```

という表示があります。
`juman`コマンドを呼ぶときに、 `-r [jumanrcのパス]` をつけると、neologd辞書が適応されます。

```
echo "逃げ恥は毎週みている" | juman -r /usr/local/share/juman/jumanrc
逃げ恥 にげはじ 逃げ恥 名詞 6 固有名詞 3 * 0 * 0 "代表表記:逃げ恥/にげはじ"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
毎週 まいしゅう 毎週 名詞 6 時相名詞 10 * 0 * 0 "代表表記:毎週/まいしゅう カテゴリ:時間"
みて みて みる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:見る/みる 補文ト 自他動詞:自:見える/みえる"
@ みて みて みる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:診る/みる 補文ト ドメイン:健康・医学"
いる いる いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2 "代表表記:いる/いる"
EOS
```

いいですね！一語で獲得することができました。
形態素解析器では、品詞間の連続コストを考慮しているので、「辞書に存在する=必ず獲得できる」わけではないようです。

参考までに[githubのリポジトリ](https://github.com/fumankaitori/neologd2juman#juman)では、うまく獲得できた例を掲載しています。

## Juman++で使う

手作業が必要になります。
Juman++をダウンロードすると、 `dict-build` というディレクトリがあります。
このディレクトリ下のディレクトリ `userdic` に `neologd-user-dict.dic` を配置します。
(`neologd-user-dict.dic` はneologd2jumanのmake過程で生成されます)

その後に、`dict-build` で `make` と `install.sh` を実行します。

```
% cd dict-build
% cp [PATH-TO-YOUR neologd-user-dict.dic FILE] userdic/neologd-user-dict.dic
% make
% [sudo] ./install.sh
```

Jumanの時と違い、特別なコマンドは不要です。

```
% echo "逃げ恥は毎週みている" | jumanpp                                 
逃げ恥 にげはじ 逃げ恥 名詞 6 固有名詞 3 * 0 * 0 "代表表記:逃げ恥/にげはじ"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
毎週 まいしゅう 毎週 名詞 6 時相名詞 10 * 0 * 0 "代表表記:毎週/まいしゅう カテゴリ:時間"
みて みて みる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:診る/みる 補文ト ドメイン:健康・医学"
@ みて みて みる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:見る/みる 補文ト 自他動詞:自:見える/みえる"
いる いる いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2 "代表表記:いる/いる"
EOS
```

`逃げ恥` はneologd辞書追加前は1語ではなかったので、今度は成功しました。

参考までに、neologd辞書適応前は下のようになります。


```
逃げ にげ 逃げ 名詞 6 普通名詞 1 * 0 * 0 "代表表記:逃げ/にげv 自他動詞:他:逃がす/にがす 連用形名詞化:形態素解析"
恥 はじ 恥 名詞 6 普通名詞 1 * 0 * 0 "代表表記:恥/はじ 漢字読み:訓 カテゴリ:抽象物 漢字"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
毎週 まいしゅう 毎週 名詞 6 時相名詞 10 * 0 * 0 "代表表記:毎週/まいしゅう カテゴリ:時間 漢字"
みて みて みる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:診る/みる 補文ト ドメイン:健康・医学"
@ みて みて みる 動詞 2 * 0 母音動詞 1 タ系連用テ形 14 "代表表記:見る/みる 補文ト 自他動詞:自:見える/みえる"
いる いる いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2 "代表表記:いる/いる"
EOS
```

# まとめ

- neologd辞書をjuman/juman++利用できるようにした
- 新語にうまく対応できている様子
- ぜひご利用ください〜


最後に、このスクリプトは[Insight Tech](http://insight-tech.co.jp/)から公開されています。[Insight Tech](http://insight-tech.co.jp/)では、不満買取センターユーザーの声を元にした調査事業をしています。
マーケティング調査のご用命をお待ちしております。