我已经在网上搜索了关于文件'长度是非常不同的 (例如,文档长度从500字到2500字不等)
唯一的规范化我发现了关于将术语频率除以文档长度的讨论,因此导致文档的长度没有任何意义。
这种方法对于规范化tf来说是一个非常糟糕的方法。如果有的话,它会导致每个文档的tf等级具有非常大的偏差(除非所有文档都是从几乎相同的字典构造的,使用tf-idf时不是这样)
例如,让我们拿两个文件 - 一个由100个独特的单词组成,另一个由1000个独特的单词组成。 doc1中的每个单词的tf值为0.01,而在doc2中,每个单词的tf值为0.001这会导致tf-idf等级在与doc1匹配的单词时自动大于doc2
有没有人对更合适的正规化公式有什么好处?
谢谢
修改 我还看到了一种方法,说明我们应该将术语频率除以每个文档的doc的最大术语频率 这也不是解决我的问题
我在想的是,计算所有文档的最大术语频率,然后通过将每个术语频率除以最大值来标准化所有术语
很想知道你的想法
答案 0 :(得分:10)
分析的目标是什么?
如果您的最终目标是比较文档之间的相似性(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)
我们使用余弦相似性来评估这些矢量化文档的相似性,只需查看它们的方向(或方向),而不关心它们的大小(即它们的长度)。我正在评估文档1和文档2之间的余弦相似性:
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.