Main Contents
2006年11月15日
JUMAN Python バインディング (SWIG)
形態素解析器JUMANをPythonモジュールとして使うためのバインディングを作りました。
JUMANは-Sオプションをつけて起動すると、サーバーモードで動作します。サーバーモードのJUMANは他のプログラム(たとえばPython)とソケットで通信して、形態素解析の結果を返してくれます。大量の文書を解析するときなどは、ひとつの文書ごとにプロセスを起動するよりも効率がよいのですが、それでもソケット通信の分、速度が落ちてしまいます。
JUMANを、Cで書かれたPythonモジュールとしてラップしてやるバインディングさえ書ければ、このソケット通信の無駄をなくすことができます。
ちょうどSWIGの使いかたを学びたかったこともあって、バインディングを書いてみたのでした。サーバーモードのJUMANとソケット通信するよりは、15〜20%ほど速いようです。
SWIGの定義ファイル作成にあたっては、SWIGオフィシャルや83's : JumanのRubyバインディングを参考にさせていただきました。
モジュールは以下のように使います。
#!/usr/bin/python
# -*- coding: euc-jp -*-
import cJuman
S = [
'私の名前は中野です。',
'',
'これはJUMAN Pythonテストです。',
]
cJuman.init(['-B', '-e2'])
print cJuman.parse_opt(S, cJuman.SKIP_NO_RESULT)
結果は以下の通り。
私 わたくし 私 名詞 6 普通名詞 1 * 0 * 0 "漢字読み:訓 代表表記:私" @ 私 わたし 私 名詞 6 普通名詞 1 * 0 * 0 "代表表記:私" の の の 助詞 9 接続助詞 3 * 0 * 0 NIL 名前 なまえ 名前 名詞 6 普通名詞 1 * 0 * 0 "代表表記:名前" は は は 助詞 9 副助詞 2 * 0 * 0 NIL 中野 なかの 中野 名詞 6 人名 5 * 0 * 0 NIL @ 中野 なかの 中野 名詞 6 地名 4 * 0 * 0 NIL です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 24 NIL 。 。 。 特殊 1 句点 1 * 0 * 0 NIL EOS EOS これ これ これ 指示詞 7 名詞形態指示詞 1 * 0 * 0 NIL は は は 助詞 9 副助詞 2 * 0 * 0 NIL JUMAN JUMAN JUMAN 未定義語 15 その他 1 * 0 * 0 NIL \ \ \ 特殊 1 空白 6 * 0 * 0 NIL Python Python Python 未定義語 15 その他 1 * 0 * 0 NIL テスト てすと テスト 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:テスト" です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 24 NIL 。 。 。 特殊 1 句点 1 * 0 * 0 NIL EOS
SWIGの定義ファイルはこちら。 [cJuman.i]
これを使って、以下のようにしてモジュールを作成します。
tar xvzf juman-5.1.tar.gz cd juman-5.1 ./configure make make install cd lib cp ~/cJuman.i . swig -python cJuman.i gcc -c cJuman_wrap.c -I/usr/include/python2.4 gcc -shared *.o -o _cJuman.so
ちなみにUbuntuでは CC=/usr/bin/gcc-3.4と、明示的にgccのバージョンを指定しました。
余談。余暇を利用して書いていたのですが、がんばりすぎて体調をくずし、本業を休んでしまいました。本業が忙しかったことに加えて、SWIGでバインディングを書くのが意外と楽しく、睡眠時間を削ってしまったのでした。反省です。
- by
- at 2006年11月15日 23:15
- in Python