不同长度的 tf-idf 文档
tf-idf documents of different length
我在网上搜索了关于在文档长度非常不同的情况下标准化 tf 等级的信息
(例如,文档长度从 500 字到 2500 字不等)
我发现的唯一规范化是关于在文档长度中划分术语频率,因此导致文档长度没有任何意义。
虽然这种方法对于规范化 tf.如果有的话,它会导致每个文档的 tf 等级有很大的偏差(除非所有文档都是从几乎相同的字典构建的,使用 tf-idf 时情况并非如此)
例如,让我们拿 2 个文档 - 一个包含 100 个不同的单词,另一个包含 1000 个不同的单词。 doc1 中的每个单词的 tf 为 0.01,而 doc2 中的每个单词的 tf 为 0.001
这会导致 tf-idf 等级在将单词与 doc1 匹配时自动比 doc2 大
有人对更合适的归一化公式有任何建议吗?
谢谢
编辑
我还看到了一种方法,说明我们应该将术语频率除以每个文档的文档的最大术语频率
这也不能解决我的问题
我在想的是计算所有文档的最大词频,然后通过将每个词频除以最大值
来归一化所有词
很想知道你的想法
你的分析目标是什么?
如果您的最终目标是比较文档之间的相似性(等等),那么您不应该在 tfidf 计算阶段担心文档长度。这是原因。
tfidf 以公共向量 space 表示您的文档。如果您随后计算这些向量之间的 余弦相似度 ,则余弦相似度补偿了不同文档长度的影响。原因是余弦相似性评估向量的方向而不是它们的大小。我可以用 python 告诉你要点:
考虑以下(哑)文档
document1 = "apple apple banana"
document2 = "apple apple apple apple banana banana"
documents = (
document1,
document2)
这些文档的长度不同,但内容相同。
更准确地说,两个文档中术语的相对分布相同,但绝对术语频率不同。
现在,我们使用 tfidf 将这些文档表示在一个公共向量中 space:
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。
在这种情况下,您可以看到余弦相似度不受文档长度的影响,并且捕获了原始文档中术语的相对分布相同的事实!如果您想将此信息表示为文档之间的 "distance",那么您可以简单地执行:
1 - cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
当文档相似时(无论它们的长度如何),该值将趋向于 0,而当它们不相似时,该值将趋向于 1。
我在网上搜索了关于在文档长度非常不同的情况下标准化 tf 等级的信息 (例如,文档长度从 500 字到 2500 字不等)
我发现的唯一规范化是关于在文档长度中划分术语频率,因此导致文档长度没有任何意义。
虽然这种方法对于规范化 tf.如果有的话,它会导致每个文档的 tf 等级有很大的偏差(除非所有文档都是从几乎相同的字典构建的,使用 tf-idf 时情况并非如此)
例如,让我们拿 2 个文档 - 一个包含 100 个不同的单词,另一个包含 1000 个不同的单词。 doc1 中的每个单词的 tf 为 0.01,而 doc2 中的每个单词的 tf 为 0.001
这会导致 tf-idf 等级在将单词与 doc1 匹配时自动比 doc2 大
有人对更合适的归一化公式有任何建议吗?
谢谢
编辑 我还看到了一种方法,说明我们应该将术语频率除以每个文档的文档的最大术语频率 这也不能解决我的问题
我在想的是计算所有文档的最大词频,然后通过将每个词频除以最大值
来归一化所有词很想知道你的想法
你的分析目标是什么?
如果您的最终目标是比较文档之间的相似性(等等),那么您不应该在 tfidf 计算阶段担心文档长度。这是原因。
tfidf 以公共向量 space 表示您的文档。如果您随后计算这些向量之间的 余弦相似度 ,则余弦相似度补偿了不同文档长度的影响。原因是余弦相似性评估向量的方向而不是它们的大小。我可以用 python 告诉你要点: 考虑以下(哑)文档
document1 = "apple apple banana"
document2 = "apple apple apple apple banana banana"
documents = (
document1,
document2)
这些文档的长度不同,但内容相同。 更准确地说,两个文档中术语的相对分布相同,但绝对术语频率不同。
现在,我们使用 tfidf 将这些文档表示在一个公共向量中 space:
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。
在这种情况下,您可以看到余弦相似度不受文档长度的影响,并且捕获了原始文档中术语的相对分布相同的事实!如果您想将此信息表示为文档之间的 "distance",那么您可以简单地执行:
1 - cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
当文档相似时(无论它们的长度如何),该值将趋向于 0,而当它们不相似时,该值将趋向于 1。