2010-01-04 176 views
5

我计算了两个文档的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

这是不是更适合http://mathoverflow.net /? – 2010-01-04 06:11:59

+4

它的一个信息检索任务,不是一个纯粹的数学人会关心 – 2010-01-04 06:24:33

+11

请停止推荐mathoverflow.net - 这是严重的数学问题。 – 2010-01-05 15:45:02

回答

13
  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通常具有稀疏表示,您只需存储非零条目,并且可以更快计算标准和点。

+0

谢谢,但我还对另外一件事感到困惑。我看到有人在网上讨论这个问题。我无法理解。我应该计算tf/idf值OR的余弦相似度吗?只有idf值或只有tf值????? 我知道PHP,并开始学习Java。但是我很抱歉,我不知道哪个郎。你在这里使用的代码?你能不能让我知道,我会看看那个郎。基本语法。或者,如果你可以使用我的tf/idf值来计算余弦相似度,它会告诉我如何编写一个函数... 再次感谢您的回复! – user238384 2010-01-04 07:00:10

+0

@agazerboy这个示例在python中给出,它应该是非常可读的。 for i in xrange(n)means for(i = 0; i 2010-01-04 07:32:20

+0

请在下面阅读我的解释! – user238384 2010-01-04 17:07:18

8

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

[匿名用户评论](http://stackoverflow.com/suggested-edits/237603),这应该是'both.retainAll()'不' removeAll'来获得交集 – Rup 2012-04-10 12:11:35

0

1)计算TF-IDF(一般比TF独好,但完全取决于您的数据集和要求)

wiki(关于IDF)

结合反文档频率因子,可减少文档集中频繁出现的术语的权重和 增加了很少发生的条件的权重。

2)不,这两个文件的单词数量是不重要的。

3)现在您可以通过调用一些机器学习库函数在任何语言中找到tf-idfcosine-similarity。我更喜欢蟒蛇

Python代码来计算tf-idfcosine-similarity(使用scikit-learn 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)您可能会感兴趣truncated Singular Value Decomposition (SVD)