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

Back to archive index

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では、オフラ
インインデックス構築ができないのがちょっと残念な感じでした。。

以上です。



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