CMigemo.exeの出力をsubprocessで取り込んで使おうかと思ったのですが、出力形式がVimスタイルやEmacsスタイルはあっても、今ひとつPythonのreに丁度いいような形ではなくてうまく引っかかってこなかったので、なにかないかとぐぐってみるとcmigemo 0.1.6というパッケージがありました。ctypesを使ってmigemo.dllをロードするようです。
Githubのプロジェクトページはこちら。moozさんという方が作られたようです。
ということで早速これを
pip install python-cmigemoして、組み込んでみました。
import cmigemo
migemo_dict = "c:/Apps/bin/dict/base-dict"
def compile_pattern(S):
"""return compiled pattern"""
logger.debug(S)
migemo = cmigemo.Migemo(migemo_dict)
ret = migemo.query(S)
logger.debug("regex=%s", ret)
return re.compile(ret, re.IGNORECASE)
なのですが、どうにもmigemo.dllをロードしてくれません。
ソースを追いかけてみると、
def _load_libmigemo(self, lib_name="migemo"):
import platform
if platform.system() == u"Windows":
libmigemo = windll.migemo
のところでエラーになっています。ということで、この部分を
def _load_libmigemo(self, lib_name="migemo"):
import platform
if platform.system() == u"Windows":
libmigemo = windll.LoadLibrary(find_library("migemo"))
として、find_library()に探させてみたら、migemo.dllをPATHの通ったところに置いておけば見つけてくれるようです。これで、C/Migemoが出力してきた正規表現を検索パターンにして
re.compile()してやればいろいろとできそうです。でもって結果ですが…。
もちろん辞書にもよると思いますが、思った以上に強力です。
"class" で検索をかけると、"Class" や "クラス" はもちろんのこと、"クラシック" とか "分類" などまでも引っかかってきます。検索時に
re.IGNORECASEを指定してやると、"CLASS" も "class" も "ClaSS" も引っかかってくるし、日本語もちゃんと受け取って、その場合にはちゃんと日本語での検索結果が上がってきます。 これは思った以上に快適です。
0 件のコメント:
コメントを投稿