LoginSignup
6
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-15

形態素解析ソフトウェアの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のオーバーヘッドや諸々のエラー処理の比重が大きいためかと思われます。文が長くなるほど差は小さくなる傾向にあるようです。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7