日本語の全文検索へアプローチしてみました

151 views
Skip to first unread message

tmatsuo

unread,
Jul 4, 2008, 7:05:36 PM7/4/08
to Google-App-Engine-Japan
松尾です。

みなさんお元気ですか。ここ 2-3 日、私はGAE 上で行う日本語の全文検索にト
ライしていました。完全では無いですが、だいたい動くものができた[1] ので
お知らせします。

1. http://ja-search.appspot.com/

ご興味のある方は、ご自由に試してみてください。ただし、著作権上問題があっ
たり、極端に性的な [少しなら良いです :-)] 文章を登録するのは控えていた
だけると嬉しいです。

ja-search では、好きな文章を「文章登録」しておき「検索」してみる亊がで
きますが、現時点では以下のような制限があります。

- あまり長い文章の登録はできません。
- 分かち書きの精度はあまり高くありません。
- また Index が 5000 個までに制限されたので、検索語はふたつまでに制限し
てあります。
- 検索語も分かち書きされますので、あまり複雑な検索語だと、検索語の後ろ
の方は無視されます(警告が出ます)。
- 時々勝手な都合によりデータストアをクリアする可能性があります。ご了承
ください。
- 現在はプログラムの配布をしておりません。そのようなご希望が多ければ配
布する亊も考えます。
- エラー処理を殆ど行っていないので、TraceBack を目にして不快な思いをす
る可能性があります。
- 画面がシンプルすぎるので、まるで 5 年前の Web アプリのような錯覚を味
わう亊を避けられません。
- ページング機能が無い上、誰でも投稿した文章を消す亊ができるので、あな
たの登録した文章がきちんと検索できているかを完全に確かめるすべがあり
ません。

西欧の言語では空白で単語を分かつ亊ができますので、全文検索のためのイン
デックス作成は比較的簡単で、羨ましい限りです。実際、GAE の SDK には
SearchableModel というクラスが用意されていて、全文検索ぽい亊ができるよ
うになっています。使い方を解説した Blog[2] エントリもあります。

2. http://appengineguy.com/2008/06/how-to-full-text-search-in-google-app.html

しかし残念ながら、現時点でこの SearchableModel が、日本語ではうまく動作
しません。日本語で全文検索するための効果的なインデックスを作成するには、
形態素解析などにより、分かち書きをしなければなりませんが、
SearchableModel はその点が考慮されていないからです。

Google の検索で使われている技術が使えれば楽なのですが、それはあまり期待
できないような気がします(確か Google は有償の形態素解析エンジンを使って
いたと思います)。そこで、自前で何とかしてみようと思いました。

ひとつの方法として、外部の形態素解析サービスを利用するやり方があります。
ですが、これは何だかくやしいし(私、変ですかね?)、ローカルコンピュータで
開発していて、オフラインになった時に動作しなくなります。また、アクセス
が増えた時に本当にスケールするのかといった疑問も出てきます。

そこで今回は、分かち書きをするために、もともと javascript で書かれた
tinysegmenter というソフトウェア[3] の python 版[4] を少し改変して利用
してみました。

3. http://chasen.org/~taku/software/TinySegmenter/
4. http://d.hatena.ne.jp/zegenvs/20080504

工夫したのは下記のような点です。

- Performance のために、TinySegmenter の初期化時に必要な正規表現を全て
コンパイルするようにして、main() の中でインスタンスを確保するようにし
ました。
- 括弧や空白などの扱いに不満があったので、それらは別途処理しました。
- IgnoreCase するために全ての Index は小文字にしました。

ja-search[5] をお試しになった上での、ご意見やお叱り、ご質問などあればお
気軽にメールしてくださいね。また、「私はこんなアプローチをしている」と
いうのもお聞きしたいです...

5. http://ja-search.appspot.com/

Happy coding :-)

-- Takashi Matsuo
Reply all
Reply to author
Forward
0 new messages