我需要将Lucene得分标准化为0到1之间。
例如,随机查询返回以下分数......
8.864665
2.792687
2.792687
2.792687
2.792687
0.49009037
0.33730242
0.33730242
0.33730242
0.33730242
得分最高的是什么? 10.0?
感谢
答案 0 :(得分:9)
您可以使用最高分数划分所有分数,以获得0到1之间的分数。
但请注意,标准化分数应仅用于比较单个查询的结果。比较两个不同查询的结果的分数(标准化与否)是不正确的。
答案 1 :(得分:5)
没有很好的标准方法来使用lucene来标准化分数。请阅读:ScoresAsPercentages和此explanation
在您的情况下,如果结果按分数排序,则最高分数是第一个结果的分数。但是这个分数对于其他所有查询都会有所不同。
答案 2 :(得分:1)
Solr没有最高分,这取决于太多的变量,因此无法预测。
但是你可以实现一种称为标准化分数(Scores As Percentages)的东西,这是不推荐的。
有关详细信息,请参阅相关链接:
how do I normalise a solr/lucene score?
Remove results below a certain score threshold in Solr/Lucene?
答案 3 :(得分:0)
常规规范化只会帮助您比较查询(以及他们检索到的列表)之间的评分分布。 您不能简单地将分数标准化以比较查询之间的性能。 想象一下所有检索到的文档高度相关并且收到相同(高分)的查询,并且在另一个查询中,检索到的列表包含大麦相关文档(再次,具有相同的分数) - 现在,无论每个查询归一化你做 - 标准化得分将是相同的。
您需要考虑一个可以将所有分数提升到同一水平的交叉查询因子。
例如 - 可能计算查询与整个索引之间的相似性,并以某种方式将该分数与文档分数一起使用
答案 4 :(得分:0)
如果您想比较两个或更多查询,我找到了一种解决方法。 您可以使用 LevenstheinDistance 或 LuceneLevenstheinDistance(Damerau)类将您的最高得分文档与您的查询项进行比较,以获得您的查询项与结果之间的距离。结果是他们之间的相似性。对要比较的每个查询执行此操作。现在,您可以使用querytherm的相似性和最高结果来比较查询。您现在可以选择具有最高分数的查询,并将其用于下一步的正确操作。
//Damerau LevenstheinDistance
LuceneLevenshteinDistance d = new LuceneLevenshteinDistance();
similiarity = d.getDistance(queryterm, yourResult );
答案 5 :(得分:0)
我应用了非线性函数来压缩每个查询。