検索結果のランク付け(スコアリング)を実装

伏字検索○○○

懸案だった検索結果のランク付け(スコアリング)を実装しました。

変更前まではヒットした文字列をランダムに回答していました。
それはそれで突っ込みどころがあり、面白いという意見も頂けたのですが。

ランク付けルールについては以下のようにしました。

「○ジョージ」で検索した場合

所ジョージ
柳ジョージ
聖ジョージ

が検索結果として挙がります。

自分の頭の中では「所ジョージ」が浮んでいました。
従って検索結果も「所ジョージ」を選んで欲しいところです。

安易な手法としてはGoogleの検索結果でヒットした数順に
並べてしまうことです。

試しにやってみましょう。

所ジョージ 26,300,000件 1位
聖ジョージ 469,000件 2位
柳ジョージ 185,000件 3位

所ジョージぶっちぎり。さすがGoogle先生。さすが所さん。
でも「聖ジョージ > 柳ジョージ」なんですか。意外です。

しかし100万語超あるデータの検索数を予め検索し保存しておくのは
現実的ではなさそうです。
いつデータを更新すればいいのかという問題も発生します。

1秒に1回検索しても11.5日かかります。それ以上に迷惑もかかります。

悩んだ結果以下の方法を思いつきました。

キーワード加点方式と勝手に呼びます。

基本的な考えは以下の通りです。

という考え方です。

具体的な加点方法は

としました。足し算だけなので実装は簡単です。

そうなるとジョージ軍団の得点は以下のようになります。

所ジョージ 3点
柳ジョージ 3点
聖ジョージ 2点

所ジョージ柳ジョージに差がありません。困りました。
加点要素を増やしてみました。

  • 文章を解析し、単語が現れた場合 1回に付き +1点

としました。文章を食わせて学習させるわけです。
BLOG等の文章を大量に食わせたいのですが手元に無いので
Wikipediaの情報を食わせてみました。

実際に点数を確認してみましょう。

所ジョージ 33点
柳ジョージ 8点
聖ジョージ 2点

なかなかよさそうです。

なおスコアリングは検索時ではなく、データベース作成時に
行なっています。
検索速度を落とさないようにする為です。

○○理論だとかもうちょっと情報工学的なアプローチのほうがウケが良いかもしれません.

小室○○
東○大学
伊集院○
品川○○

如何でしょうか、頭に浮かんだ言葉と検索結果は一致したでしょうか。

ご利用くださいまし.