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

1.txt
0.0
0.5
2.txt
0.0
0.5

这些文件是这样的:

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

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

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

还有一个问题: 两个文档的字数应该相同重要吗?

有帮助吗?

解决方案

            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通常有稀疏表示,你只需要存储非零条目,就可以计算出规范和斑点更快速。

其他提示

简单的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);
    }

1)计算tf-idf(通常比单独的t-f更好,但完全取决于您的数据集和要求)

维基百科 (关于以色列国防军)

合并了一个逆文档频率因子,该因子减少了文档集中经常发生的术语的重量,并增加了很少发生的术语的重量。

2) 不,两个文档的字数相同并不重要。

3)你可以找到 tf-idf 或者 cosine-similarity 现在可以通过调用一些机器学习库函数来使用任何语言。我更喜欢蟒蛇

用于计算的Python代码 tf-idf余弦相似度 ( 使用 scikit 学习 0.18.2 )

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# example dataset
from sklearn.datasets import fetch_20newsgroups

# replace with your method to get data
example_data = fetch_20newsgroups(subset='all').data

max_features_for_tfidf = 10000
is_idf = True 

vectorizer = TfidfVectorizer(max_df=0.5, max_features=max_features_for_tf_idf,
                             min_df=2, stop_words='english',
                             use_idf=is_idf)


X_Mat = vectorizer.fit_transform(example_data)

# calculate cosine similarity between samples in X with samples in Y
cosine_sim = cosine_similarity(X=X_Mat, Y=X_Mat)

4)您可能感兴趣 截断奇异值分解 (SVD)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top