【问题标题】:How can i extend Lucene with a language model?如何使用语言模型扩展 Lucene?
【发布时间】:2020-06-14 18:50:23
【问题描述】:

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

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

在 index.java 上

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

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

【问题讨论】:

  • 问题中的代码将 Lucene 的默认 BM25Similarity 记分器(查看更多信息 here)替换为不同的记分器 - LMDirichletSimilarity 记分器。如果这就是你想要的,那么你就准备好了。
  • LMDirichletSimilarity 源代码是here,如果您有兴趣。 (不要让我解释它是如何工作的。)
  • @andrewjames 我也想要一个 unigram 语言模型来支持 lucene 取消 diricglet 平滑,但我没有找到和算法这样做:/
  • 我可能完全误解了你想要做的事情(如果是这样,我很抱歉),但是...... dirichlet 平滑已经实现(你已经找到了)和“unigram”在上下文中Lucene 意味着(对我而言)单个单词标记 - 例如,由标准分析器生成(与其他 Lucene n-gram 分析器或 shingle 分析器相比)。有时,查看ElasticSearch 文档比查看 Lucene 文档更有帮助,以获得更多信息。

标签: java lucene similarity dirichlet


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

【讨论】:

  • 使用 Lucene here 已经提供的 LMDirichletSimilarity 平滑评分器有什么问题,因为那是 OP 提到的那个?
猜你喜欢
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多