Main Contents

2006年11月15日

JUMAN Python バインディング (SWIG)

このエントリーをはてなブックマークする このエントリーを含むはてなブックマーク | Save This Page (del.icio.us)

形態素解析器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でバインディングを書くのが意外と楽しく、睡眠時間を削ってしまったのでした。反省です。