Pythonで Igo + mecab-ipadic-neologd を用いた形態素解析 (Rubyのおまけ付き)

# はじめに

Pythonで形態素解析をしたいと思います。
今回は 形態素解析器として 「Igo」を、辞書として 「[mecab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd)」 を使います。

形態素解析とは 「単語分割」と「品詞付与」 を行うものです。


まずは、Igo、mecab-ipadic-neologd について説明した後、実際にPythonで使えるようにセットアップしていきます。


# Igo とは？

形態素解析エンジンとしては「Mecab」が有名なので聞いたことがある方が多いかもしれません。今回使うのは「Igo」です。
「Mecab」はC言語で書かれていて、「Igo」はjavaで出来てるようです。「Igo」はMecabと同じ解析結果を返すように作られているようです。速度で比較してみ同速程度で動くようです。
「Mecab」バイナリをビルドしなければならなかったりして使いづらい場合があるようで「Igo」を使ってみようと思いました。

# mecab-ipadic-neologd とは？

形態素解析の重要な要素に「辞書」があります。以下のリンクにて形態素解析(ここではMecab)の仕組みを説明してあり参考になります。
[日本語形態素解析の裏側を覗く！MeCab はどのように形態素解析しているか](http://techlife.cookpad.com/entry/2016/05/11/170000)

「東京都に住む」という文章があったときに「東京、都、に、住む」のそれぞれの単語が登録されていなければうまく解析出来ないと感覚的に分かると思います。

また、例えば「サザエさん」をアニメの「サザエさん（タイトル）」と認識するか「サザエ（人名） + さん（敬称）」として認識するかは辞書に「サザエさん」があるかで決まります。
そのため、「昨日のサザエさん見た？面白かったよね」という文章において辞書に「サザエさん」が登録されていることが重要です。

「Igo」の場合、MecabのIPA辞書をIgo用にビルドして使いますが、固有名詞が不足しています。それを補足するのが「mecab-ipadic-neologd」です。「mecab-ipadic-neologd」はMecab標準ではカバー出来ない固有名詞等の表記を採録しています。さらに毎週2回辞書の更新が行われ最新の単語がアップデートされているので有用です。

# セットアップ

```
$ pip install igo-python
```

これでPython経由でIgoを使えるようになります。

# neologd の Clone

```
git clone https://github.com/neologd/mecab-ipadic-neologd
```

neologdはmecab用の辞書なのでIgoでも使えるようにIgo用にbuildすることが必要になります。

neologdについては以下が参考になります。
[mecab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md)


# 辞書をIgo用に build

[Igo](https://osdn.jp/projects/igo/releases/55029) のページから `igo-0.4.5.jar` をダウンロード。
neologdはMecab用の辞書なのでIgo用にbuildします。


`mecab-ipadic-neologd` ディレクトリに移動して 

```
$ bin/install-mecab-ipadic-neologd
```

を実行する。そうすると `build` ディレクトリが作成されます。

`build` ディレクトリの中には、`mecab-ipadic-2.7.0-20070801-neologd-20160826` のようなディレクトリがあるはずです。（ただし、数字の部分は異なることがあります。）
そのディレクトリの中にダウンロードした`igo-0.4.5.jar`をコピーして下さい。
`mecab-ipadic-2.7.0-20070801-neologd-20160826` ディレクトリに入り以下のコマンドを実行するとコンパイル出来ます。

```
$ java -cp igo-0.4.5.jar net.reduls.igo.bin.BuildDic neologd . "utf-8"
```

```
java -cp igo-0.4.5.jar net.reduls.igo.bin.BuildDic (辞書の出力先ディレクトリ名) (Mecabの辞書の展開ディレクトリ名) (辞書の文字コード)
```

(辞書の出力先ディレクトリ名) は必要に応じて変えて下さい。ここでは `neologd` という名前を付けました。
(Mecabの辞書の展開ディレクトリ名) は buildしたディレクトリになります。今回は `mecab-ipadic-2.7.0-20070801-neologd-20160826` のことです。

```
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
```

というエラーが出た場合は以下のように `-Xmx1024m`を付けて対応出来ます。

```
java -Xmx1024m -cp igo-0.4.5.jar net.reduls.igo.bin.BuildDic neologd . "utf-8"
```

それで出来なければ1024の値を増やすとうまくいきます。

# 実行確認

コンパイルした `neologd` があるディレクトリで以下のように実行してみます。

```
$ python
>>> import igo
>>> tagger = igo.tagger.Tagger('neologd')
>>> for t in tagger.parse('10日放送の「中居正広のミになる図書館」（テレビ朝日系）で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。')
...   print(t)
...
surface: 10日, feature: 名詞,固有名詞,一般,*,*,*,10日,ジュウニチ,ジュウニチ, start=0
surface: 放送, feature: 名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー, start=3
surface: の, feature: 助詞,連体化,*,*,*,*,の,ノ,ノ, start=5
surface: 「, feature: 記号,括弧開,*,*,*,*,「,「,「, start=6
surface: 中居正広のミになる図書館, feature: 名詞,固有名詞,一般,*,*,*,中居正広のミになる図書館,ナカイマサヒロノミニナルトショカン,ナカイマサヒロノミニナルトショカン, start=7
surface: 」, feature: 記号,括弧閉,*,*,*,*,」,」,」, start=19
surface: （, feature: 記号,括弧開,*,*,*,*,（,（,（, start=20
surface: テレビ朝日, feature: 名詞,固有名詞,組織,*,*,*,テレビ朝日,テレビアサヒ,テレビアサヒ, start=21
surface: 系, feature: 名詞,接尾,一般,*,*,*,系,ケイ,ケイ, start=26
surface: ）, feature: 記号,括弧閉,*,*,*,*,）,）,）, start=27
surface: で, feature: 助詞,格助詞,一般,*,*,*,で,デ,デ, start=28
surface: 、, feature: 記号,読点,*,*,*,*,、,、,、, start=29
surface: SMAP, feature: 名詞,固有名詞,人名,一般,*,*,SMAP,スマップ,スマップ, start=30
surface: の, feature: 助詞,連体化,*,*,*,*,の,ノ,ノ, start=34
surface: 中居正広, feature: 名詞,固有名詞,人名,一般,*,*,中居正広,ナカイマサヒロ,ナカイマサヒロ, start=35
surface: が, feature: 助詞,格助詞,一般,*,*,*,が,ガ,ガ, start=39
surface: 、, feature: 記号,読点,*,*,*,*,、,、,、, start=40
surface: 篠原信一, feature: 名詞,固有名詞,人名,一般,*,*,篠原信一,シノハラシンイチ,シノハラシンイチ, start=41
surface: の, feature: 助詞,連体化,*,*,*,*,の,ノ,ノ, start=45
surface: 過去, feature: 名詞,副詞可能,*,*,*,*,過去,カコ,カコ, start=46
surface: の, feature: 助詞,連体化,*,*,*,*,の,ノ,ノ, start=48
surface: 勘違い, feature: 名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ, start=49
surface: を, feature: 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ, start=52
surface: 明かす, feature: 動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス, start=53
surface: 一幕, feature: 名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク, start=56
surface: が, feature: 助詞,格助詞,一般,*,*,*,が,ガ,ガ, start=58
surface: あっ, feature: 動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ, start=59
surface: た, feature: 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ, start=61
surface: 。, feature: 記号,句点,*,*,*,*,。,。,。, start=62
```

うまく出来ました！
例文は [mecab-ipadic-NEologd : Neologism dictionary for MeCab](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md) の例文を使用。

# 他の言語 (Ruby編)

`igo-php` や `igo-ruby` 等他の言語でも簡単に Igoが使えるようになっています。
Rubyでも試してみます。ここまでの辞書の準備ができていたら簡単に出来ます。

```
$ gem install igo-ruby
```

```rb
require 'igo-ruby'

tagger = Igo::Tagger.new('neologd')
t = tagger.parse('10日放送の「中居正広のミになる図書館」（テレビ朝日系）で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。')

t.each do |m|
  puts "#{m.surface} #{m.feature} #{m.start}"
end
```

```
10日 名詞,固有名詞,一般,*,*,*,10日,ジュウニチ,ジュウニチ 0
放送 名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー 3
の 助詞,連体化,*,*,*,*,の,ノ,ノ 5
「中居正広のミになる図書館」（ 名詞,固有名詞,一般,*,*,*,中国の尻馬にしがみつく韓国,チュウゴクノシリウマニシガミツクカンコク,チューゴクノシリウマニシガミツクカンコク 6
テレビ朝日 名詞,固有名詞,組織,*,*,*,テレビ朝日,テレビアサヒ,テレビアサヒ 21
系 名詞,接尾,一般,*,*,*,系,ケイ,ケイ 26
） 記号,括弧閉,*,*,*,*,）,）,） 27
で 助詞,格助詞,一般,*,*,*,で,デ,デ 28
、 記号,読点,*,*,*,*,、,、,、 29
SMAP 名詞,固有名詞,人名,一般,*,*,SMAP,スマップ,スマップ 30
の 助詞,連体化,*,*,*,*,の,ノ,ノ 34
中居正広 名詞,固有名詞,人名,一般,*,*,中居正広,ナカイマサヒロ,ナカイマサヒロ 35
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 39
、 記号,読点,*,*,*,*,、,、,、 40
篠原信一 名詞,固有名詞,人名,一般,*,*,篠原信一,シノハラシンイチ,シノハラシンイチ 41
の 助詞,連体化,*,*,*,*,の,ノ,ノ 45
過去 名詞,副詞可能,*,*,*,*,過去,カコ,カコ 46
の 助詞,連体化,*,*,*,*,の,ノ,ノ 48
勘違い 名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ 49
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 52
明かす 動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス 53
一幕 名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク 56
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 58
あっ 動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ 59
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 61
。 記号,句点,*,*,*,*,。,。,。 62
```

参考: [kyow/igo-ruby](https://github.com/kyow/igo-ruby)


# 参考

[igo-pythonでmecab-ipadic-neologdをつかう](http://qiita.com/zabeth129/items/0d39e94862cb558015f0)
[mecab-ipadic-NEologd : Neologism dictionary for MeCab](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md)
[igo-python を使ってみた](http://blog.chocolapod.net/momokan/entry/52)