8

我在互联网上找到了以下用于计算 TFIDF 的代码:

https://github.com/timtrueman/tf-idf/blob/master/tf-idf.py

我在函数 def idf(word, documentList) 中添加了“1+”,所以我不会除以 0 错误:

return math.log(len(documentList) / (1 + float(numDocsContaining(word,documentList))))

但我对两件事感到困惑:

  1. 在某些情况下我得到负值,这是正确的吗?
  2. 我对第 62、63 和 64 行感到困惑。

代码:

 documentNumber = 0
  for word in documentList[documentNumber].split(None):
       words[word] = tfidf(word,documentList[documentNumber],documentList)

TFIDF 是否应该仅在第一个文档上计算?

4

2 回答 2

14
  1. 不。Tf-idf 是 tf,一个非负值,乘以 idf,一个非负值,所以它永远不可能是负数。这段代码似乎实现了tf-idf 的错误定义,该定义在 Wikipedia 上已存在多年(同时已修复)。
于 2013-05-20T11:36:00.167 回答
2

如果有问题的单词包含在集合中的每个文档中,您的 1+ 更改将导致负值。因为 0 < (x / (1 + x)) < 1 适用于所有 x > 0。这导致负对数。

在我看来,不存在的单词的正确 IDF 是无限的或未定义的,但是通过将 1+ 加到分母和提名者上,不存在的单词的 IDF 将略高于任何现有单词,并且每个文档中存在的单词将具有 IDF为零。这两种情况都可能适用于您的代码。

于 2013-11-13T17:04:41.283 回答