不同长度的Tf-idf文档



我已经在网上搜索了文档长度差异很大的情况下的tf评分的规范化(例如,文档长度从500字到2500字不等)

我发现的唯一的规范化是关于在文档的长度中划分术语频率,从而导致文档的长度没有任何意义。

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

为例,我们取两个文档——一个包含100个唯一单词,另一个包含1000个唯一单词。doc1中的每个单词的tf值为0.01,而doc2中的每个单词的tf值为0.001

这将导致tf-idf等级在与doc1而不是doc2匹配单词时自动变大

有谁有更合适的规范化公式的建议吗?

谢谢

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

我想的是,从所有文档中计算最大词频率,然后通过将每个词频率除以最大

来规范化所有词。

很想知道你的想法

您分析的目标是什么?

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

最新更新