我在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的实现与The Language Model有所不同。
语言模型实际上计算查询的概率(在指定的上下文中),并且使用JM模型:(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)
不影响最终排名,因此lucene忽略了该因素并获得了以下表达式:
( ( (1-lambda) * P(w|d) / lambda * P(w|Collection) ) +1 )
在“信息检索趋势”中,我们希望使用对数刻度功能。因为它们易于处理,这就是lucene使用log函数的原因:
log ( ( ( (1-lambda) * P(w|d) / lambda * P(w|Collection) ) +1 ) )
希望这种解释对您有所帮助!
关于java - Lucene中LMJelinekMercerSimilarity方法中使用的LM公式的解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39405212/