如何计算单个新文档的TF*IDF以进行分类?

25
我正在使用文档-术语向量来表示一组文档。我使用TF*IDF来计算每个文档向量的术语权重。然后,我可以使用此矩阵为文档分类训练模型。
我希望能够在未来对新文档进行分类。但是为了对其进行分类,我需要首先将文档转换为文档-术语向量,向量也应由TF*IDF值组成。
我的问题是,我如何仅使用单个文档计算TF*IDF?
据我所知,TF可以基于单个文档本身计算,但IDF只能使用一组文档计算。在我的当前实验中,我实际上计算了整个文档集合的TF*IDF值。然后,我使用一些文档作为训练集,其他文档作为测试集。
我突然意识到这似乎不适用于现实生活。
ADD 1
因此,实际上有两种微妙不同的分类场景:
  1. 对于一些已知内容但未知标签的文档进行分类。
  2. 对于一些完全未见过的文档进行分类。

对于第1种情况,我们可以将所有带有和不带有标签的文档合并起来,并获取它们的TF*IDF值。这样,即使我们只使用带有标签的文档进行训练,训练结果仍将包含不带标签的文档的影响。

但是我的情况是第2种。

假设我从训练集语料库的摘要中获得了如下关于术语T的信息:

  • T在训练集中的文档数为n。
  • 训练集中文档的总数为N。

那么我应该如下计算一个未见过的文档D的IDF值吗?

IDF(t, D)= log((N+1)/(n+1))

ADD 2

如果我在新文档中遇到了一个之前在训练语料库中没有出现过的术语,那么我该如何计算它在文档-术语向量中的权重?

3个回答

12

对于单个文档而言,独立于语料库,TF-IDF 没有意义。它的基本原则在于强调相对罕见和信息量丰富的词。

你需要保留语料库摘要信息以计算 TF-IDF 权重。特别是,你需要每个术语的文档数量和文档总数。

无论您是想使用整个训练集和测试集的摘要信息来计算 TF-IDF,还是只想使用训练集的摘要信息,这都取决于您的问题描述。如果你只想将你的分类系统应用于拥有内容但没有标签的文件(这实际上相当常见),那么就可以使用整个语料库的 TF-IDF。如果你想训练后将分类系统应用于完全未知的文档,那么你只需要使用训练集的 TF-IDF 摘要信息。


4

TF显然仅取决于新文档。

IDF仅在训练语料库中计算。

您可以向IDF计算添加松弛项,或像您建议的那样进行调整。但对于合理的训练集,常数+1项不会产生太大影响。据我所知,在经典的文档检索(比如:搜索)中,您不需要这样做。通常,查询文档将成为您语料库的一部分,因此为什么它应该是IDF的一部分呢?


谢谢。我已经更新了我的问题,加入了“未见过的术语”。您能否更详细地解释一下“经典文档检索(搜索)”场景?您所说的“查询文档不会成为您语料库的一部分”是什么意思? - smwikipedia
TF-IDF在信息检索中(=搜索!)使用,不仅在机器学习中(带有训练/测试拆分等)。未见过的术语:忽略它们。任何文档都不会匹配这些术语,因此您不需要知道IDF权重。 - Has QUIT--Anony-Mousse
此外,在训练中未曾见过但在测试中出现的术语对于文档分类基本上没有任何用处,你应该将其删除。除非你想使用一个 OOV 标记并在训练语料库中估算其值,但在确定真正的类别方面几乎没有什么价值,所以不必费心。 - Ben Allison

3
对于未出现的单词,TF计算不是问题,因为TF是文档特定的度量标准。在计算IDF时,您可以使用平滑的逆文档频率技术。
IDF = 1 + log(total documents / document frequency of a term)

在这里,IDF的下限为1。因此,如果一个单词在训练语料库中没有出现,那么它的IDF就是1。由于并没有普遍认可的单一公式来计算tf-idf甚至idf,所以您计算tf-idf的公式也是合理的。
请注意,在许多情况下,如果未见过的术语对分类任务没有太多影响,则会被忽略。有时,人们将未见的标记替换为特殊符号,例如UNKNOWN_TOKEN并进行计算。
TF-IDF的替代方法:计算文档每个术语的权重的另一种方式是使用最大似然估计。在计算MLE时,您可以使用additive smoothing技术进行平滑处理,该技术也称为拉普拉斯平滑。如果您正在使用生成模型(如朴素贝叶斯算法)进行文档分类,则使用MLE。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接