TF-IDF 不同长度的文档

10
我在网络上搜索了有关归一化具有非常不同文档长度(例如,文档长度从500个单词到2500个单词)时tf分数的方法。我发现唯一的归一化方法是将词项频率除以文档长度,从而使文档长度没有任何意义。然而,这种方法实际上是一种非常糟糕的tf归一化方法,因为它会导致每个文档的tf分数存在非常大的偏差(除非所有文档基本上都使用相同的词典,但在使用tf-idf时这并不是普遍情况)。比如说,如果我们拿两个文档来举例,一个由100个独特单词组成,另一个由1000个独特单词组成,那么doc1中的每个单词的tf将为0.01,而在doc2中每个单词的tf将为0.001。这将导致当匹配doc1和doc2的单词时,tf-idf分数自动更高。请问是否有更合适的归一化公式?我也看到一种方法声称我们应该将词项频率除以每个文档的最大词项频率,但这也不能解决我的问题。我的想法是计算所有文档的最大词项频率,然后通过将每个词项频率除以最大值来对所有术语进行归一化。请问您对我的想法有何看法?谢谢。
1个回答

17

你的分析目标是什么?

如果你的最终目标是比较文档之间的相似性(等同于等),则在tfidf计算阶段不必担心文档长度。原因如下。

tfidf表示您的文档处于共同的向量空间中。如果然后计算这些向量之间的余弦相似度,则余弦相似度会补偿不同文档长度的影响。原因是余弦相似度评估向量的方向而不是它们的大小。我可以用Python证明这一点:

考虑以下(愚蠢的)文件:

document1 = "apple apple banana"
document2 = "apple apple apple apple banana banana"

documents = (
    document1,
    document2)

这些文档的长度不同,但它们的内容相同。 更准确地说,两个文档中术语的相对分布相同,但绝对词频不同。

现在,我们使用tfidf将这些文档表示为一个共同的向量空间:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)

我们使用余弦相似度来评估这些向量化文件的相似性,只考虑它们的方向而不关心它们的大小(即长度)。我正在评估文档一和文档二之间的余弦相似度:

from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])

结果为1。请记住,当两个向量的方向完全相同时,它们之间的余弦相似度等于1;当它们正交时,相似度为0;当向量方向相反时,相似度为-1。

在本例中,您可以看到余弦相似度不受文档长度的影响,并捕获了原始文档中术语的相对分布相同的事实!如果您想将此信息表达为文档之间的“距离”,那么只需执行以下操作:

1 - cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])

当文档相似(无论长度如何)时,此值趋近于0;当文档不相似时,此值趋近于1。


2
当我们想要将TFIDF向量用作文本分类的特征时怎么办?正如原贴中所述,文档长度可能会影响这些值...但对于分类有关系吗? - ongenz
你好, 我这里有一个疑问。在进行tfidf转换后,我有两个不同形状的向量。现在当我尝试对这些向量执行cosine_similarity时,它会给出一个错误,说是不兼容的维度。 有没有什么办法可以解决这种情况? - akshit bhatia
@akshitbhatia 你得到不同形状的向量是因为向量中的每个元素对应一个术语。你应该只包括在所有文档中都出现的术语,或将这些术语在所有其他文档中设置为零。 - scign

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