如何手动计算与Sklearn TfidfVectorizer(binary=True)一致的TF-IDF值?
手动计算与sklearn一致的TF-IDF值(binary=True场景)
先明确TfidfVectorizer(binary=True)的核心规则
- 词频(TF):binary=True时,TF不是出现次数,而是该词在文档中是否出现——出现记1,不出现记0
- 逆文档频率(IDF):sklearn默认用平滑版公式:
IDF = ln((总文档数 + 1)/(包含该词的文档数 + 1)) + 1 - 最终TF-IDF:先算
TF * IDF,再对每个文档做L2归一化(每个值除以该文档所有TF-IDF值的平方和的平方根)
结合你的示例计算
你的示例有2篇文档:
- 文档0:
bad delivery - 文档1:
bad product
总文档数N=2
步骤1:计算每个词的IDF
先统计每个词的出现文档数:
bad:出现在2篇文档delivery:出现在1篇文档product:出现在1篇文档
代入公式计算IDF:
IDF(bad) = ln((2+1)/(2+1)) + 1 = ln(1) + 1 = 0 + 1 = 1IDF(delivery) = ln((2+1)/(1+1)) + 1 ≈ 0.4055 + 1 = 1.4055IDF(product) = ln((2+1)/(1+1)) + 1 ≈ 1.4055
步骤2:计算原始TF-IDF(TF*IDF)
- 文档0:
bad: 1*1 = 1delivery: 1*1.4055 ≈ 1.4055product: 0*1.4055 = 0
- 文档1:
bad: 1*1 = 1delivery: 0*1.4055 = 0product: 1*1.4055 ≈ 1.4055
步骤3:对每个文档做L2归一化
L2归一化公式:归一化后的值 = 原始值 / sqrt(文档内所有原始值的平方和)
文档0的平方和:
1² + (1.4055)² + 0² ≈ 1 + 1.9754 = 2.9754
平方根:sqrt(2.9754) ≈ 1.725
归一化结果:bad: 1/1.725 ≈ 0.5797delivery: 1.4055/1.725 ≈ 0.8148product: 0
文档1的平方和与平方根和文档0相同(
1² + 0² + (1.4055)² ≈ 2.9754,平方根≈1.725)
归一化结果:bad: 1/1.725 ≈ 0.5797delivery: 0product: 1.4055/1.725 ≈ 0.8148
这个结果和你代码输出完全一致。
内容的提问来源于stack exchange,提问作者Renu Hanjan
相关产品推荐
相关产品推荐

