Tôi quan tâm đến các cách có thể để mô hình hóa thuật toán tương tự cosin bằng cách sử dụng Solr. Tôi có các mục được gán một véc tơ, ví dụ:Có thể mô hình tương tự cosin trong Solr/Lucene không?
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] }
]
Và một véc tơ tìm kiếm mà những thứ khác cần được xếp hạng.
Hiện tại, tôi đang tạo mô hình này bằng ruby bằng cách chạy trên tất cả các mục và gán cho chúng thứ hạng so với véctơ đầu vào. Dưới đây là việc thực hiện các cosin tương Tôi đang sử dụng:
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
Sau đó, để có được một danh sách xếp hạng tôi sẽ làm một cái gì đó như sau:
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
Tôi không biết đủ về Solr biết làm thế nào điều này sẽ được mô hình hóa hoặc thậm chí nếu nó có thể, nhưng tôi nghĩ rằng tôi muốn ném nó ra khỏi đó.
http://stackoverflow.com/a/1849270/272861 – Mikos