tf-idf不同长度的文件

Sha*_*ein 7 python normalization tf-idf textblob

我在网上搜索了关于文件长度差别很大的情况下的tf等级标准化(例如,文件长度从500字到2500字不等)

唯一正规化我发现谈论将术语频率除以文档的长度,因此导致文档的长度没有任何意义.

这种方法对于规范化tf来说是一个非常糟糕的方法.如果有的话,它会导致每个文档的tf等级具有非常大的偏差(除非所有文档都是从几乎相同的字典构造的,使用tf-idf时不是这种情况)

例如,我们可以获取2个文档 - 一个包含100个唯一单词,另一个包含1000个唯一单词.doc1中的每个单词的tf值为0.01,而在doc2中,每个单词的tf值为0.001

当使用doc1与doc2匹配单词时,这会导致tf-idf等级自动变大

有没有人有任何更合适的正规化配方?

谢谢

编辑 我还看到一种方法,说明我们应该将术语频率除以每个文档的doc的最大术语频率,这也解决了我的问题

我在想的是,计算所有文档的最大术语频率,然后通过将每个术语频率除以最大值来对所有术语进行归一化

我很想知道你的想法

小智 11

分析的目标是什么?

如果您的最终目标是比较文档之间的相似性(et simila),那么您不应该在tfidf计算阶段对文档长度感到烦恼.这就是原因.

TFIDF代表了一个共同的向量空间文档.然后,如果计算这些向量之间的余弦相似度,则余弦相似性可以补偿不同文档长度的影响.原因是余弦相似性评估向量的方向而不是它们的大小.我可以用python告诉你一点:考虑以下(哑)文档

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

documents = (
    document1,
    document2)
Run Code Online (Sandbox Code Playgroud)

这些文件的长度不同,但内容相同.更确切地说,两个文件中术语的相对分布是相同的,但绝对术语频率不是.

现在,我们使用tfidf在公共向量空间中表示这些文档:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
Run Code Online (Sandbox Code Playgroud)

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

from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,您可以看到余弦相似度不受文档长度的影响,并且捕获了原始文档中术语的相对分布相同的事实!如果您想将此信息表示为文档之间的"距离",那么您可以简单地执行以下操作:

1 - cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
Run Code Online (Sandbox Code Playgroud)

当文档相似时(无论长度如何),此值将趋向于0,当它们不相似时,该值将趋向于1.

  • 当我们想使用 TFIDF 向量作为文本分类的特征时呢?正如 OP 所说,文档长度会对这些值产生影响……但这对分类有影响吗? (2认同)