10

我在网上搜索了有关在文档长度非常不同的情况下对 tf 等级进行规范化的信息(例如,文档长度从 500 字到 2500 字不等)

我发现的唯一规范化是关于在文档长度中划分词频,因此导致文档长度没有任何意义。

这种方法虽然对于标准化 tf. 如果有的话,它会导致每个文档的 tf 等级有很大的偏差(除非所有文档都是从几乎相同的字典构建的,使用 tf-idf 时不是这种情况)

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

这会导致 tf-idf 等级在与 doc1 匹配的单词时自动大于 doc2

有没有人对更合适的归一化公式有任何建议?

谢谢你

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

我在想的是从所有文档中计算最大词频,然后通过将每个词频除以最大值来归一化所有词

很想知道你的想法

4

1 回答 1

15

你分析的目标是什么?

如果您的最终目标是比较文档之间的相似性(et simila),那么您不应该在 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。

于 2016-11-19T17:22:08.903 回答