« 地震その後 | メイン | FinderをPath Finderに置き換える »

mysqlで日本語全文検索に挑戦!

もう少しでできそうなのでメモ。
しかし、一昨日から、やたらめったら肩から首にかけて痛みがあって、辛いっす。

実験環境:
OS X(10.2.8)
MySQL 3.23.55
PHP 4.3.4

日本語全文検索を可能とするアプローチとして、
1)対象文章を外部ファイルに保存して、Namazuを使って検索
2)Chasenを使って、分かち書きして、バイナリ化して、MySQLのFull Text を使う

の2通りある。
まず、1の方法は、Namazuのインストールでつまずいてしまい、インストールを解説してるサイトの通りやっても、うまく行かなかったのであきらめる。
なので、2のChasenを使う方法で試す。

Chasen は、OSX用のバイナリがあるので、コンパイルの必要はない。
OS X Chasen
パッケージ化されてるので、ダブルクリックでインストール完了。

次に、コマンドラインから、ちゃんと分かち書きできるかテスト。
sample.txtというファイルに、

ジョセフ・ジョースター!きさま!見ているなッ!

という文章をいれ保存し、コマンドライン(ターミナル)から、
% /usr/local/bin/chasen sample.txt

とやると、、、
ジョセフ ジョセフ ジョセフ 名詞-固有名詞-人名-名
・ ・ ・ 記号-一般
ジョー ジョー ジョー 名詞-固有名詞-人名-名
スター スター スター 名詞-一般
! ! ! 記号-一般
き キ きる 動詞-自立 一段 連用形
さま サマ さま 名詞-一般
! ! ! 記号-一般
見 ミ 見る 動詞-自立 一段 連用形
て テ て 助詞-接続助詞
いる イル いる 動詞-非自立 一段 基本形
な ナ だ 助動詞 特殊・ダ 体言接続
ッ 未知語
! ! ! 記号-一般

という結果になった。ちゃんと分かち書きできている。なぜ、分かち書きする必要があるかというと、そもそも、MySQLの全文検索が英語にしか対応しておらず、英文の場合は、原則として、単語と単語の間はスペースで区切られるため、単語レベルで一致してるかどうかを判別しやすいのだけれど、日本語の場合は、どこまでが単語なのかが、データから読み取れない。したがって、Chasenなど日本語を解析するプログラムを使って、まず分かち書きする必要があるのだっ!

Chasenは、Perlから使うインターフェースはあるようだけれど、PHPにはない。PECLにChasenのモジュールがあるようだけれど、面倒そうなのでパス。
スピードは要求しないので、popenからchasenコマンドを呼び出すことにする。
(データ更新時に分かち書きし、DBのフィールドを更新すればよいだけで、更新より、更新の頻度はそう高くないから)

で、次に、PHPからchasenを呼び出し、PHP内で分かち書きされたデータを取り扱う方法。


$msg = "諸行無常の響きあり。";
$fp = popen("echo $msg | /usr/local/bin/chasen -F '%m %y '","r");
if($fp){
$buff = fread($fp,2048);
pclose($fp);
}

chasenのパラメータの%m,%yは、出力フォーマットの指定で、ここでは、分かち書き+漢字カナ変換を指定している。
ちなみに↑のスクリプトを実行すると
諸行無常 ショギョウムジョウの ノ響き ヒビキあり アリ。 。

という結果を得られる。

次に、この結果を、MySQLのFull Text対象データとして使えるよう、16進数に変換する。
なぜ、16進数に変換するかというと、MySQLの全文検索は、英数字しか対象としないため、漢字・仮名など2バイトデータを検索してくれない。そこで、データを16進数に変換し、MySQLをだますのである。当然、検索時に、検索の元となるデータをあらかじめ16進数に変換し、SELECTに渡さなければならない。(めんどくせぇ

16進数への変換のしかたは、unpack()を使う。ここで少しハマった。

・・・続きを書きたいけど、力尽きたのでまた後日。

トラックバック

このエントリーのトラックバックURL:
http://www.ironhearts.com/diary/mt-tb-ih.cgi/156

コメントを投稿

2008年12月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最近のコメント

999 on 日々の記録: 4600Cを業務で使
uta on エラーコード -10660: はぁ〜なるほど。 あ
あんどりゅー on Firefoxでtableをdisplay:blockすると、幅がおかしくなる問題の対処: なるほど! 助かりま
小優 on 日々の記録: DELL4600Cで
よしぞう on 日々の記録: 4600C 表記の対
よしぞう on 日々の記録: 4600C 表記の対
on MySQL後で調べるメモ: DB接続後 目的のS
on 日々の記録: 「無くなった留め具」
on JavaScriptでクロスドメイン: >しかし、こういう小
junp on iMovieで静止画を取り込むと荒い: すいません困ってます

アーカイブ