Python
mecab

MeCabのPythonラッパーを書いた話

More than 1 year has passed since last update.

形態素解析ソフトウェアのMeCabをPythonから使うパッケージとしては、mecab-python3nattoなどがよく使われていますが、どうもWindows環境へのインストールで壁にぶつかることが多いようです。

そこで、WindowsでもUnixでも pip コマンド一発でインストールできるPython用のMeCabラッパーを作成しました。PiPyに登録してあるので、

pip install mecabwrap

でインストール可能です。また、Python2系、3系の両方でテストしています。ソースコードはGitHubに置いています。
なお、MeCabはすでにインストールしてあることが前提です(Windowsなら公式サイトのインストーラを利用するのが簡単だと思います。Unixなら、brewapt-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のオーバーヘッドや諸々のエラー処理の比重が大きいためかと思われます。文が長くなるほど差は小さくなる傾向にあるようです。