如何提取TfidfVectorizer的TF-IDF计算结果以掌握其计算逻辑
提取TfidfVectorizer的TF-IDF数值与计算逻辑解析
一、提取计算出的TF-IDF数值
要查看TfidfVectorizer计算出的具体数值,按以下步骤操作即可:
- 获取所有被提取的特征词(即原始文本中出现的所有标签):调用
vectorizer.get_feature_names_out()方法 - 将稀疏矩阵格式的结果转为易读的密集矩阵:调用
tfidf_matrix.toarray()方法 - 把特征词和对应数值配对,输出每个样本的TF-IDF明细
完整代码示例:
data = ['Souvenir shop|Architecture and art|Culture and history', 'Souvenir shop|Resort|Diverse cuisine|Fishing|Folk games|Beautiful scenery', 'Diverse cuisine|Resort|Beautiful scenery'] # 指定分割规则:按|分割标签,避免带空格的短语被拆分 vectorizer = TfidfVectorizer(token_pattern=r'[^|]+') tfidf_matrix = vectorizer.fit_transform(data) # 获取特征词列表 feature_names = vectorizer.get_feature_names_out() # 转为密集矩阵 dense_matrix = tfidf_matrix.toarray() # 打印每个样本的TF-IDF值 for idx, doc in enumerate(dense_matrix): print(f"样本 {idx+1} 的TF-IDF值:") for word, value in zip(feature_names, doc): if value > 0: print(f" {word}: {round(value, 4)}")
注意:默认的
token_pattern会把空格当作分隔符,导致Souvenir shop这类短语被拆成两个独立词,这很可能是你手动计算和工具输出不一致的核心原因之一。
二、默认计算逻辑解析
TfidfVectorizer默认的TF-IDF计算规则分为四步:
- 词频(TF):某个词在当前样本中出现的次数(你的案例里每个标签在单一样本中仅出现1次,所以TF值全为1)
- 逆文档频率(IDF):采用平滑公式避免IDF为0的情况,公式为:
idf(t) = log((1 + 总样本数) / (1 + 包含词t的样本数)) + 1 - 原始TF-IDF值:词频(TF) × 逆文档频率(IDF)
- L2归一化:将每个样本的TF-IDF向量除以它的L2范数(向量各元素平方和的平方根),最终让每个样本的向量长度为1
举个实际计算例子,以Souvenir shop为例:
- 总样本数=3,包含该词的样本数=2
- idf = log((1+3)/(1+2)) +1 ≈ 0.2877 +1 = 1.2877
- 原始TF-IDF=1×1.2877=1.2877
- 第一个样本的向量L2范数=√(1.2877²×3)≈2.236
- 归一化后的值=1.2877/2.236≈0.5774,和代码输出结果完全匹配
内容的提问来源于stack exchange,提问作者Khang Khang
相关产品推荐
相关产品推荐

