【问题标题】:Does solr use cosine similarity?solr 是否使用余弦相似度?
【发布时间】:2014-07-09 18:49:57
【问题描述】:

我编写了一个小型搜索引擎作为我的每周项目。它基于查询向量和文档向量之间的余弦相似度。向量是使用令牌的 tf-idf 疮计算的。
我开始了解 Apache Solr,它是一个全文搜索引擎。我的问题是 solr 在对搜索结果进行排名时是否在内部使用余弦相似度?

【问题讨论】:

    标签: solr lucene search-engine


    【解决方案1】:

    没有。 Solr 使用 similar 来表示余弦相似度,但并不完全相同 - 存在一些关键差异。

    如果您访问同一链接 (https://lucene.apache.org/core/4_10_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html) 并进一步向下滚动,您将看到“Lucene 概念评分公式”和“Lucene 实用评分公式”,其中提供了更多详细信息。

    忽略任何索引/查询时间提升,以下是一些关键区别:

    1.不同的文档归一化因子

    它不是通过 tf-idf 向量的欧几里德范数对每个文档进行归一化,而是使用“doc-len-norm”。对于默认相似性度量 (DefaultSimiairty),这只是 1/sqrt(文档中的术语数),基本上等于 1/sqrt(sum(tf)) - 即,其中 tf 是文档中术语计数的总和 -没有像欧几里得范数那样的平方,并且每个项的 idf 都被忽略了。此外,该值被四舍五入为一个字节以节省空间。这通常会得出与用于余弦相似度的归一化因子不同的值。

    2。额外的“协调”提升

    还有一个额外的值乘以等于: 文档中匹配的查询词数/查询中的总词数。

    这为匹配更多查询词的字段(文档)提供了额外的提升,并且可能具有值得怀疑的价值。这本质上是将 tf-idf 向量分数与另一个内积相乘 - 这些向量的内积转换为布尔向量(如果没有给定项,则为 0,如果有,则为 1)与仅由其欧几里得规范化的查询向量规范。

    【讨论】:

      【解决方案2】:

      是的,Solr(在 Lucene 之上运行)确实使用余弦相似度。来自 Lucene 文档:

      查询 q 的文档 d 的 VSM 分数是 加权查询向量 V(q) 和 V(d)

      余弦相似度(q,d) = V(q) · V(d) / |V(q)| |V(d)|

      https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html

      【讨论】:

        【解决方案3】:

        如果您在 Solr 中寻找实际的向量相似度,有两种方法: 1) 使用分隔的有效载荷。已经有一些插件实现了这一点,例如 https://github.com/moshebla/solr-vector-scoring 和 https://github.com/saaay71/solr-vector-scoring

        2) 使用开箱即用的流式表达式:https://lucene.apache.org/solr/guide/8_5/vector-math.html

        后者速度较慢,但​​更灵活。

        【讨论】:

          猜你喜欢
          • 2012-02-25
          • 2020-08-12
          • 2011-01-01
          • 1970-01-01
          • 2017-12-12
          • 2013-05-24
          • 1970-01-01
          • 2016-08-14
          相关资源
          最近更新 更多