Pythonで形態素解析器の比較できるパッケージつくった

# この記事の内容

* Pythonで形態素解析器の比較ができるパッケージ作りました。
    * Python2.7, Python3.xで動作します。
* 4つの形態素解析器をサポートしてます
* pipでインストールできます。 `pip install JapaneseTokenizer`
    * パッケージの[URL](https://pypi.python.org/pypi/JapaneseTokenizer)
* ただしWindowsはダメです。ごめんなさいね。

# パッケージの特徴

* 単語分割するための簡単なインターフェース提供
* 「単語分割 -> ストップワードと品詞でフィルタリング」の操作が1行で完結
* Mecab, Juman, Juman++, Kyteaの4種類を同じインターフェースで呼び出し可能
* 実務でバリバリ使える
    * [株式会社インサイトテック](http://insight-tech.co.jp/)の至るところで1年間半以上、使われてます。
    * 数百万件のテキストでも割とバリバリと処理してくれます
    * 実は本家のpyknp(v0.3)よりも動作が早い
* 辞書追加の簡単なインターフェース提供
    * neologd辞書とcsvのユーザー辞書をサポート
    * mecabのみ


# 使い方

## 準備

Githubのリポジトリに[Makeファイル](https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizers#setting-up)を設置しました。

Makeにこける場合は手動でインストールします。
[このセクション](https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizers#tokenizers-manual-install)を参考にインストールをしてください。

## サンプルコード

python3.xでサンプル示します。
python2.x向けのサンプルを見たい方は[exampleコード](https://github.com/Kensuke-
Mitsuzawa/JapaneseTokenizers/blob/master/examples/examples.py)を見てください。

品詞体系は[こちらのページ](http://www.unixuser.org/~euske/doc/postag/)が詳しくまとめています。
Juman/Juman++の品詞体系も記述されているので、Juman/Juman++で品詞フィルタリングをしたい場合は、切り替えて使ってください。

ちなみに、Juman/Juman++でもneologd辞書を使うことはできます。こちらの記事をご覧ください。[neologd辞書をjuman/juman++で使えるようにするスクリプト作った](http://qiita.com/Kensuke-Mitsuzawa/items/403256129e812b09c461)

Mecab, Juman/Juman++, Kyteaの違いは、呼び出すクラスが違うだけです。
同じ共通クラスを継承しています。


### mecabで形態素解析する

Version1.3.1の使い方を紹介します。

```py3
import JapaneseTokenizer
# 辞書タイプを選びます。"neologd", "all", "ipadic", "user", ""が選べます。
mecab_wrapper = JapaneseTokenizer.MecabWrapper(dictType='neologd')
# 獲得したい品詞を定義します。
pos_condition = [('名詞', '固有名詞'), ('形容詞', '自立')]

sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(mecab_wrapper.tokenize(sentence).filter(pos_condition).convert_list_object())
```

すると、結果はこのようになります。

```
['イラン・イスラム共和国', 'イラン', '西アジア', '中東', 'イスラム共和制', 'ペルシア', 'ペルシャ']
```

### juman/juman++で形態素解析

基本的にはmecabと変わりません。呼び出すクラスが違うだけです。

Jumanの場合

```py3
from JapaneseTokenizer import JumanWrapper
tokenizer_obj = JumanWrapper()
# 獲得したい品詞を定義します。
pos_condition = [('名詞', '固有名詞'), ('名詞', '地名'), ('名詞', '組織名'), ('名詞', '普通名詞')]

sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(tokenizer_obj.tokenize(sentence).filter(pos_condition).convert_list_object())
```

```
['イラン', 'イスラム', '共和', '国', '通称', 'イラン', '西', 'アジア', '中東', 'イスラム', '共和', '制', '国家', 'ペルシア', 'ペルシャ']
```

Juman++の場合

```py3
from JapaneseTokenizer import JumanppWrapper
tokenizer_obj = JumanppWrapper()
# 獲得したい品詞を定義します。
pos_condition = [('名詞', '固有名詞'), ('名詞', '地名'), ('名詞', '組織名'), ('名詞', '普通名詞')]

sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(tokenizer_obj.tokenize(sentence).filter(pos_condition).convert_list_object())
```

```
['イラン', 'イスラム', '共和国', '通称', 'イラン', '西', 'アジア', '中東', 'イスラム', '共和制', '国家', 'ペルシア', 'ペルシャ']
```

実はWikipediaくらいきちんとしたテキストなら、Juman, Juman++はそんなに変わらなかったりします。
Juman++を使う時は、初回呼び出し時だけは若干、遅いです。
これは、モデルファイルをメモリに載せるために時間がかかるからです。
2回目以降は起動しっぱなしのプロセスを呼び出すので、この遅さはなくなります。

### kyteaで形態素解析

mecab, jumanとクラス名以外はすべて同じです。

```py3
from JapaneseTokenizer import KyteaWrapper
tokenizer_obj = KyteaWrapper()
# 獲得したい品詞を定義します。
pos_condition = [('名詞',)]

sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(tokenizer_obj.tokenize(sentence).filter(pos_condition).convert_list_object())
```





# 開発の経緯

以前、Mecabの[バインディングのWrapperみたいなのを作って自己満してる記事](http://qiita.com/Kensuke-Mitsuzawa/items/50d613952d5a4e3c58e0)を投稿しました。
この時は、自己満で作ったので、それはそれでいいのです。ただ、それから、__「手軽に形態素解析器の比較を試してもらいたい」__と思うようになり、作るに至りました。

## 理由1 みんなmecabばっか使うじゃん？

あくまで私の周りだけですが、「形態素解析？とりあえずMecabで。てか、他になんかあんの？」みたいな雰囲気を感じます。

Qiitaで検索してみると、`mecab`は347件もヒットするのに、`juman`は17件しかでません。`kytea`に至っては3件です。

確かにMecabはソフトウェアとしての出来がとても優秀だと思います。
でも、「他は知らんけど、まぁ、Mecabしかないんじゃね？」というのは、なんか違うくね？と思います。

そんなわけで、__「Mecab以外にもあるんだよ」__というアピールをしたくて作ったのが１つ目のモチベーションです。

## 理由2 外国人からするとわっかんねぇじゃん？

最近、日本在住の外国人Pythonコミュニティに行くことがあります。

彼らは日本語処理に興味をもってくれているものの、「どの形態素解析器がいいか？」ってことを知りません。

彼らは調べてはみるものの、違いがよくわからないので、なんだかめちゃくちゃなことを言っています。

下記、いままでに聞いた謎論理

* chasenは昔からあるし、名前もかっこいいからmecabより優れているに違いない
* jumanって名前がさえないし、大学が作ってるだけだから、ショボいんでしょ？
* kytea？なにそれ？なんて読むの？読み方がわからないツールはよくないよねぇ・・

こういう謎論理が出てしまうのは、まず情報が整っていないし、比較できてないからじゃないかと思いました。

情報を整えるのは難しいですが、比較を簡単にすることはできます。そんなわけで作りました。
あと、documentは全て英語で書くように心がけました。少しでも情報がまとまると良いかと思って。

# 開発方針

## できる限り共通化

インターフェースも含めて、できる限り同じ構造になるような設計をしました。
処理を実行するクラス、データクラスはすべて共通化しています。

## できる限りシンプルなシンタックス

「前処理を最速でコーディング」を実現するためのシンタックスを設計しました。
その結果、形態素分割、品詞フィルタリングまでを1行でこなすインターフェースになりました。

- - -

気に入ったら、[Githubのリポジトリ](https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizers)にStar☆をお願い致します:bow_tone1:

一緒に改善してくださる方も募集中です。
このあたりの解析器も導入したいなぁ。RakutenMAとか、Chansenとか・・・