Namazuを改造した・・・けど疲れた

某ログの検索のために Namazu を使ってるけど、こいつの検索精度がいまいち。ってことで、分かち書きのためのエンジンの入れ替え作業をしたわけだけど、その後かなりぐだぐだになってしまったので、その成り行きをつらつらと。

Namazu は主に日本語を対象にした全文検索システムで、PDFも検索対象にすることができるようになっていたり、(インデックス作成が遅いものの)高速に検索できるあたりが特徴。で、英語の場合は単語がスペースで区切られてるんで境目が明らかだけど、日本語の場合はそうじゃないんで、日本語の全文検索をするためには文章を単語に分ける「分かち書き」という処理が必要になる。Namazu は、この分かち書きの処理に、Kakasi, ChaSen, MeCab から選べるようになっている。Kakasi は純粋に分かち書き用のエンジンだけど、ChaSen/MeCab は品詞推定やらまで行う形態素解析のエンジンですな。で、Namazu はデフォでは Kakasi を使っていて、かつたいていの人は Kakasi を使っていると言うことすら知らなかったりして、でKakasi による分かち書きの精度がいまいちだったりすることもあったりで、結果的に Namazu の検索精度にまで響いてしまうと。

というわけで、Namazu が使う分かち書きエンジンを Kakasi から MeCab へ入れ替えてみた。入れ替え作業は「Namazu MeCab」とかでググれば見つかるし、ほとんど tar.gz 解凍して ./configure && make && make install だけなんで省略。。唯一、/usr/lib と /usr/local/lib の違いで *.so な sharedライブラリの依存関係で実行時エラーになったけど、適当に cd /usr/lib; ln -s /usr/local/lib/libkakasi.so.2.1.0 とかして手抜き対処した。本当は etc/ld.so.conf あたりに追記するのがいいんだろうけど。

で、入れ替えてみた感想が、うーんなんかいまいち。確かに動詞や複合語なんかで精度が上がってるんだけど、ひらがなだけの文章に弱すぎ。特に、最近のネット用語やらネット的なくだけた表現(「2ちゃん語」といった方がニュアンス近いかも)がぼろぼろ。実は、Kakasi はひらがなだけの箇所は、頑張って分かち書きするようなことはせずに、N-gram方式だけで対処しているとかいうこともあって、結果的に Kakasi も MeCab も一長一短。というのもあって、方針変更。エンジンを排他的に使うんじゃなくて、複数エンジン使って、より検索にヒットしやすくすればいいんじゃね?と。もともとの検索対象がせいぜい100MBくらいのテキストなので、検索の適合率は下がってもいいや、再現率が上がればいいやという割り切りで。

で、早速この複数エンジンによる分かち書きを導入すべく Namazu の改造を始めたわけだけど・・・ここが意外にむずかった。というより、はまった。。

Namazu は、インデックスを作る "mknmz" の Perl スクリプトと、検索を行う "namazu" (or namazu.cgi) のバイナリのと大きく2種類に分かれている。で、今対象にするのは分かち書きなので、"mknmz" の中のこいつがさらに使っている外部スクリプトの "wakati.pl" (/usr/local/share/namazu/pl) で、特にその中の "wakatize_japanese_sub" サブルーティンです。ぱっと見た感じ "return @tmp" してる @tmp 配列に2つのエンジンの分かち書き結果を入れればいいように見えるけど・・・そう思いこんで改造作業にはまった。結論から言うと、もともと $$content は \x7f を特別な区切り文字として使った構造化された変数になっていて、この構造を意識した結果を @tmp に入れていないとうまく動いてくれない。どうも重み付きでファイル名やらを特別処理するために使ってる模様。気づいてしまえばたいしたことないけど、そんな構造だと言うことに気づくまでにふて寝含め1週間以上かかってしまいました。。できたパッチ「namazu_kakasi_mecab.diff」

今回の改造作業を通じて mknmz のソースを結構読んだけど、うーんなんかこう、ムリに拡張したような跡が結構あったなぁと。euc-jp じゃないと処理できないようなとこもあったりして、これをさらに拡張するのは厳しいだろうなぁと。10年くらい前は、全文検索といえば Namazu みたいな感じだったけど、ここ最近はコミュニティもあまり活発じゃなさそうだし、もはやこれまでなのかなぁと。

やっぱ時代はもうSenna?でもMySQLコンパイルするとかめんどいやん、他の全文検索のいいのないの?

このブログ記事について

このページは、らるるが2009年8月11日 04:13に書いたブログ記事です。

ひとつ前のブログ記事は「デジタル家電はしょせんは家電だ」です。

次のブログ記事は「みんな「白いクスリ」が大好きだよなぁ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0