关于Scikit-learn中TFIDF矩阵得分及norm参数的技术问询
Scikit-learn中TFIDF得分计算及
norm参数影响解析 我来一步步拆解你关心的TFIDF计算逻辑,以及norm参数对结果的影响——咱们就盯着你指定的第一个文档('The wine was lovely')里的特征wine来算,绝对清晰明了。
第一步:整理测试场景的基础数据
首先把测试文档去掉停用词(stop_words='english'会过滤掉The、was这类无意义词),统计关键信息:
- 文档1(对应
test_doc[0]):处理后为['wine', 'lovely'],总有效词数2,wine出现1次 - 所有文档的总数量
N=4 - 特征
wine的文档频率DF=2(出现在文档1和文档3中)
第二步:TFIDF的核心公式(Scikit-learn默认实现)
Scikit-learn的TfidfVectorizer默认参数下,TFIDF计算分为四部分:
- 逆文档频率(IDF):默认开启
smooth_idf=True(避免词从未出现时IDF无限大),公式为:IDF(t) = ln((N + 1)/(DF(t) + 1)) + 1 - 词频(TF):默认
sublinear_tf=False,直接取词在文档中的原始出现次数 - TFIDF原始得分:
TF * IDF - 归一化(由
norm参数控制):指定norm=l2会对文档向量做L2归一化;norm=None则跳过这一步
第三步:norm=None时的wine得分计算
先计算wine的IDF:
IDF(wine) = ln((4+1)/(2+1)) + 1 = ln(5/3) + 1 ≈ 0.5108 + 1 = 1.5108
文档1中wine的TF是1(出现1次),所以原始TFIDF得分:
TFIDF(wine, doc1) = 1 * 1.5108 ≈ 1.5108
第四步:norm=l2时的wine得分计算
L2归一化需要先算出文档1所有特征的原始TFIDF得分,再除以该文档向量的L2范数:
- 先算文档1中另一个特征
lovely的IDF和TFIDF:IDF(lovely) = ln((4+1)/(1+1)) +1 = ln(5/2)+1 ≈0.9163+1=1.9163 TFIDF(lovely, doc1) =1 *1.9163≈1.9163 - 计算文档1未归一化向量的L2范数:
L2范数 = sqrt( (1.9163)^2 + (1.5108)^2 ) ≈ sqrt(3.672 + 2.282) ≈ sqrt(5.954) ≈2.440 - 最后得到归一化后的
wine得分:归一化得分 = 1.5108 / 2.440 ≈0.619
总结norm参数的影响
norm=None:直接保留TF*IDF的原始数值,得分反映词在文档中的重要性绝对值,不同文档的得分范围差异可能很大norm=l2:将每个文档的TFIDF向量缩放为单位向量,得分是相对值,保证同一文档内所有特征的得分平方和为1,方便不同文档之间的向量比较
内容的提问来源于stack exchange,提问作者ChatNoir
相关产品推荐
相关产品推荐

