gpt4 book ai didi

java - 自定义 lucene 评分 - 字段提升和查询提升之间的点积

转载 作者:行者123 更新时间:2023-12-01 05:28:38 26 4
gpt4 key购买 nike

我想使用 Lucene 并按照以下评分逻辑:当我索引文档时,我想为每个字段设置一个分数/权重。当我查询索引时,我想为每个查询词设置一个分数/权重。

我永远不会对同一字段的多个实例进行索引或查询 - 在每个查询(文档)中都会有 0-1 个具有相同字段名称的实例。我的字段/查询术语没有被分析——它们已经由一个标记组成。

我希望分数只是查询字段与文档字段之间的点积(如果它们具有相同的值)。

例如:
格式为(字段名称)(字段值)(字段分数)
查询:
1 AA 0.1
7 BB 0.2
8 CC 0.3

文档1:
1 AA 0.2
2 DD 0.8
7 CC 0.999
10 FFF 0.1

文档2:
7 BB 0.3
8 CC 0.5

分数应该是:
得分(q,d1) = FIELD_1_SCORE_Q * FILED_1_SCORE_D1 = 0.1 * 0.2 = 0.02
得分(q,d2) = FIELD_7_SCORE_Q * FILED_7_SCORE_D2 + FIELD_8_SCORE_Q * FILED_8_SCORE_D2 = (0.2 * 0.3) + (0.3 * 0.5)

实现它的最佳方法是什么?在准确性和性能方面(我不需要 TF 和 IDF 计算)。

我目前通过设置字段和查询词的提升来实现它。然后我覆盖了 DefaultSimilarity 类,并在索引/查询之前将其设置为默认值:

public class MySimilarity extends DefaultSimilarity {

@Override
public float computeNorm(String field, FieldInvertState state) {
return state.getBoost();
}

@Override
public float queryNorm(float sumOfSquaredWeights) {
return 1;
}

@Override
public float tf(float freq) {
return 1;
}

@Override
public float idf(int docFreq, int numDocs) {
return 1;
}

@Override
public float coord(int overlap, int maxOverlap) {
return 1;
}

}


并基于http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/scoring.html这应该有效。
问题:

  1. 性能:我正在计算所有 TF/IDF 内容和 NORMS没什么……
  2. 我从 TopScoreDocCollector 获得的分数不是和我从解释中得到的一样。

这是我的代码的一部分:

indexSearcher = new IndexSearcher(IndexReader.open(directory, true));
TopScoreDocCollector collector = TopScoreDocCollector.create(iTopN, true);
indexSearcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
for (int i = 0; i < hits.length; ++i) {
int docId = hits[i].doc;
Document d = indexSearcher.doc(docId);
double score = hits[i].score;
String id = d.get(FIELD_ID);
Explanation explanation = indexSearcher.explain(query, docId);
}

谢谢!

最佳答案

有几件事您可以解决:

  • 您没有在粘贴的代码片段中设置自定义相似度,请参阅IndexSearcher#setSimilarity ,

  • 当 freq 等于 0 时,相似性实现的“tf”方法应返回 0。

此外,您应该小心索引时间提升。由于它们是在单个字节上编码的,因此可能会出现一些精度损失,请参阅 In Lucene, why do my boosted and unboosted documents get the same score? .

索引时间提升的一种替代方法可以是在不同的数字字段中对提升值进行索引,然后使用 CustomScoreQuery和一个float FieldCacheSource利用这些分数提升。

关于java - 自定义 lucene 评分 - 字段提升和查询提升之间的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380188/

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