1

現在、50以上の文字列の2つの大きなベクトルがあります

これらの2つのベクトルを比較して、それらがどれほど類似しているかを調べたいと思います。コサイン類似性を使用する必要があると思いますか?

2つのJavaベクトルを取り込んで、それらがどれほど類似しているかについて0から1の間の値を与えるメソッドを知っている人はいますか?

ありがとうフィル

4

3 に答える 3

2

Luceneの相似関数を見てください。

上記の式は、ドキュメントとクエリベクトル間の内積または内積によって動機付けられています

これは、このトピックに関する以前のSOの質問です。

于 2009-12-11T13:12:53.623 に答える
2

Cosine Distanceの実装と関連するアプローチについては、 ApacheMahoutライブラリを参照してください。また、はるかに高速な代替手段として、局所性鋭敏型ハッシュを検索することを検討してください。

于 2009-12-11T13:33:20.440 に答える
1

以下をせよ

package com.example;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/** Computes the similarity between two bags of words.
 * 1.0 is most similar, 0.0 is most unsimilar.
 *
 */
public class Cosine {

    public static double cosine(Collection<String> a, Collection<String> b) {
        Map<String,Integer> aa = asBag(a);
        Map<String,Integer> bb = asBag(b);
        double sum = 0;
        for (String word: aa.keySet()) {
            if (!bb.containsKey(word)) continue;
            sum += aa.get(word) * bb.get(word);
        }
        return sum / (norm(aa) * norm(bb));
    }

    private static double norm(Map<String, Integer> bag) {
        double sum = 0;
        for (int each: bag.values()) sum += each * each;
        return Math.sqrt(sum);
    }

    private static Map<String,Integer> asBag(Collection<String> vector) {
        Map<String,Integer> bag = new HashMap<String,Integer>();
        for (String word: vector) {
            if (!bag.containsKey(word)) bag.put(word,0);
            bag.put(word, bag.get(word) + 1);
        }
        return bag;
    }

}

型推論、誰か?

于 2009-12-11T13:36:34.583 に答える