java - 如何使用语言模型扩展 Lucene?
问题描述
各位晚上好!所以,我有作为项目“使用语言模型扩展 lucene”,我尝试在我的代码中添加 2、3 行,如下所示:在 search.java
LMDirichletSimilarity similarity = new LMDirichletSimilarity(2000f);
indexSearcher.setSimilarity(similarity);
在 index.java 上
LMDirichletSimilarity similarity = new LMDirichletSimilarity(2000f);
config.setSimilarity(similarity);
但我不认为这很容易!也许我应该写一个算法之类的?有答案的请帮帮我谢谢^_^
解决方案
里面有个语言模型相似度方法,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
,所以你可以派生那个方法并实现你自己的。
推荐阅读
- reactjs - window.history 与 Router.history 的对比
- swift - RxSwift 使用数据集合
- docker - 在针对不同可执行文件的 Dockerfile 中结合 ENTRYPOINT 和 CMD
- corda - Corda - 新参数是强制性的,应该可以为空以使进化工作
- python-3.x - Python3 - 异步初始化成员
- reactjs - React - 单击窗口时关闭下拉菜单
- android - 自定义列表视图中的搜索过滤器
- java - Stream anyMatch 因“不兼容的类型”错误而失败
- php - 如何翻译成西班牙语背包?
- mongodb - 一次删除多个文档 mongodb atlas