【发布时间】:2018-11-24 20:41:00
【问题描述】:
我想通过在 Lucene 中扩展 Similarity 类来实现我自己的基于位置的 IR 模型。我想根据匹配项在文档中的位置来影响文档权重。我搜索了谷歌并没有找到答案。我该怎么做?
我使用的是 Lucene 7.2.1
【问题讨论】:
标签: java lucene similarity information-retrieval
我想通过在 Lucene 中扩展 Similarity 类来实现我自己的基于位置的 IR 模型。我想根据匹配项在文档中的位置来影响文档权重。我搜索了谷歌并没有找到答案。我该怎么做?
我使用的是 Lucene 7.2.1
【问题讨论】:
标签: java lucene similarity information-retrieval
据我了解,您希望在 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()));
}
要构建相似性模型,您必须指定基于信息的模型的所有三个组件的实现。
平均计数的概率分布参数 集合或平均文档中单词的出现次数 λw 概率分布参数
词频归一化
您可以在此处找到有关规范化的更多详细信息
org.apache.lucene.search.similarities.Normalization.NoNormalization
@注意 “正常” Lucene 查询创建记分器,如果术语不存在则返回 null 这意味着它们永远不会对不存在的术语进行评分,但是对于跨度,整个层次结构只有一个记分器
【讨论】: