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 件のコメント:
コメントを投稿