Naoya Murakami
visio****@gmail*****
2014年 9月 12日 (金) 07:54:49 JST
村上です。 2014年9月10日 11:54 <morit****@razil*****>: > > 森と申します。 >> >> BM25の実装についてですがii.cの改造だけで済むかもしれません。 >> >> groongaの全文検索インデックスには、文書ID, セクション番号, TF, ポスティング情報の他に、 >> トークンと文書の組み合わせ毎に重み情報を格納することができます。 >> (索引を作るときにWITH_WEIGHTオプションを指定することで有効になります。) >> ここにBM25の文書長等のファクタを保存してはどうかと思いました。 >> 整数値なので工夫が必要ですし、ii.c内部のスコア計算ルーチンに手を入れる必要はあると思いますが、 >> 改造箇所は少なくて済みそうです。 >> >> また、現状では重み情報はgrn_ii_updspecという構造体を通して受け渡されるのですが、 >> tokenizer pluginから重みの値を引き継げるようにすれば、 >> pluginでスコアリング方式を柔軟に拡張する道が広がりそうです。 >> > 教えていただいた内容に基づいて、まずは、tokenizerからweightを 引き継げるように手を加えてみました。 https://github.com/naoa/groonga/compare/3a683b5724205f22f31687595fd06ff16fb54f95...5967b0bec8115027f60e47fe71f8c092fbffb4b6 grn_tokenizer_token_pushに重みを指定することにより、 トークンごとの重みを設定することができます。 ビルトインのトークナイザーでは全てのトークンの重み0にして いますので、現状、このパッチによる変化はありません。 これが使えると、トークナイザ―で各文書のトークンごとに重みを 柔軟に変更できて色々面白そうですね! たとえば、 「文書の長さに応じてトークンの重みを変化させる」、 「頻出しそうな一般的なワードの重みを低くする」、 「形態素解析をして名詞のみ重みを高くする」、 「トークンの文書中の出現位置で重みを変化させる(上の方を重くとか)」、 「特定のタグの周辺の重みを高くする(見出し、アンカーテキストとか)」、 等、文書構造に応じてトークンの重みを変更するなんてことができそうです。 しかし、WITH_WEIGHTをつけると、オフラインインデックス構築が できなくなるのですね。。 オフラインインデックス構築が動くのであれば、grn_token_buffer_ tokenizeのところにも、同様にtoken->weightをつければいけるか なぁと思っていましたが、db.cのbuild_indexのチェックを単純に 外してみただけでは動きませんでした。 https://github.com/groonga/groonga/blob/master/lib/db.c#L6323-L6325 非常に悩ましいところです。 トークナイザーでトークンの重みが設定できるようになると非常に 便利で嬉しいなぁと思うのですが、WITH_WEIGHTでは、オフラ インインデックス構築ができないのがちょっと残念な感じでした。。 以上です。