我正在尝试修改 Lucene 的默认相似度分数,如下所示。假设每个文档以及查询都由唯一的单词组成。我们对查询 q 和文档 d 的自定义相似度得分应该是com(d,q)/(size(d)+size(q))
。两者中出现的术语数量在哪里com(d,q)
(请注意,查询和文档中没有重复的术语)。size(d)
并且size(q)
是每一项中的项数。我们使用WhiteSpaceAnalyzer
. 我们假设词条和文档频率为 1,并且词条没有被提升。
问问题
420 次
1 回答
2
要应用您自己的评分,您需要将 设置Similarity
为您自己的实现。您需要在 computeNorm 方法中处理 sive,该方法存储在索引时。其余的应由coord
. 您可以免费扩展TFIDFSimilarity
并获得很多东西,让您不必担心设置自己的SimScorer
s 等等。你只需要删除很多功能。请记住,这将是每个文档中存储的额外信息
所以,像:
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 回答