1

Java でベクトル空間モデル アルゴリズムを使用/実装して、キーワードに基づいて 2 人の人物の類似性スコアを取得しようとしています。だから私は次のクラスを持っています:

Person - キーワードのリストがあります。

キーワード - 文字列テキスト。整数スコア。

キーワードスコアは、その人がキーワードに対して行った言及の数です。

Javaでこれを実装する方法について何か提案はありますか?

よろしく

4

2 に答える 2

4

それは非常に簡単です。

  1. まず、ベクトル表現を作成する必要があります。たとえば、キーワードを表す各人物の Map です。
  2. 次に、メトリックを選択する必要があります。 http://en.wikipedia.org/wiki/Cosine_similarityをお勧めします。

それでは、実際のコード:

  static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) {
            Set<String> both = Sets.newHashSet(v1.keySet());
            both.retainAll(v2.keySet());
            double sclar = 0, norm1 = 0, norm2 = 0;
            for (String k : both) sclar += v1.get(k) * v2.get(k);
            for (String k : v1.keySet()) norm1 += v1.get(k) * v1.get(k);
            for (String k : v2.keySet()) norm2 += v2.get(k) * v2.get(k);
            return sclar / Math.sqrt(norm1 * norm2);
    }
于 2011-04-21T15:32:51.290 に答える
0

上記のサンプルコードにはバグがあると思います。修正したコードは以下です。

static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) {
        Set<String> both = Sets.newHashSet(v1.keySet());
        both.removeAll(v2.keySet());

        double sclar = 0, norm1 = 0, norm2 = 0;

        /* We need to perform cosine similarity only on words that 
         * exist in both lists */
        for (String k : both)  {
           sclar += v1.get(k) * v2.get(k);
           norm1 += v1.get(k) * v1.get(k);
           norm2 += v2.get(k) * v2.get(k);
        }
        return sclar / Math.sqrt(norm1 * norm2);
}
于 2011-05-08T15:16:49.183 に答える