【问题标题】:Is it possible to model cosine similarity in Solr/Lucene?是否可以在 Solr/Lucene 中模拟余弦相似度?
【发布时间】:2012-02-25 16:46:07
【问题描述】:

我对使用 Solr 对余弦相似度算法进行建模的可能方法很感兴趣。我有分配了向量的项目,例如:

items = [
  { id: 1, vector: [0,0,0,2,3,0,0] },
  { id: 2, vector: [0,1,0,1,5,0,0] },
  { id: 3, vector: [2,3,0,0,0,1,0] },
  { id: 4, vector: [1,2,4,6,5,0,0] }
]

以及其他需要排名的搜索向量。

目前,我通过遍历所有项目并根据输入向量为它们分配排名,在 ruby​​ 中对此进行建模。这是我正在使用的余弦相似度的实现:

module SimilarityCalculator

  def self.get_similarity(vector1, vector2)
    dp = dot_product(vector1, vector2)
    nm = normalize(vector1) * normalize(vector2)
    dp / nm
  end

  private

  def self.dot_product(vector1, vector2)
    sum = 0.0
    vector1.each_with_index { |val, i| sum += val * vector2[i] }
    sum
  end

  def self.normalize(vector)
    Math.sqrt(vector.inject(0.0) { |m,o| m += o**2 })
  end

end

然后,要获得排名列表,我会执行以下操作:

ranked = []
search_vector = [1,0,0,3,5,0,0]
items.each do |item|
  rank = SimilarityCalculator.get_similarity(search_vector, item.vector)
  { id: item.id, rank: rank }
end

我对 Solr 的了解不够多,不知道如何建模,或者即使它可以建模,但我想我会把它扔在那里。

【问题讨论】:

标签: ruby solr lucene cosine-similarity


【解决方案1】:

lucene已经使用余弦相似之柴,所以真正的问题是:你能把你的向量映射到禄天的矢量吗?你能删除你不想要的 Lucene 做的规范等吗?

你可以始终写自己的评分和分析功能,所以如果你愿意做一些编码,答案是一个明确的“是”。不过,这可能需要比您想要的更多的工作。

对于可能会实现某种方式但不需要任何编码的选项:将每个维度转换为“dim_n”单词,并重复它(或增强它),然而许多次数是该维度中的向量的幅度。例如:

[1,2,0,1] ==> "dim_1 dim_2 dim_2 dim_4"

如果您的矢量大致相同的大小且均匀分布在尺寸上,这可能是一个非常好的近似。

如果您告诉我们更多有关问题的信息(例如,您真的需要提供 Lucene 向量作为输入还是可以提供文本?)我们或许能够找到更好的解决方案。

【讨论】:

  • 我肯定需要给它向量,尽管我可能会看到类似于上面的文本翻译方法的东西。我不介意做一些编码,但我在一个 ruby​​ 平台上,并且真的只有 Solr 可供我使用,所以它需要是我可以通过 Solr API 表达的东西。
  • 嗯,看看Lucene的scoring formula并决定文本方法是否足够接近。 Solr 确实让您write function queries 无需更改源,这是另一种选择。
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 2017-04-27
  • 2011-01-01
  • 1970-01-01
  • 2017-12-12
  • 2013-04-18
  • 2013-05-24
相关资源
最近更新 更多