Lucene のデフォルトの類似度スコアを次のように変更しようとしています。各ドキュメントとクエリが一意の単語で構成されていると仮定します。クエリ q とドキュメント d のカスタム類似度スコアは ですcom(d,q)/(size(d)+size(q))
。com(d,q)
は、両方に出現する用語の数です (クエリとドキュメントに重複する用語がないことに注意してください) 。size(d)
とsize(q)
はそれぞれの項の数です。を使用しますWhiteSpaceAnalyzer
。用語とドキュメントの頻度は 1 であり、用語はブーストされていないと仮定します。
質問する
420 次
1 に答える
2
Similarity
独自のスコアリングを適用するには、独自の実装にを設定する必要があります。インデックス時に格納される computeNorm メソッド内で ive を処理する必要があります。残りは で処理する必要がありますcoord
。拡張TFIDFSimilarity
して無料で多くのものを入手できるため、独自SimScorer
の のセットアップなどについて心配する必要がなくなります。多くの機能をスタブ化する必要があるだけです。すべてのドキュメントに保存される余分な情報になることに注意してください
したがって、次のようなものです:
class MySimilarity extends TFIDFSimilarity {
// 1/size(d) where size(d) is the number of terms in the Field,
// rather than the Document (which doesn't really make sense)
computeNorm(FieldInvertState state, Norm norm) {
norm.setByte(encodeNorm(1 / state.getLength())); // encodeNorm loses a great deal of precision, FYI.
}
// 1/size(q)
float coord(int overlap, int maxOverlap) {
return 1 / maxOverlap;
}
float idf(long docFreq, long numDocs) {
return 1
}
float queryNorm(float sumOfSquaredWeights) {
return 1;
}
float scorePayload(int doc, int start, int end, BytesRef payload) {
return 1;
}
float sloppyFreq(int distance) {
return 1;
}
float tf(float freq) {
return 1;
}
float tf(int freq) {
return 1;
}
}
これは、次の行に沿ってスコアを計算する必要があると私は信じています。
(1 / size(q)) * ∑ (1 / size(d))
あなたが探しているものに合うはずです。
でも、赤ちゃんをお風呂のお湯と一緒に捨てているような気がします。
于 2013-04-24T16:20:58.580 に答える