2009-12-31 79 views
4

我正在使用TF/IDF来计算相似度。例如,如果我有以下两个文档。tf idf相似度

Doc A => cat dog 
Doc B => dog sparrow 

这是正常的它的相似性是50%,但是当我计算它的TF/IDF。它是作为按照

TF值文件甲

dog tf = 0.5 
cat tf = 0.5 

TF为文件B值

dog tf = 0.5 
sparrow tf = 0.5 
进行DOC

IDF值甲

dog idf = -0.4055 
cat idf = 0 

IDF值文件乙

dog idf = -0.4055 (without +1 formula 0.6931) 
sparrow idf = 0 

TF为文件/ IDF值A

0.5x-0.4055 + 0.5x0 = -0.20275 

TF/IDF值文件乙

0.5x-0.4055 + 0.5x0 = -0.20275 

现在看起来像有-0.20275相似。是吗? 或者我错过了什么? 或者是下一步的任何一种?请告诉我,我也可以计算出来。

我用TF/IDF公式,维基百科提到

+0

您是否在使用Apache Mahout来计算它?如果是的话,请让我知道需要采取的步骤。我必须开发一个原型来使用Apache Mahout来计算TF IDF。 junaid_surqyahoo.co.in – 2012-01-04 10:16:44

回答

17

让我们来看看,如果我得到你的问题: 你要计算这两个文件之间的TF/IDF相似度:

Doc A: cat dog 

Doc B: dog sparrow 

我认为这是你的整个语料库。因此|D| = 2 对于所有单词,Tfs确实是0.5。 要计算'dog'的IDF,请参考log(|D|/|d:dog in d| = log(2/2) = 0 同样,'cat'和'sparrow'的IDF是log(2/1) = log(2) =1 (我使用2作为日志基础以使其更容易)。

因此, '狗' 的TF/IDF值将是0.5×0 = 0 '猫' 和 '麻雀' 的TF/IDF值将是0.5×1 = 0.5

为了测量(猫,麻雀,狗)空间中的矢量之间的余弦 : (0.5,0,0)和(0,0.5,0)并且获得结果0.

总结:

  1. 您在IDF CA中有错误lculations。
  2. 此错误会创建错误的TF/IDF值。
  3. 维基百科的文章没有很好地解释TF/IDF的相似性。我喜欢Manning, Raghavan & Schütze's explanation好多了。
+0

谢谢Yuval! ! ! 你让我的生活变得简单:) 有两个问题1,我正在使用自然日志。我无法在Java中找到任何log2函数,但我会解决它。 第二个问题更重要。我无法理解你如何与余弦相似?当tf/idf表示50%的相似性时,为什么余弦在说0%? – user238384 2009-12-31 21:39:23

+0

不客气。我相信使用自然对数更好,它使用基2更容易解释。让我们澄清余弦相似度: TF/IDF纯粹是一种表示形式:可以将一个字计数向量转换为一个TF/IDF值向量。余弦相似度是两个归一化向量之间的标量乘法;载体可以是原始计数或由TF/IDF转换。在你说明的情况下,标量乘法将为零,因为我们要么只有一个向量出现单词,要么出现零分的常见单词('狗')。 HTH。 – 2010-01-01 10:53:40

+0

谢谢Yuval,如果我使用自然日志,那么我的Tf/Idf值与您的不同。如果我使用log2,那么我认为我得到正确的结果。你能告诉我LSI和向量空间有什么区别吗?对不起,这听起来哑巴的问题。如果你可以给我一个很好的教程如何实施LSI。这将是很大的帮助 – user238384 2010-01-01 23:31:17

0

我认为你必须采取ln而不是日志。

0
def calctfidfvec(tfvec, withidf): 
    tfidfvec = {} 
    veclen = 0.0 

    for token in tfvec: 
     if withidf: 
      tfidf = (1+log10(tfvec[token])) * getidf(token) 
     else: 
      tfidf = (1+log10(tfvec[token])) 
     tfidfvec[token] = tfidf 
     veclen += pow(tfidf,2) 

    if veclen > 0: 
     for token in tfvec: 
      tfidfvec[token] /= sqrt(veclen) 

    return tfidfvec 

def cosinesim(vec1, vec2): 
    commonterms = set(vec1).intersection(vec2) 
    sim = 0.0 
    for token in commonterms: 
     sim += vec1[token]*vec2[token] 

    return sim