我在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/

10-09 05:42
查看更多