形態素解析ソフトウェアのMeCabをPythonから使うパッケージとしては、mecab-python3やnattoなどがよく使われていますが、どうもWindows環境へのインストールで壁にぶつかることが多いようです。
そこで、WindowsでもUnixでも pip コマンド一発でインストールできるPython用のMeCabラッパーを作成しました。PiPyに登録してあるので、
pip install mecabwrap
でインストール可能です。また、Python2系、3系の両方でテストしています。ソースコードはGitHubに置いています。
なお、MeCabはすでにインストールしてあることが前提です(Windowsなら公式サイトのインストーラを利用するのが簡単だと思います。Unixなら、brew
やapt-get
などがお手軽です)。
使い方の紹介
janomeの直感的なAPIを目指して、tokenize
関数を実装しています。
from mecabwrap import tokenize
for token in tokenize('すもももももももものうち'):
print(token)
#すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
#も 助詞,係助詞,*,*,*,*,も,モ,モ
#もも 名詞,一般,*,*,*,*,もも,モモ,モモ
#も 助詞,係助詞,*,*,*,*,も,モ,モ
#もも 名詞,一般,*,*,*,*,もも,モモ,モモ
#の 助詞,連体化,*,*,*,*,の,ノ,ノ
#うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
もう少し自由度の高い処理をするためにdo_mecab
関数を用意していて、MeCabのオプションを利用することが可能です。
from mecabwrap import do_mecab
out = do_mecab('人生楽ありゃ苦もあるさ', '-Owakati')
print(out)
#人生 楽 ありゃ 苦 も ある さ
入力する文字列が複数ある場合、ループを書く代わりにdo_mecab_vec
関数を用いることができます。
from mecabwrap import do_mecab_vec
ins = ['春はあけぼの', 'やうやう白くなりゆく山際', '少し明かりて', '紫だちたる雲の細くたなびきたる']
out = do_mecab_vec(ins)
print(out)
#春 名詞,一般,*,*,*,*,春,ハル,ハル
#は 助詞,係助詞,*,*,*,*,は,ハ,ワ
#あけぼの 名詞,固有名詞,地域,一般,*,*,あけぼの,アケボノ,アケボノ
#EOS
#やうやう 副詞,一般,*,*,*,*,やうやう,ヤウヤウ,ヨーヨー
#白く 形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,白い,シロク,シロク
#なり 動詞,自立,*,*,五段・ラ行,連用形,なる,ナリ,ナリ
#.....
あるいは、結果を一度に取得するのではなく、ジェネレータを用いて一文ごとに取得することも可能です。
from mecabwrap import do_mecab_iter
ins = ['春はあけぼの', 'やうやう白くなりゆく山際', '少し明かりて', '紫だちたる雲の細くたなびきたる']
for ans in do_mecab_iter(ins, '-F%f[6] | ', byline=True):
print(ans)
print("----")
#春 | は | あけぼの | EOS
#----
#やうやう | 白い | なる | ゆく | 山際 | EOS
#----
#少し | 明かり | て | EOS
#----
#紫 | だ | ちる | たり | 雲 | の | 細い | たなびく | たり | EOS
#----
実装の仕組み
このパッケージでは、subprocess ライブラリを用いてmecab
コマンドを実行し、結果を取得しています。
単純化すると、下記のようにしてPythonからmecab
コマンドを利用することができます。
from subprocess import Popen, PIPE
p = Popen(['mecab'], stdin=PIPE, stdout=PIPE)
o, e = p.communicate('すもももももももものうち'.encode())
print(o.decode())
#すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
#も 助詞,係助詞,*,*,*,*,も,モ,モ
#もも 名詞,一般,*,*,*,*,もも,モモ,モモ
#も 助詞,係助詞,*,*,*,*,も,モ,モ
#もも 名詞,一般,*,*,*,*,もも,モモ,モモ
#の 助詞,連体化,*,*,*,*,の,ノ,ノ
#うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
#EOS
パッケージでは、この仕組みをベースに、オプションへの対応や、文字コード回りの処理、Python2系への対応などを行っています。
処理速度について
厳密な比較はしていませんが、本パッケージは本家のmecab-python3
より遅いです。特に短い文の場合に差は顕著で、subprocess
のオーバーヘッドや諸々のエラー処理の比重が大きいためかと思われます。文が長くなるほど差は小さくなる傾向にあるようです。