我试图修改Lucene的默认相似度得分如下。假设每个文档以及查询都包含唯一的单词。查询q和文档d的自定义相似度得分应为com(d,q)/(size(d)+size(q))
。其中com(d,q)
是两者中出现的术语数量(请注意,查询和文档中没有重复的术语)。 size(d)
和size(q)
是每个中的术语数量。我们使用WhiteSpaceAnalyzer
。我们假设术语和文档频率为1,术语不会提升。
答案 0 :(得分:2)
要应用自己的评分,您需要将Similarity
设置为您自己的实施。您将需要在computeNorm方法中处理sive,该方法存储在索引时。其余的应由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))
哪个应该可以解决你想要的问题。
我非常强烈地感觉到你把婴儿扔出洗澡水。