据我所知,以下两个查询应该是等价的。
即,score(q1, d) = score(q2, d)对语料库中的每个文档d。
查询1:evolution OR selection OR germline OR dna OR rna OR mitochondria
查询2:(evolution OR selection OR germline) OR (dna OR rna OR mitochondria)
查询在逻辑上显然是等价的(它们都返回相同的文档集)。另外,这两个查询都由相同的6个术语组成,每个查询在两个查询中都有1的提升。因此,每个学期对总分的贡献都是相同的(相同的TF、相同的国防军、相同的助推)。
尽管如此,的查询并没有给出相同的分数。
一般来说,术语连接(a OR b OR c OR d)与查询连接((a OR b) OR (c OR d))并不相同。这两种类型的查询之间的语义差异是什么?是什么原因导致他们得到不同的分数?
我之所以问这个问题,是因为我正在构建一个定制的请求处理程序,在该处理程序中,我构建了第二种查询类型(查询的连接),而实际上我可能需要构造第一种查询类型(术语的连接)。换句话说,这就是我要做的:
Query q1 = ... //conjunction of terms evolution, selection, germline
Query q2 = ... //conjunction of terms dna, rna, mitochondria
Query conjunctionOfQueries = new BooleanQuery();
conjunctionOfQueries.add(q1, BooleanClause.Occure.SHOULD);
conjunctionOfQueries.add(q2, BooleanClause.Occure.SHOULD);也许我应该这么做:
List<String> terms = ... //extract all 6 terms from q1 and q2
List<TermQuery> termQueries = ... //create a new TermQuery from each term in terms
Query conjunctionOfTerms = new BooleanQuery();
for (TermQuery t : termQueries) {
conjunctionOfTerms.add(t, BooleanClause.Occure.SHOULD);
}发布于 2013-07-11 12:41:35
我遵循费托尔贡的建议来检查分数计算的调试元素。我发现这些计算在数学上是等价的。唯一的区别是,在查询连接计算中,我们存储中间结果。更准确地说,我们将每个子查询的贡献存储在一个变量中。显然,为了存储中间结果而停止,会积累一个数值误差:每次存储中间结果时,我们都会失去一定的准确性。由于应用程序中的实际查询相当大(不像琐碎的示例查询),因此会丢失大量的准确性,而且累积的错误有时甚至会更改返回文档的排序顺序。
因此,术语连词查询的排序要略好于查询连接查询,因为查询的关联查询累积了更大的数字错误。
https://stackoverflow.com/questions/17571681
复制相似问题