6

2 つのドキュメントの tf/idf 値を計算しました。tf/idf 値は次のとおりです。

1.txt
0.0
0.5
2.txt
0.0
0.5

ドキュメントは次のようなものです。

1.txt = > dog cat
2.txt = > cat elephant

これらの値を使用してコサイン類似度を計算するにはどうすればよいですか?

内積を計算し、距離を求めて内積を割ります。自分の値を使用してこれを計算するにはどうすればよいですか?

もう 1 つの質問:両方の文書の単語数が同じであることが重要ですか?

4

3 に答える 3

16
            a * b
sim(a,b) =--------
           |a|*|b|

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

はい。a と b はある程度同じ長さでなければなりません。ただし、 a と b は通常疎な表現を持ち、ゼロ以外のエントリを保存するだけでよく、ノルムとドットをより高速に計算できます。

于 2010-01-04T06:13:35.830 に答える
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);
    }
于 2011-04-21T15:45:37.237 に答える