TfidfVectorizer计算TF-IDF的疑问:IDF值差异与TF值验证
TfidfVectorizer的IDF与TF计算疑问解析
一、IDF值差异的原因
你手动计算时误将ln(3)(自然对数下3的对数)算成了1.693,实际上ln(3)≈1.0986,因此ln(3/1)+1≈2.0986,这和vectorizer.idf_返回的结果完全一致。
需要注意TfidfVectorizer的参数逻辑:
- 默认启用
smooth_idf=True,此时IDF计算公式为:idf(t) = log((1 + n) / (1 + df(t))) + 1,代入你的数据会得到ln(2)+1≈1.693,这和你获取的结果不符; - 若你实际设置了
smooth_idf=False(非默认),IDF公式变为:idf(t) = log(n / df(t)) + 1,代入数值后正好得到ln(3/1)+1≈2.0986,和你得到的结果匹配。
二、TF值计算的一致性确认
你计算的"art"的TF值为0.125(1次出现/总词数8个),这和TfidfVectorizer默认的TF计算逻辑不完全一致:
- 默认
sublinear_tf=False时,TF值是词在文档中的原始出现次数,而非词频除以文档总词数; - 最终输出的TF-IDF值还会经过
norm='l2'归一化,将向量调整为单位长度。
如果要让TF计算和你的手动逻辑对齐,需修改参数:
vectorizer = TfidfVectorizer(norm=None, use_idf=False)
此时得到的结果就是词频除以文档总词数的TF值。
相关代码
data = ['Souvenir shop|Architecture and art|Culture and history', 'Souvenir shop|Resort|Diverse cuisine|Fishing|Shop games|Beautiful scenery', 'Diverse cuisine|Resort|Beautiful scenery'] vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform(data)
内容的提问来源于stack exchange,提问作者Khang Khang
相关产品推荐
相关产品推荐

