里面有个语言模型相似度方法,LMJelinekMercerSimilarity
实现是:
protected float score(BasicStats stats, float freq, float docLen) {
return stats.getBoost()
* (float) Math.log(1 + ((1 - alpha) * freq / docLen)
/ (alpha * ((LMStats) stats).getCollectionProbability()));
}
这个方法是这个公式的实现:(1-lambda) * P(w|d) + lambda * P(w|Collection)
如果你看上面的方法和你看到的语言模型公式,它们之间有一点区别。这是因为 Lucene 将表达式lambda * P(w|Collection)
从语言模型公式中分解并创建了一个新公式:lambda * P(w|Collection) * ( ( (1-lambda) * P(w|d) / lambda * P(w|Collection) ) +1 )
然后它删除了lambda * P(w|Collection)
因为排名(它不影响排名)并且只是计算( ( (1-lambda) * P(w|d) / lambda * P(w|Collection) ) +1 )
。你可以看到它类似于上面的方法。但有一点区别,那就是对数。在 IR 社区中,他们使用对数,因为它易于处理且易于由计算机评估。所以最后的陈述是:
log ( ( ( (1-lambda) * P(w|d) / lambda * P(w|Collection) ) +1 ) )
上面的方法是一个protected
,所以你可以派生那个方法并实现你自己的。