你分析的目标是什么?
如果您的最终目标是比较文档之间的相似性(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。