Lucene根据匹配项的数量自定义相似度

时间:2015-11-08 22:30:30

标签: java lucene

我使用Lucene计算查询字符串与语料库中每个文档之间的匹配项数。

例如,

给定的查询“a b c d d”

文件1:“a b”

文件2:“c c”

我希望相似度分数为:

文件1是2

文件2是1

起初,我认为这是一项简单的任务,因为我可以覆盖DefaultSimilarity(),如下所示:

Similarity similarity = new DefaultSimilarity() {

        @Override
        public float lengthNorm(FieldInvertState state) {
            return 1.0f;
        }

        @Override
        public float coord(int overlap, int maxOverlap) {
            return 1.0f;
        }

        @Override
        public float idf(long docFreq, long numDocs) {
            return 1.0f;
        }

        @Override
        public float queryNorm(float sumOfSquaredWeights) {
            return 1.0f;
        }   

        @Override
        public float tf(float freq) {
            return freq == 0f ? 0f : 1f;
        }
};

这样,我的相似度得分可以解释为(伪代码):

Similarity(query, document):
    score = 0
    for each term t in my query:
         if document contains term t:
              score += 1
    return score

不幸的是,这不是预期的行为!

从我之前的例子开始,我添加了第三个文档:

给定的查询“a b c d d”

文件1:“a b”

文件2:“c c”

文件3:“d e g”

相似度分数为:

文件1是2(1匹配a,1匹配b)

文件2是1(1匹配c)

文件3是2! (1匹配d,另一个匹配同一个d!)

这是错误的。该查询和文档3的相似性得分为1。

我的问题是如何在Lucene中实现这种相似性类?我可以通过编写自己的Java代码轻松完成,但我有大约2000个独特查询和大约10,000,0000个文档。我需要利用Lucene索引。

提前致谢! 干杯!

0 个答案:

没有答案