我使用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索引。
提前致谢! 干杯!