2012-02-03 8 views
5

私はSolrを使ってコサイン類似度アルゴリズムをモデル化する方法に興味があります。私はベクトルを割り当てられたアイテムを持っています。例えば、Solr/Luceneでコサインの類似性をモデル化することは可能ですか?

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] } 
] 

他のものにランク付けする必要がある検索ベクトル。

現在、私はすべての項目を実行し、それらに入力ベクトルに対してランクを割り当てることで、これをルビーでモデリングしています。

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について十分に知りませんどのようにモデル化されるか、それができるかどうか、しかし私はそれをそこに投げ捨てると思った。

+0

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

答えて

1

Luceneは既にコサイン類似モデルを使用していますので、実際の質問はあなたのベクトルをLuceneのベクトルにマップできますか?あなたが望んでいないLuceneが行う規範などを取り除くことができますか?

あなたはいつも独自のスコアリングと分析機能を書くことができます。コーディングをしたいのであれば、答えは「はい」です。これはあなたが望むより多くの仕事を必要とするかもしれません。

途中でコーディングする必要のないオプションについては、各ディメンションを "dim_n"という単語に変換して繰り返します(またはブーストします)が、そのディメンションのベクトルの大きさは何度もあります。たとえば:

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

あなたのベクトルがほぼ同じ大きさのすべてであり、均等寸法に分散している場合、これは非常に良い近似であるかもしれません。

問題について詳細を教えてください(たとえば、実際にLuceneベクトルを入力する必要があるのか​​、それともテキストを与えることができますか)、より良いソリューションを見つけることができます。

+0

私は確かにそれをベクタにする必要がありますが、上記のテキストトランスレーションのアプローチのようなものを潜在的に見ることができます。何らかのコーディングをしても構いませんが、私はRubyプラットフォームを使用していますので、Solrを実際に使用できるだけなので、Solr APIを通して表現できるものでなければなりません。 –

+0

さて、Luceneの[スコアリング式](http://lucene.apache.org/java/3_0_0/api/core/org/apache/lucene/search/Similarity.html)を見て、テキストメソッドが十分に近くに来る。 Solrは、ソースを変更せずに[関数クエリを書く](http://wiki.apache.org/solr/FunctionQuery)を許可します。これも別のオプションです。 – Xodarap