python - 不同长度的 tf-idf 文档

标签 python normalization tf-idf textblob

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

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

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

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

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

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

谢谢

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

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

很想知道你的想法

最佳答案

您的分析目标是什么?

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

tfidf 表示您在公共(public)向量空间中的文档。如果您随后计算这些向量之间的余弦相似度,则余弦相似度会补偿不同文档长度的影响。原因是余弦相似性评估向量的方向而不是它们的大小。我可以用 python 告诉你要点: 考虑以下(哑)文档

document1 = "apple apple banana"
document2 = "apple apple apple apple banana banana"

documents = (
    document1,
    document2)

这些文档的长度不同,但内容相同。 更准确地说,两个文档中术语的相对分布相同,但绝对频率不同。

现在,我们使用tfidf在一个公共(public)向量空间中表示这些文档:

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。

关于python - 不同长度的 tf-idf 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39704220/

相关文章:

Elasticsearch 分数禁用 IDF

scikit-learn - 如何知道NLP模型中与特定类别相关的单词?

Python从另一个字符串列表中减去字符串列表

Python 电子邮件(带 txt 和 html)

javascript - 如何将非常大的算法盟友正确规范化为相对较小的数字范围?

database - 数据库规范化和单场突破

java - File.listFiles() 使用 JDK 6 破坏 unicode 名称(Unicode 规范化问题)

Python 3.6 连接到 MS SQL Server 以处理大型数据帧

python - 计算一个衬里列表中返回 1 的元素的数量

scikit-learn - TfidfVectorizer 如何计算测试数据的分数