こんにちは。なかじまんです。
3arrows という、いわゆる社内ツイッターを自社サービスで提供していて、AppEngine Java で
実現しています。-- 現在はαリリース
基本的には Yammer や Salesforce Chatter のクローンなのですが、OpenSocial をサポート
していて、マイクロブログと連携したアプリを開発&追加できる特徴があります。
3arrows - Enterprise Microblogging and Applications
http://www.3arrows.jp/
そのマイクロブログの全文検索を、形態素解析ライブラリ Gomoku で実現してみましたので、
簡単に方法などをシェアします。
3arrows アップデート! 多数のご要望を受けて、
マイクロブログをキーワード検索できるようにしました!
http://socialprise-association.blogspot.com/2011/02/3arrows_18.html
=== 基本方針 ===
形態素解析ライブラリ Gomoku の存在は、次のブログで知りました。
実際に試せる環境も用意してくださっていて、コーディングしなくても、おおよその使い勝手が
把握できます。
Twitterのタイムラインを分かち書きにする - GeekFactory
http://d.hatena.ne.jp/int128/20110129/1296330196
基本的な方式は、マイクロブログへの投稿を Gomoku で形態素解析し、その形態素をエンテ
ィティのコレクションとして格納し、クエリでたたくというものです。よくあるパターンです。
=== 格納 ===
格納する形態素は、主品詞、副品詞で吟味しています。つまり、一般的に検索するだろう語の
みを格納しています。また、一部、形態素間の関係を見て、複数の形態素をひとつの語として
格納するということもしています。
また、#hashtag @username http(s)://... などは、別途、正規表現などで抜き出し、ひとつの
語として格納しています。あらかじめハッキリできる語は、別途抜き出すというハイブリット辞書
方式です。
結果、マイクロブログへの投稿は500文字上限なので、格納される語はそれほど多くなりませ
ん。数十語オーダーです。
=== 検索 ===
検索語は、だいたんにキーワードを1語に絞っています。
検索語に #hashtag @username http(s)://... が含まれるときは、そのまま完全一致でコレク
ションをマッチさせます。
それ以外のときは、検索語を Gomoku で形態素解析して、前述どおり吟味した語の内、はじ
めに出現する1語の完全一致でコレクションをマッチさせます。
=== 実用性 ===
Gomoku の Spin-up は 2,000ms 前後のようです。初期化は Warmup リクエストに含めて
いるので、うまく機能すれば、ユーザの遅延はほとんどないです。もしも間に合わないときは、
ユーザが 2,000ms の遅延を食らうことになります。
Gomoku の形態素解析は、CPU を使います。200字前後で黄色となり、400文字前後で赤
色になります。ただし、これは投稿時なので、参照に比べればずっと少ないケースなので、
今のところ問題なしと判断しています。また、検索クエリに対する形態素解析もしますが、
対象の文字数がぐっと少ないので CPU はあまり使われません。
検索の精度は、1語マッチなので疑問を持つ方も多いかと思いますが、
#hashtag @username http(s)://... で検索するときは、そもそも完全一致でよいので、ユー
ザの期待どおりです。
それ以外のときも、形態素解析の吟味後の先頭語を使うため、ヒットし過ぎるときはあります
が、入力した語から何かがヒットして、検索結果にその語が含まれているので、それほどネ
ガティブな印象は持ちにくいと今は結論付けています。
ただし AND 検索ができないので、さらなる絞り込み検索ができないのが最大の欠点です。
ですので、検索ボックスを意図的に小さくして、心理的に入力字数を抑制しています。
また、検索後は、検索ボックスの内容をクリアして、さらに検索語を追加するという流れを
意図的に切っています。
=== 結論 ===
技術的にみると、まったく使えないという判断をされそうですが、思いのほか期待どおりヒッ
トします。使っていく内に、不満が出てくるかもしれませんし、もしかすると、ユーザがコツ
を掴んで慣れてしまうかもしれません。
まだ、検索精度のチューニングの余地はありますので、何かよい方法が見つかりましたら
またシェアします。
何かの参考になれば幸いです。
# Fulltext Search がアナウンスされていましたが、日本語インデックスのサポートがどの
# くらいになるのか、少し心配&期待大です。