当文档长度非常不同时(例如,文档长度从500字到2500字不等),我搜索了关于规范tf等级的网页。
我发现的唯一的规范化讨论是将术语频率除以文档的长度,从而导致文档的长度没有任何意义。
但是,这种方法对tf的规范化来说是非常糟糕的方法。如果有的话,这会导致每个文档的tf等级有很大的偏差(除非所有文档都是从几乎相同的字典中构造的,而使用tf-国防军时则不是这样)。
例如,让我们拿两个文件-一个由100个独特的词,另一个1000个独特的词。doc1中的每个单词的tf为0.001,而在doc2中,每个单词的tf为0.001。
这使得tf-idf等级在与doc1匹配时会自动大于doc2。
有没有人建议一个更合适的正规化配方?
谢谢
编辑我还看到了一种方法,说明我们应该用文档的最大术语频率除以每个文档,这也解决不了我的问题
我所想的是,从所有文档中计算出最大术语频率,然后通过将每个术语频率除以最大值来规范所有术语。
想知道你是怎么想的
发布于 2016-11-19 17:22:08
你分析的目的是什么?
如果您的最终目标是比较文档之间的相似性(et相似),那么您不应该在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。
https://stackoverflow.com/questions/39704220
复制相似问题