Zend_Search_Lucene用日本語解析器

以前、Zend_Search_Luceneには日本語で使えるアナライザーが入っていなくて使い物にならない、と書きましたが、1.5.2でも状況は同じです。

話にならないので、ちょっとした息抜きに日本語テキスト用アナライザーを作ってみました。今度のはそれなりに使い物にもなるかと思います。

中身は、Apache Lucene Java版のCJKAnalyzerに近いもので、CJKAnalyzerがbi-gramなのに対してuni-Gram方式です。
英語等のシングルバイト文字の時には空白区切りで索引に追加しますが、
日本語等のマルチバイト文字の時には1文字ずつ索引に追加します。日本語以外のマルチバイト文字の動作は確認していませんが。
ただし、句読点と一部の記号は索引追加文字から除外しています。

まずそれぞれの文字列がどのように索引に入るかを下記のようなコードで確認できます。
下の場合、?は記号扱いのため索引にはいりません。

$text = '日本でWindows 95が発売されたのはいつでしょう?';
$analyzer = new Twk_Search_Lucene_Analysis_Analyzer_Common_Utf8MbcsUnigram();
$a = $analyzer->tokenize($text, 'UTF-8');
print_r($a);

索引の作り方と検索の仕方は、http://nonn-et-twk.net/twk/node/153をご参照ください。1文字ずつ区切るのは解析器が計らってくれるので、索引を作る側、検索する側は考慮しなくて大丈夫です。

さて、肝心のファイルですが、CodeReposから取得できます。
Twk_Search_Lucene_Analysis_Analyzer_Common_Utf8MbcsUnigram を参照

検索できれば良いやで作っているので、速度は速くないのと、uni-gramの性質上索引も大きめになりますが、とりあえず検索できるようになったはずなので、試してみてください。

ちなみに、10000件くらい追加したら変な例外が出てきたりするかもしれませんが、それは解析器のせいではないです。

形態素解析と組み合わせたりすれば色々できるかもしれませんが、仕事もしなくては行けないので今回はこの辺にて。
どなたか勝手にCodeReposいじってくれると嬉しいです。
興味のある方は、まずはヘルプの「独自のテキスト解析器」
の項目を参照すると良いかと思います。

恒例クイズ。今度はちょっと難しいかも?

クイズ研Luceneのクイズ

Trackback URL for this post:

http://nonn-et-twk.net/twk/trackback/210
from twk @ ふらっと on 月, 2008-06-30 07:03

先週末行った第34回PHP勉強会でkaz_29さんがPostgreSQLの日本語全文検索のお話をされていました。
私はメインでMySQLを使っていますが、MySQLだとまたやり方が違ったり、DBにモジュールを追加す

0