用Java中的向量空间模型算法得到两个人之间的相似度得分

时间:2010-09-01 21:00:43

标签: java algorithm vector artificial-intelligence text-mining

我试图在Java中使用/实现向量空间模型算法,以根据其关键字获得两个人之间的相似性得分。所以我有以下课程:

人 - 有关键字列表;

关键字 - 字符串文字; 整数分数;

关键字得分是此人对关键字提及的次数。

有关如何在Java中实现此功能的任何建议?

此致

2 个答案:

答案 0 :(得分:4)

非常容易。

  1. 首先,您应该为每个代表其关键字的人创建矢量表示,示例Map。
  2. 其次,您应该选择指标,我建议http://en.wikipedia.org/wiki/Cosine_similarity
  3. 现在真正的代码:

      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);
        }
    

答案 1 :(得分: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);
}