日本語検索を「かな漢字変換」を通さずにやる。その2

それではPythonからC/Migemoを使ってみます。

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

コメントを投稿

Vimの補完プラグインをインストール。その4

Vimの補完プラグインをインストール。その3 で、 ddc-tabnine が使えそうです、などと書いたのですが、早速やってみました。 まず、tabnineのバイナリを用意しないといけません。がどうにもTabNineのサイトがわかりにくいので、 tabnine-nvim にあるダ...