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

ローカルなライブラリの検索で、日本語ファイル名が数千になってきているのです。
そうなるとあいうえお順で(というかエクスプローラーの一覧から)目視で探すのは限界だし、ディレクトリツリーを順番に見ていくのも大変なので、mktexlsrのようにファイル名のデータベースを作っておいてそのデータベースから探すのが早そう、ということでPythonでls-R作成スクリプトと検索スクリプトを作りました。

検索文字列はreモジュールで正規表現検索するので、一部だけでも適当に検索してくれます。ものすごく便利で自画自賛なんですが、検索したいファイル名(の一部)を入力するときにいちいち「かな漢字変換」をオン・オフするのは面倒だな、と思って、そういえばローマ字入力で日本語文書を検索できるヤツがあったな、と思い出し……。

NamazuじゃなくてKakasiじゃなくてMeCabじゃなくてなんだっけ……とグーグル先生にお尋ねして。

名前が思い出せなかったので、そういえばVimを2chブラウザにするヤツを作っていた人がいて、その人がなんかやってたような、なんだっけ、としばらく考えて検索して、"Chalice"をようやく思い出して。そこから "Migemo" にやっとたどり着きました。
Migemo自体はRubyで記述されているようで、かつすでにメンテされていないようです。もったいない。でも自分はRubyはわからないので、KaoriYaのKoronさんがCに移植されたC/Migemoを見てみようか、と。

Cで実装されてDLLにされているなら、Pythonから呼び出すのもできそうだし、Neovimにも組み込むことができそうです。まあ、後者は追々というとこで、とりあえずPythonから呼び出してローマ字で日本語検索!をやれれば楽ができるかなということで、ぼちぼちいじってみようと思います。

C/MigemoはGitHubで公開されていましたので、これをクローンして作業開始です。

README_j.txtには以下のようにVisualC++でのビルド方法が書かれています。
  (Windows + VisualC++)
  次のコマンドでRelease/内にmigemo.dllとcmigemo.exeが作成されます。
    > nmake msvc
  必要な外部プログラム、ネットワーク接続が揃っていれば
    > nmake msvc-dict
  で辞書ファイルをビルドできます。migemo.dswをVC++6.0で開き、ビルドする方法も
  あります。以上が終了すれば次のコマンドでテストプログラムが動作します。
    > .\build\cmigemo -d dict/migemo-dict
現在の環境はVisualC++を含んだVisualStudio 2019なので、そのままビルドと思いきややっぱりエラーが出ました。

幸い\compile\vs2003.slnファイルがあったので、それをVS2019で開くとそのままソリューションを変換してくれて一応プロジェクトは開けました。

そのままF6キーでビルドすると、"afxres.h"がインクルードできない、というエラーが出てビルドできません。
ぐぐってみると、"winres.h"に書き換えるといいよ、ということだったので仰せに従い無事ビルド終了。ついでにプロジェクトにx64ビルドも追加してこちらもビルド。一応どちらもDebugビルドにしておきました。


お次は辞書ファイルの生成ですが、Makefileを追いかけるとnkfではなくiconvやqkcを使っていました。qkcは今どうしてるんだろう…。

それはさておき。

現状ではnkfを使っているので、nmakeと同じことをコマンドプロンプトからそのままやりました。
dictディレクトリで、
$ for %i in (base-dict,SKK-JISYO.L,*.dat) do (
More? nkf -w %i > utf-8.d\%i
More? )
$ for %i in (base-dict,SKK-JISYO.L,*.dat) do (
More? nkf -e %i > euc-jp.d\%i
More? )
で辞書の文字コード変換は終了。


早速テストしてみます。cmigemoディレクトリに移動して、
$ compile\vs2003\x64\Debug\CMigemo.exe
migemo_open("./dict/migemo-dict")=000002AB8059C640
clock()=0.128000
QUERY: aho
PATTERN: (アホ|アホ|信天翁|阿[房呆]|あほ|aho|aho)
QUERY: clean
PATTERN: (clean|ク(レン(ザー|ジング)|リ(ンナップ|ー(ン|ナー|ニング)))|c(ェア[ンノネヌニナ]|ェア[ンノネヌニナ]|ぇあ[んのねぬにな]|lean))
QUERY: nihongo
PATTERN: (ニホンゴ|ニホンゴ|日本(語|極道史|合成ゴム)|にほんご|nihongo|nihongo)
QUERY: 日本語
PATTERN: 日本語
QUERY:
QUERY:
おお、返り値がそのまま正規表現として利用できるようなパターンになっています。なにげに信天翁(アホウドリ)が混じっているのが点数高いです。そして、かな漢字変換で日本語を食わせるとそのまま返ってきます。

これは結構使えるのでは……。 辞書の指定とかエンコードとか出力形式とかはどうなんだろうと見てみると、
$ compile\vs2003\x64\Debug\CMigemo.exe -h
cmigemo - C/Migemo Library 1.3 Driver

USAGE: compile\vs2003\x64\Debug\CMigemo.exe [OPTIONS]

OPTIONS:
  -d --dict <dict>      Use a file <dict> for dictionary.
  -s --subdict <dict>   Sub dictionary files. (MAX 8 times)
  -q --quiet            Show no message except results.
  -v --vim              Use vim style regexp.
  -e --emacs            Use emacs style regexp.
  -n --nonewline        Don't use newline match.
  -w --word <word>      Expand a <word> and soon exit.
  -h --help             Show this message.
また、辞書を指定するとそのエンコードで結果が返ってくるようです。
$ compile\vs2003\x64\Debug\CMigemo.exe -w aho
(アホ|アホ|信天翁|阿[房呆]|あほ|aho|aho)

$ compile\vs2003\x64\Debug\CMigemo.exe -d dict\utf-8.d\base-dict -w aho
(繧「繝斈菫。螟ゥ鄙-髦ソ[謌ソ蜻・|縺ゅ⊇|・・ス茨ス楯aho)

$ compile\vs2003\x64\Debug\CMigemo.exe -d dict\utf-8.d\base-dict -w aho | nkf -s
(アホ|信天翁|阿[房呆]|あほ|aho|aho)

$ compile\vs2003\x64\Debug\CMigemo.exe -d dict\euc-jp.d\base-dict -w aho
(・「・ロ|ソョナキイァ|ー、[ヒシハ|、「、ロ|」皀陬・aho)

$ compile\vs2003\x64\Debug\CMigemo.exe -d dict\euc-jp.d\base-dict -w aho | nkf -s
(アホ|信天翁|阿[房呆]|あほ|aho|aho)
受け取り側に都合のよいエンコードの辞書を使えば良さそうです。

0 件のコメント:

コメントを投稿

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

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