gpt4 book ai didi

java - 如何在Lucene的IR模型中添加位置信息?

转载 作者:行者123 更新时间:2023-11-29 04:18:23 24 4
gpt4 key购买 nike

我想通过扩展 Lucene 中的 Similarity 类来实现我自己的基于位置的 IR 模型。我想根据匹配项在文档中的位置来影响文档权重。我已经搜索谷歌并没有找到答案。我应该怎么做?

我正在使用 Lucene 7.2.1

最佳答案

据我了解,在 lucene 核心搜索中,您需要自己的相似性模型,有一个名为 SimilarityBase 的类。该文件的路径为

lucene-7.2.1\core\src\java\org\apache\lucene\search\similarities

public abstract class SimilarityBase extends Similarity

Similarity 的子类,为其后代提供简化的 API。子类只需要实现 Score 和 toString() 方法。实现 explain(List, BasicStats, int, float, float) 是可选的,因为 SimilarityBase 已经提供了分数的基本解释和词频。但是,鼓励子类的实现者尽可能多地包含有关评分方法的详细信息。

注意:词组查询等多词查询的评分方式不同 比 Lucene 的默认排名算法:而它“伪造”了一个 IDF 值 短语作为一个整体(因为它不知道),这个类反而得分 短语作为单个术语分数的总和。覆盖分数和解释方法的示例代码

@Override
protected float score(BasicStats stats, float freq, float docLen) {
return stats.getBoost() *
distribution.score(
stats,
normalization.tfn(stats, freq, docLen),
lambda.lambda(stats));
}



@Override
protected void explain(
List<Explanation> subs, BasicStats stats, int doc, float freq, float docLen) {
if (stats.getBoost() != 1.0f) {
subs.add(Explanation.match(stats.getBoost(), "boost"));
}
Explanation normExpl = normalization.explain(stats, freq, docLen);
Explanation lambdaExpl = lambda.explain(stats);
subs.add(normExpl);
subs.add(lambdaExpl);
subs.add(distribution.explain(stats, normExpl.getValue(), lambdaExpl.getValue()));
}

要构建相似性模型,您必须指定基于信息的模型的所有三个组件的实现。

  1. 概率分布用于对术语出现进行建模
  2. 平均计数的概率分布参数单词在集合中或在文档平均数中出现概率分布的λw参数

  3. 词频归一化

您可以在此处找到有关规范化的更多详细信息

org.apache.lucene.search.similarities.Normalization.NoNormalization

@注意 “正常”Lucene 查询创建评分器,如果术语不存在则返回 null 这意味着它们永远不会对不存在的术语进行评分,但是对于跨度,整个层次结构只有一个评分器

关于java - 如何在Lucene的IR模型中添加位置信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50868167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com