[groonga-dev,02758] Groongaのスコアリングの拡張性について

Back to archive index

Naoya Murakami visio****@gmail*****
2014年 9月 8日 (月) 12:40:08 JST


村上と申します。

現在、Groongaでは、クエリごとにマッチする出現数をカウントアップ
させるスコアリング方式をとっていると思います。

これは高速であるものの、クエリごとの重要度は考慮されません。
どの文書にもたくさん含まれているクエリと、どの文書にもあまり
現れないクエリが同じ重みでカウントアップされます。

こうすると、頻出用語の方のカウントが高くなりすぎて、重要語句が
含まれるレコードの順位がかなり下の方に埋もれることになります。

重みをあらかじめ計算しておけば、クエリ関数でクエリごとの重みを
変更したり、adjusterで調整することもできますが、組み立てが大変
でちょっと容易ではありません。

scorerで調整しようものの、scorerでいじれるものは、複数のクエリ
が合算されたスコア値のみで、クエリごとのTFがいくつだったのかは
知ることができません(ですよね?)。

scorerの段階で、クエリごと(もしくはトークンごと)のTF値とDF値(概算
でも良い)と望ましくは文書長(ドキュメントに含まれるトークン数)が
取れると、ランキングにTF・IDFや文書長正規化が行えて嬉しいです。

SQLiteのFTSではmatchinfoという関数を利用することにより簡単に
スコアリングを調整することができるようです。

http://www.sqlite.org/fts3.html#matchinfo

たとえば、以下のように、簡単にBM25(TF・IDFに文書長正規化を考慮
させたようなもの)の関数を実装することもできるみたいです。

https://github.com/rads/sqlite-okapi-bm25/blob/master/okapi_bm25.c

速度的なデメリットもあるでしょうし、将来的な話で全然いいのですが、
今後の開発で考慮していただけると嬉しいです。
(すでに考慮はされているものの、開発者の中で欲しい人がいないので
実装されないのかもしれませんが。。)

とりあえずは、色々取れる情報が少なくて適当な感じですが、grn_ii_select
を独自でパッチして対応してみようと思っています。

以上です。



groonga-dev メーリングリストの案内
Back to archive index