Sponsored Link


傀儡師のプログラミング日記

CaboCha を ctypes で使ってみようとして玉砕 (2003/11/29)

日本語係り受け解析器 CaboCha/南瓜: Yet Another Japanese Dependency Structure Analyzerを Python から使うのに,ctype から使えるようにしてみようかと思いました。以下は,その玉砕過程です。

Yasushi Masudaさんが 日本語訳されているのをまず参考に大体の使い方を見まして,MeCabLib というのも公開されているので,これを参考にやってみることにしました。MeCab C ライブラリ仕様と,CaboCha C ライブラリ仕様と,を見比べて,mecab_new → cabocha_new, mecab_new2 → cabocha_new2 と,このあたりは,単純に置換していくだけで同じようなものだからいけるそう。cabocha_sparse_tostr, cabocha_sparse_tostr2, cabocha_sparse_tostr3, strerror,destroy も MeCabLib からぱくってみます。MeCab の方は n-best やlock, unlockといった関数がないので,これらは削除してしまいます。さくさくと編集して試してみたのですが,エラーでダメでした。

ということで Python のコマンドプロンプト上で手打ちでひとつひとつ試してみることにしました。まずは,MeCab でやってみます。

from ctypes import *
lib=cdll.LoadLibrary("c:/Program Files/mecab/bin/libmecab.dll")
getattr(lib, "mecab_new2")
lib.mecab_new2.restype = c_void_p
lib.mecab_new2.argtypes = [c_char_p, c_char_p]
getattr(lib, "mecab_sparse_tostr")
lib.mecab_sparse_tostr.restype = c_char_p
m = lib.mecab_new2('-a', 'c:/mecab/bin/libmecab.dll')
print lib.mecab_sparse_tostr(m, "今日は元気だ。")

>>>from ctypes import *
>>>lib=cdll.LoadLibrary("c:/Program Files/mecab/bin/libmecab.dll")
>>>getattr(lib, "mecab_new2")
<ctypes._CdeclFuncPtr object at 0x008D6CE8>
>>>lib.mecab_new2.restype = c_void_p
>>>lib.mecab_new2.argtypes = [c_char_p, c_char_p]
>>>getattr(lib, "mecab_sparse_tostr")
<ctypes._CdeclFuncPtr object at 0x008D6D40>
>>>lib.mecab_sparse_tostr.restype = c_char_p
>>>m = lib.mecab_new2('-a', 'c:/mecab/bin/libmecab.dll')
>>>print lib.mecab_sparse_tostr(m, "今日は元気だ。")
今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
元気    名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
。      記号,句点,*,*,*,*,。,。,。
EOS
ちゃんと動くので,基本的な ctypes の使い方は,一応理解できた?ようです。ここで同じようにして,CaboCha を使ってみます。
from ctypes import *
lib=cdll.LoadLibrary("c:/Program Files/cabocha/bin/libcabocha.dll")
getattr(lib, "cabocha_new2")
lib.cabocha_new2.restype = c_void_p
lib.cabocha_new2.argtypes = [c_char_p, c_char_p]
getattr(lib, "cabocha_sparse_tostr")
lib.cabocha_sparse_tostr.restype = c_char_p
c = lib.cabocha_new2('-f1', 'c:/Program Files/cabocha/bin/libcabocha.dll')
print lib.cabocha_sparse_tostr(c, "今日は元気だ。")
そうすると
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
WindowsError: exception: access violation
と落ちてしまいます...。同じようなことをやっているので,基本的には間違っていないと思うのですが,エラーになる理由が良く分かりません。ctypes なら簡単に使えると思ったので,試してみたのですが,なぜエラーになるか分からないので,あっけなく玉砕です。素直に Visual Studio .NET C++ インストールして,CaboCha に付属している標準の Python ライブラリ使うことにしようかと思います(^^;;
Blog

TinyBlog について

傀儡師の館(楽天)

pyblosxom テスト中

自然言語処理について

人工無能について

Python について

Copyright (c) 2003, Kugutsushi