我如何用一个语言模型扩展Lucene?

vx6bjr1n  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(222)

大家晚上好!所以,我有一个项目“用语言模型扩展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);

但是我觉得没那么容易!也许我应该写一个算法什么的?如果你有答案的话,请帮助我谢谢^_^

osh3o9ms

osh3o9ms1#

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,因此您可以派生该方法并实现您自己的方法。

相关问题