不同长度的tf-idf文档

2024-03-25

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

我发现的唯一标准化讨论是将术语频率除以文档的长度,因此导致文档的长度没有任何意义。

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

例如,让我们看 2 个文档 - 一个由 100 个唯一单词组成,另一个由 1000 个唯一单词组成。 doc1 中每个单词的 tf 为 0.01,而 doc2 中每个单词的 tf 为 0.001

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

有人对更合适的标准化公式有任何建议吗?

谢谢

edit我还看到了一种方法,指出我们应该将每个文档的术语频率除以该文档的最大术语频率 这也不能解决我的问题

我在想的是,计算所有文档的最大术语频率,然后通过将每个术语频率除以最大术语来标准化所有术语

很想知道你的想法


您分析的目标是什么?

如果您的最终目标是比较文档之间的相似性(等等),您不应该在 tfidf 计算阶段担心文档长度。这就是原因。

The 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不同长度的tf-idf文档 的相关文章

随机推荐