Sponsored Link

cmecab -- Mecab-Python高速バインディング

初出: 2007/7/14
Status: alpha

MecabのPythonバインディングの改良高速版です。
SWIGを使わず、Mecabの最低限の機能だけをPython-C APIで実装しました。
mecab-pythonバインディングの以下のメソッドを実装しています。

  1. createTagger
  2. Tagger.parseToNode
  3. Nodeからのデータ取得(surface, feature, posid, char_type, statのみ)
→もう少しくだけた紹介はこちら。

更新情報

→最新情報はこちらでどうぞ

ベンチマーク結果

1.5kb程度の同一の短いテキストを10000回形態素解析した結果を取得するのに、従来のmecab-pythonでは22.7[s]かかるところ、cmecab版では14.1[s]で処理できます。
(確認した環境: Mac OSX10.4 (Mem: 2GのMacbook上) )
ayu@~/work/cmecab% ./benchmark.py < testtext.txt
cmecabでのベンチマーク。
         3 function calls in 14.117 CPU seconds

   Ordered by: internal time, call count

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1   14.112   14.112   14.116   14.116 benchmark.py:34(main)
        1    0.004    0.004    0.004    0.004 __init__.py:1()
        1    0.001    0.001   14.117   14.117 benchmark.py:72()
        0    0.000             0.000          profile:0(profiler)


ayu@~/work/cmecab% ./benchmark.py -o< testtext.txt
オリジナルのmecab-pythonバインディングでのベンチマーク。
         10015 function calls in 22.668 CPU seconds

   Ordered by: internal time, call count

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1   12.971   12.971   22.667   22.667 benchmark.py:20(original)
    10000    9.669    0.001    9.669    0.001 MeCab.py:178(parseToNode)
        1    0.025    0.025    0.025    0.025 MeCab.py:7()
        1    0.001    0.001    0.001    0.001 MeCab.py:192(__init__)
        1    0.001    0.001   22.668   22.668 benchmark.py:70()
        1    0.000    0.000    0.000    0.000 MeCab.py:105(Node)
        1    0.000    0.000    0.000    0.000 MeCab.py:51(DictionaryInfo)
        1    0.000    0.000    0.000    0.000 new.py:5()
        1    0.000    0.000    0.000    0.000 MeCab.py:171(Tagger)
        1    0.000    0.000    0.000    0.000 MeCab.py:14(_swig_setattr_nondynamic)
        1    0.000    0.000    0.000    0.000 MeCab.py:82(Path)
        1    0.000    0.000    0.000    0.000 MeCab.py:30(_swig_getattr)
        1    0.000    0.000    0.000    0.000 MeCab.py:175()
        1    0.000    0.000    0.000    0.000 MeCab.py:173()
        1    0.000    0.000    0.000    0.000 MeCab.py:27(_swig_setattr)
        1    0.000    0.000    0.000    0.000 MeCab.py:187()
        0    0.000             0.000          profile:0(profiler)

ダウンロード等

cmecab-0.1.tar.gz(右クリックで保存)
ライセンスは、Apacheライセンスv2.0なので自己責任でご利用ください。
(上記ファイルはMercurialリポジトリのcloneにもなっています。)

動作に必要な環境

インストール

Mecab公式サイトに従って、Mecab, mecab-ipadic, (ベンチマーク比較するならmecab-python)をインストールします。
  1. mecabを、インストールしたらここに従って、mecabが正しく動くことを確認しましょう。
  2. [option] mecab-pythonを、インストールしたらここに載っているサンプルのPythonスクリプトで正しく動作するかを確認しましょう。
以上が準備できれば、以下のコマンドでインストールできます。
% python setup.py install

使用法

  1. cmecabオブジェクトを作る。
    cmecab(["mecabコマンドラインオプション"])
  2. cmecabオブジェクトのparseメソッドに解析対象テキスト(EUC)を与える。
  3. 結果は、結果オブジェクトのdictの配列として取得される。
解析結果は、解析結果オブジェクトを表すdictの配列として得られます。
    import cmecab
    
    # cmecabを用意。
    c = cmecab.cmecab()
    
    # 解析
    res = c.parse(body)   # この変数 body に、解析したテキスト(EUC)が入っているとする。

    # 結果取得
    SURFACE = "surface"
    FEATURE = "feature"
    POSID = "posid"
    for item in res:
        s = item[SURFACE]
        f = item[FEATURE]
        p = item[POSID]
        print "%s %d %s" % (s, p, f)
上記サンプルでは、surface, feature, posidしか取得していませんが、他に、stat, char_type も同様に格納されていますので解析結果としてそれらも利用できます。