この記事の内容
- Pythonで形態素解析器の比較ができるパッケージ作りました。
- Python2.7, Python3.xで動作します。
- 4つの形態素解析器をサポートしてます
- pipでインストールできます。
pip install JapaneseTokenizer
- パッケージのURL
- ただしWindowsはダメです。ごめんなさいね。
パッケージの特徴
- 単語分割するための簡単なインターフェース提供
- 「単語分割 -> ストップワードと品詞でフィルタリング」の操作が1行で完結
- Mecab, Juman, Juman++, Kyteaの4種類を同じインターフェースで呼び出し可能
- 実務でバリバリ使える
- 株式会社インサイトテックの至るところで1年間半以上、使われてます。
- 数百万件のテキストでも割とバリバリと処理してくれます
- 実は本家のpyknp(v0.3)よりも動作が早い
- 辞書追加の簡単なインターフェース提供
- neologd辞書とcsvのユーザー辞書をサポート
- mecabのみ
使い方
準備
GithubのリポジトリにMakeファイルを設置しました。
Makeにこける場合は手動でインストールします。
このセクションを参考にインストールをしてください。
サンプルコード
python3.xでサンプル示します。
python2.x向けのサンプルを見たい方は[exampleコード](https://github.com/Kensuke-
Mitsuzawa/JapaneseTokenizers/blob/master/examples/examples.py)を見てください。
品詞体系はこちらのページが詳しくまとめています。
Juman/Juman++の品詞体系も記述されているので、Juman/Juman++で品詞フィルタリングをしたい場合は、切り替えて使ってください。
ちなみに、Juman/Juman++でもneologd辞書を使うことはできます。こちらの記事をご覧ください。neologd辞書をjuman/juman++で使えるようにするスクリプト作った
Mecab, Juman/Juman++, Kyteaの違いは、呼び出すクラスが違うだけです。
同じ共通クラスを継承しています。
mecabで形態素解析する
Version1.3.1の使い方を紹介します。
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の場合
from JapaneseTokenizer import JumanWrapper
tokenizer_obj = JumanWrapper()
# 獲得したい品詞を定義します。
pos_condition = [('名詞', '固有名詞'), ('名詞', '地名'), ('名詞', '組織名'), ('名詞', '普通名詞')]
sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(tokenizer_obj.tokenize(sentence).filter(pos_condition).convert_list_object())
['イラン', 'イスラム', '共和', '国', '通称', 'イラン', '西', 'アジア', '中東', 'イスラム', '共和', '制', '国家', 'ペルシア', 'ペルシャ']
Juman++の場合
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とクラス名以外はすべて同じです。
from JapaneseTokenizer import KyteaWrapper
tokenizer_obj = KyteaWrapper()
# 獲得したい品詞を定義します。
pos_condition = [('名詞',)]
sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(tokenizer_obj.tokenize(sentence).filter(pos_condition).convert_list_object())
開発の経緯
以前、MecabのバインディングのWrapperみたいなのを作って自己満してる記事を投稿しました。
この時は、自己満で作ったので、それはそれでいいのです。ただ、それから、__「手軽に形態素解析器の比較を試してもらいたい」__と思うようになり、作るに至りました。
理由1 みんなmecabばっか使うじゃん?
あくまで私の周りだけですが、「形態素解析?とりあえずMecabで。てか、他になんかあんの?」みたいな雰囲気を感じます。
Qiitaで検索してみると、mecab
は347件もヒットするのに、juman
は17件しかでません。kytea
に至っては3件です。
確かにMecabはソフトウェアとしての出来がとても優秀だと思います。
でも、「他は知らんけど、まぁ、Mecabしかないんじゃね?」というのは、なんか違うくね?と思います。
そんなわけで、__「Mecab以外にもあるんだよ」__というアピールをしたくて作ったのが1つ目のモチベーションです。
理由2 外国人からするとわっかんねぇじゃん?
最近、日本在住の外国人Pythonコミュニティに行くことがあります。
彼らは日本語処理に興味をもってくれているものの、「どの形態素解析器がいいか?」ってことを知りません。
彼らは調べてはみるものの、違いがよくわからないので、なんだかめちゃくちゃなことを言っています。
下記、いままでに聞いた謎論理
- chasenは昔からあるし、名前もかっこいいからmecabより優れているに違いない
- jumanって名前がさえないし、大学が作ってるだけだから、ショボいんでしょ?
- kytea?なにそれ?なんて読むの?読み方がわからないツールはよくないよねぇ・・
こういう謎論理が出てしまうのは、まず情報が整っていないし、比較できてないからじゃないかと思いました。
情報を整えるのは難しいですが、比較を簡単にすることはできます。そんなわけで作りました。
あと、documentは全て英語で書くように心がけました。少しでも情報がまとまると良いかと思って。
開発方針
できる限り共通化
インターフェースも含めて、できる限り同じ構造になるような設計をしました。
処理を実行するクラス、データクラスはすべて共通化しています。
できる限りシンプルなシンタックス
「前処理を最速でコーディング」を実現するためのシンタックスを設計しました。
その結果、形態素分割、品詞フィルタリングまでを1行でこなすインターフェースになりました。
気に入ったら、GithubのリポジトリにStar☆をお願い致します
一緒に改善してくださる方も募集中です。
このあたりの解析器も導入したいなぁ。RakutenMAとか、Chansenとか・・・