1

我正在尝试修改 Lucene 的默认相似度分数,如下所示。假设每个文档以及查询都由唯一的单词组成。我们对查询 q 和文档 d 的自定义相似度得分应该是com(d,q)/(size(d)+size(q))。两者中出现的术语数量在哪里com(d,q)(请注意,查询和文档中没有重复的术语)。size(d)并且size(q)是每一项中的项数。我们使用WhiteSpaceAnalyzer. 我们假设词条和文档频率为 1,并且词条没有被提升。

4

1 回答 1

2

要应用您自己的评分,您需要将 设置Similarity为您自己的实现。您需要在 computeNorm 方法中处理 sive,该方法存储在索引时。其余的应由coord. 您可以免费扩展TFIDFSimilarity并获得很多东西,让您不必担心设置自己的SimScorers 等等。你只需要删除很多功能。请记住,这将是每个文档中存储的额外信息

所以,像:

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 回答