2012-02-03 20 views
5

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 đó.

+0

http://stackoverflow.com/a/1849270/272861 – Mikos

Trả lời

1

Lucene đã sử dụng mô hình tương tự cosin, vì vậy câu hỏi thực sự là: bạn có thể ánh xạ vectơ của bạn vào vectơ của Lucene không? Và bạn có thể loại bỏ các tiêu chuẩn vv mà Lucene nào mà bạn không muốn?

Bạn luôn có thể viết các chức năng chấm điểm và phân tích của riêng mình, vì vậy nếu bạn sẵn sàng thực hiện một số mã, câu trả lời là rõ ràng "có". Điều này có thể yêu cầu công việc nhiều hơn bạn muốn mặc dù.

Đối với một tùy chọn có thể giúp bạn trở thành một phần nhưng không yêu cầu bất kỳ mã nào: dịch từng thứ nguyên thành từ "dim_n" và lặp lại nó (hoặc tăng nó). . Ví dụ:

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

Nếu các vectơ của bạn có cùng kích thước và phân bố đều trên các kích thước, điều này có thể gần đúng.

Nếu bạn cho chúng tôi biết thêm về sự cố (ví dụ: bạn có thực sự cần cung cấp các vector Lucene làm đầu vào hoặc bạn có thể cung cấp văn bản đó không?), Chúng tôi có thể tìm các giải pháp tốt hơn.

+0

Tôi chắc chắn cần phải cung cấp cho nó vectơ, mặc dù tôi có khả năng có thể thấy một cái gì đó giống như phương pháp dịch văn bản ở trên làm việc. Tôi không ngại làm một số mã hóa nhưng tôi đang trên một nền tảng ruby ​​và thực sự chỉ có Solr theo ý của tôi, vì vậy nó cần phải được một cái gì đó tôi có thể thể hiện thông qua các API Solr. –

+0

Vâng, hãy xem [công thức tính điểm] của Lucene (http://lucene.apache.org/java/3_0_0/api/core/org/apache/lucene/search/Similarity.html) và quyết định xem phương pháp văn bản sẽ đến đủ gần. Solr không cho phép bạn [viết truy vấn chức năng] (http://wiki.apache.org/solr/FunctionQuery) mà không thay đổi nguồn, đó là một tùy chọn khác. – Xodarap

Các vấn đề liên quan