0

各位晚上好!所以,我有作为项目“使用语言模型扩展 lucene”,我尝试在我的代码中添加 2、3 行,如下所示:在 search.java

LMDirichletSimilarity similarity = new LMDirichletSimilarity(2000f);  
indexSearcher.setSimilarity(similarity);

在 index.java 上

LMDirichletSimilarity similarity = new LMDirichletSimilarity(2000f);
config.setSimilarity(similarity);

但我不认为这很容易!也许我应该写一个算法之类的?有答案的请帮帮我谢谢^_^

4

1 回答 1

1

里面有个语言模型相似度方法,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,所以你可以派生那个方法并实现你自己的。

于 2020-06-17T05:12:14.230 回答