大家晚上好!所以,我有一个项目“用语言模型扩展lucene”,我试着添加2,3行到我的代码,像这样:上search.java
LMDirichletSimilarity similarity = new LMDirichletSimilarity(2000f);
indexSearcher.setSimilarity(similarity);
以及www.example.com上index.java
LMDirichletSimilarity similarity = new LMDirichletSimilarity(2000f);
config.setSimilarity(similarity);
但是我觉得没那么容易!也许我应该写一个算法什么的?如果你有答案的话,请帮助我谢谢^_^
1条答案
按热度按时间osh3o9ms1#
在
LMJelinekMercerSimilarity
中有一种语言模型相似度方法,其实现是:此方法是此公式的实现:
(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
,因此您可以派生该方法并实现您自己的方法。