余弦相似度

use*_*384 6 java trigonometry similarity tf-idf dot-product

我计算了两个文件的tf/idf值.以下是tf/idf值:

1.txt
0.0
0.5
2.txt
0.0
0.5
Run Code Online (Sandbox Code Playgroud)

文件如下:

1.txt = > dog cat
2.txt = > cat elephant
Run Code Online (Sandbox Code Playgroud)

如何使用这些值来计算余弦相似度?

我知道我应该计算点积,然后通过它找到距离并除以点积.如何使用我的值来计算?

还有一个问题:两个文件应该有相同数量的单词是否重要?

Yin*_*Zhu 15

            a * b
sim(a,b) =--------
           |a|*|b|
Run Code Online (Sandbox Code Playgroud)

a*b是点积

一些细节:

def dot(a,b):
  n = length(a)
  sum = 0
  for i in xrange(n):
    sum += a[i] * b[i];
  return sum

def norm(a):
  n = length(a)
  for i in xrange(n):
    sum += a[i] * a[i]
  return math.sqrt(sum)

def cossim(a,b):
  return dot(a,b) / (norm(a) * norm(b))
Run Code Online (Sandbox Code Playgroud)

是.在某种程度上,a和b必须具有相同的长度.但是a和b通常都有稀疏表示,你只需要存储非零项,你就可以更快地计算norm和dot.


yur*_*ura 9

简单的java代码实现:

  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);
    }
Run Code Online (Sandbox Code Playgroud)

  • [匿名用户评论](http://stackoverflow.com/suggested-edits/237603)这应该是'both.retainAll()`而不是`removeAll`来获得交集 (2认同)