2009年9月24日木曜日

Python ctypes からmecabを使う例

PythonとC/C++のインターフェイスとして有望だと思ったctypesとboost.python。
まずはctypesを利用する例。
もちろん自分でC/C++で書いた関数を呼び出すのでも構わないが、既存のCライブラリをPythonから利用したいというシチュエーションも多いため、まずはそういう例。

というわけで、形態素解析ソフトとして良く使われているmecabのライブラリをPythonから使えるようにしてみる。
ただし、実はmecabのPythonインターフェイスはmecabの開発元から配布されている事に気付いたので、ほんの触りだけ。
ctypesの使い方がなんとなく分かると思う。
要するにシェアードライブラリをそのまま読み込み、その中の関数を呼び出してくれる。
PythonとC間で引数や戻り値を正しくやりとりするために、必要に応じてその型情報を設定してやる必要がある。

ちなみにtext.txtには、インストールしてあるmecab用辞書に合わせて文字コードをUTF-8にした日本語文章が入っている。
他の文字コードの場合には適宜変換が必要になる。
また、unicode文字列を渡すことはできない。(segfaultになる)


import ctypes as C

MECAB_LIB_PATH = '/usr/lib/libmecab.so.1'
libmecab = C.CDLL(MECAB_LIB_PATH)
libmecab.mecab_sparse_tostr.restype = C.c_char_p
libmecab.mecab_version.restype = C.c_char_p
libmecab.mecab_strerror.restype = C.c_char_p

class MyMecab:

def __init__(self, option=''):
self.mecab = libmecab.mecab_new2('mecab ' + option)

def __del__(self):
libmecab.mecab_destroy(self.mecab)

def parse(self, text):
return libmecab.mecab_sparse_tostr(self.mecab, text)

def version(self):
return libmecab.mecab_version()

def error_message(self):
return libmecab.mecab_strerror(self.mecab)

if __name__ == '__main__':
filename = 'test.txt'
text = file(filename).read()
mecab = MyMecab()
result = mecab.parse(text)
print result

0 件のコメント: