Scikit-learn Python机器学习 - 文本特征提取 - TF-IDF - TfidfVectorizer
Scikit-learn Python机器学习 - 文本特征提取 - TF-IDF - TfidfVectorizer
锋哥原创的Scikit-learn Python机器学习视频教程:
2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili
课程介绍

本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特征预处理,特征降维等),分类算法(K-临近算法,朴素贝叶斯算法,决策树等),回归与聚类算法(线性回归,欠拟合,逻辑回归与二分类,K-means算法)等。
Scikit-learn Python机器学习 - 文本特征提取 - TF-IDF - TfidfVectorizer
要理解 TfidfVectorizer,首先必须理解 TF-IDF 的含义。它是一种用于信息检索和文本挖掘的常用加权技术,用以评估一个词语对于一个语料库中的一份文档的重要程度。
-
TF (Term Frequency - 词频): 一个词在当前文档中出现的频率。
-
计算公式:
TF(t) = (词t在当前文档中出现的次数) / (当前文档中所有词的总数) -
思想: 一个词在文档中出现的次数越多,它对该文档越重要。
-
-
IDF (Inverse Document Frequency - 逆文档频率): 一个词在整个语料库中的普遍重要性。
-
计算公式:
IDF(t) = log( (总文档数) / (包含词t的文档数 + 1) )备注: log底数是10 -
思想: 如果一个词在很多文档中都出现(如“的”、“是”),那么它就是一个常见词,其重要性应该被降低(IDF值小)。反之,如果一个词只在少数几篇文档中出现,那么它就能很好地代表那些文档的特点(IDF值大)。
-
-
TF-IDF: 将两者相乘。
-
TF-IDF(t) = TF(t) * IDF(t) -
最终思想: 一个词的重要性随着它在当前文档中出现的次数成正比增加,但同时会随着它在整个语料库中出现的频率成反比下降。这有效地过滤掉了常见的词语,保留了重要的词语。
-
TfidfVectorizer 是什么?
TfidfVectorizer 可以看作是 CountVectorizer 的升级版和集成版。它的工作流程分为两步:
-
使用 CountVectorizer 的方法: 首先,它将原始文本转换为词频计数矩阵。
-
应用 TF-IDF 变换: 然后,它对第一步得到的词频矩阵进行 TF-IDF 加权计算,将原始的计数转换成一个更能体现词语重要性的权重矩阵。
简单来说:TfidfVectorizer = CountVectorizer + TfidfTransformer
核心参数详解
TfidfVectorizer 继承了 CountVectorizer 的所有参数,用于控制分词、构建词表等过程。这意味着你之前为 CountVectorizer 学的所有参数(如 max_df, min_df, stop_words, ngram_range, tokenizer 等)在这里完全适用。
除此之外,它还有自己独有的几个核心参数,主要用于控制 TF-IDF 的计算方式:
-
norm(默认'l2')
-
作用: 对每个文档(每行)进行向量归一化。
-
可选值:
-
'l2'(默认): 将每个文档的向量归一化为欧几里得范数(L2范数)为1。计算公式:v = v / sqrt(sum(v**2))。这是最常用的设置,使得不同长度的文档之间的向量可以进行比较(计算余弦相似度时直接点积即可)。 -
'l1': 将每个文档的向量归一化为曼哈顿范数(L1范数)为1。计算公式:v = v / sum(|v|)。 -
None: 不进行任何归一化。如果你后续自己进行归一化,或者使用对特征尺度不敏感的模型(如树模型),可以关闭它。
-
-
use_idf(默认True)
-
作用: 是否启用 IDF 加权。如果设置为
False,则公式中将IDF(t)=1,相当于只使用词频(TF),退化为一个归一化的CountVectorizer。 -
用途: 通常保持默认的
True来利用 IDF 的强大效果。在某些特定场景下可能会关闭。
-
smooth_idf(默认True)
-
作用: 是否平滑 IDF 权重,防止除零错误。
-
详解:
-
True(默认): 使用平滑后的 IDF 公式:idf(t) = log( (1 + 总文档数) / (1 + 包含词t的文档数) ) + 1。这是一种常见的平滑方式。 -
False: 使用原始 IDF 公式:idf(t) = log( 总文档数 / 包含词t的文档数 ) + 1(注意scikit-learn的实现中默认加了1)。
-
-
建议: 保持默认的
True,使统计更稳定。
-
sublinear_tf(默认False)
-
作用: 是否对词频(TF)进行亚线性缩放。
-
详解:
-
False(默认): 使用原始词频。 -
True: 将词频tf替换为1 + log(tf)。这样做的目的是减弱高频词出现次数过多带来的线性影响。例如,一个词出现20次,并不意味着它是出现1次的那个词的20倍重要。使用对数缩放可以缓解这种线性关系。
-
我们看一个示例:
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
# 示例文本数据
corpus = [
'A股国产软件概念股全线大涨,开普云、正元智慧、君逸数码等好多强势大涨,另有好多只概念股大涨。消息面上,全新一代中国操作系统——银河麒麟操作系统在“2025中国操作系统产业大会”正式发布。',
'上海壹号院五批次好多开盘,数套房源1小时开盘售罄,劲销好多。至此好多,上海壹号院今年好多累计好多开盘总销售金额超,好多继续保持全国单盘销冠位置。',
'当日,在江苏南京举行的2025江苏省城市足球联赛好多第九轮比赛中,南京队对阵盐城队。南京市在部分商场、街区等地设置好多观赛“第二现场”,使用大屏幕同步直播赛事,同时好多设有游戏互动区、烟火市集区,让球迷们度过欢乐时光。'
]
def cut_word(text):
"""
jieba中文分词
:return:
"""
new_text = " ".join(list(jieba.cut(text)))
return new_text
# 普通写法
new_corpus = []
for c in corpus:
new_corpus.append(cut_word(c))
print(new_corpus)
# 高手写法 推导式 一句话搞定
# new_corpus = [' '.join(list(jieba.cut(x))) for x in corpus]
# print(new_corpus)
# 初始化 TfidfVectorizer
# min_df: 忽略文档频率低于此值的词
# stop_words: 移除停用词
vectorizer = TfidfVectorizer(min_df=1,
stop_words=[line.strip() for line in open('stopWords.txt', encoding='UTF-8').readlines()])
# 学习词汇字典并转换文本数据
X = vectorizer.fit_transform(new_corpus)
# 查看生成的词汇表
print("词汇表(特征名):")
print(vectorizer.get_feature_names_out())
# 查看稠密矩阵(实际应用中矩阵通常非常稀疏,用.toarray()查看,但用X直接计算)
print("\n特征向量矩阵:")
print(X.toarray())
print("\n稀疏矩阵:")
print(X)
# 查看第一句的TF-IDF权重(只显示权重非零的特征)
print(f"\n--- 第一句话的TF-IDF向量 ---")
feature_names = vectorizer.get_feature_names_out()
first_doc_vector = X[0].toarray()[0] # 取第一行,并转换为密集数组
# 创建一个(特征名, 权重)的列表,并按权重降序排序
sorted_weights = sorted(zip(feature_names, first_doc_vector), key=lambda x: x[1], reverse=True)
# 打印权重大于0.2的特征
for word, weight in sorted_weights:
if weight > 0.2:
print(f"{word}: {weight:.4f}")
运行结果:
['A股 国产软件 概念股 全线 大涨 , 开普云 、 正 元 智慧 、 君逸 数码 等 好多 强势 大涨 , 另有 好多 只 概念股 大涨 。 消息 面上 , 全新 一代 中国 操作系统 — — 银河 麒麟 操作系统 在 “ 2025 中国 操作系统 产业 大会 ” 正式 发布 。', '上海 壹号 院五 批次 好多 开盘 , 数 套房 源 1 小时 开盘 售罄 , 劲销 好多 。 至此 好多 , 上海 壹号 院 今年 好多 累计 好多 开盘 总 销售 金额 超 , 好多 继续 保持 全国 单盘 销冠 位置 。', '当日 , 在 江苏 南京 举行 的 2025 江苏省 城市 足球联赛 好多 第九轮 比赛 中 , 南京队 对阵 盐城 队 。 南京市 在 部分 商场 、 街区 等 地 设置 好多 观赛 “ 第二 现场 ” , 使用 大屏幕 同步 直播 赛事 , 同时 好多 设有 游戏 互动 区 、 烟火 市集 区 , 让 球迷 们 度过 欢乐 时光 。']
词汇表(特征名):
['2025' 'a股' '一代' '上海' '中国' '互动' '产业' '位置' '全国' '全新' '全线' '劲销' '单盘' '南京'
'南京市' '南京队' '发布' '另有' '同步' '君逸' '售罄' '商场' '国产软件' '城市' '壹号' '大会' '大屏幕'
'大涨' '套房' '好多' '对阵' '小时' '市集' '度过' '开普云' '开盘' '强势' '当日' '批次' '操作系统' '数码'
'时光' '智慧' '概念股' '欢乐' '正式' '比赛' '江苏' '江苏省' '消息' '游戏' '烟火' '现场' '球迷' '盐城'
'直播' '第九轮' '累计' '至此' '街区' '观赛' '设有' '设置' '赛事' '足球联赛' '金额' '银河' '销冠' '销售'
'院五' '面上' '麒麟']
特征向量矩阵:
[[0.11096513 0.14590581 0.14590581 0. 0.29181161 0.
0.14590581 0. 0. 0.14590581 0.14590581 0.
0. 0. 0. 0. 0.14590581 0.14590581
0. 0.14590581 0. 0. 0.14590581 0.
0. 0.14590581 0. 0.43771742 0. 0.17234864
0. 0. 0. 0. 0.14590581 0.
0.14590581 0. 0. 0.43771742 0.14590581 0.
0.14590581 0.29181161 0. 0.14590581 0. 0.
0. 0.14590581 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0.14590581 0. 0. 0. 0.14590581 0.14590581]
[0. 0. 0. 0.303038 0. 0.
0. 0.151519 0.151519 0. 0. 0.151519
0.151519 0. 0. 0. 0. 0.
0. 0. 0.151519 0. 0. 0.
0.303038 0. 0. 0. 0.151519 0.53693738
0. 0.151519 0. 0. 0. 0.45455701
0. 0. 0.151519 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0.151519 0.151519 0.
0. 0. 0. 0. 0. 0.151519
0. 0.151519 0.151519 0.151519 0. 0. ]
[0.13097368 0. 0. 0. 0. 0.17221465
0. 0. 0. 0. 0. 0.
0. 0.17221465 0.17221465 0.17221465 0. 0.
0.17221465 0. 0. 0.17221465 0. 0.17221465
0. 0. 0.17221465 0. 0. 0.30513824
0.17221465 0. 0.17221465 0.17221465 0. 0.
0. 0.17221465 0. 0. 0. 0.17221465
0. 0. 0.17221465 0. 0.17221465 0.17221465
0.17221465 0. 0.17221465 0.17221465 0.17221465 0.17221465
0.17221465 0.17221465 0.17221465 0. 0. 0.17221465
0.17221465 0.17221465 0.17221465 0.17221465 0.17221465 0.
0. 0. 0. 0. 0. 0. ]]
稀疏矩阵:
<Compressed Sparse Row sparse matrix of dtype 'float64'
with 75 stored elements and shape (3, 72)>
Coords Values
(0, 1) 0.14590580580506213
(0, 22) 0.14590580580506213
(0, 43) 0.29181161161012426
(0, 10) 0.14590580580506213
(0, 27) 0.4377174174151864
(0, 34) 0.14590580580506213
(0, 42) 0.14590580580506213
(0, 19) 0.14590580580506213
(0, 40) 0.14590580580506213
(0, 29) 0.17234863865385786
(0, 36) 0.14590580580506213
(0, 17) 0.14590580580506213
(0, 49) 0.14590580580506213
(0, 70) 0.14590580580506213
(0, 9) 0.14590580580506213
(0, 2) 0.14590580580506213
(0, 4) 0.29181161161012426
(0, 39) 0.4377174174151864
(0, 66) 0.14590580580506213
(0, 71) 0.14590580580506213
(0, 0) 0.11096512610302138
(0, 6) 0.14590580580506213
(0, 25) 0.14590580580506213
(0, 45) 0.14590580580506213
(0, 16) 0.14590580580506213
: :
(2, 64) 0.17221464824360078
(2, 56) 0.17221464824360078
(2, 46) 0.17221464824360078
(2, 15) 0.17221464824360078
(2, 30) 0.17221464824360078
(2, 54) 0.17221464824360078
(2, 14) 0.17221464824360078
(2, 21) 0.17221464824360078
(2, 59) 0.17221464824360078
(2, 62) 0.17221464824360078
(2, 60) 0.17221464824360078
(2, 52) 0.17221464824360078
(2, 26) 0.17221464824360078
(2, 18) 0.17221464824360078
(2, 55) 0.17221464824360078
(2, 63) 0.17221464824360078
(2, 61) 0.17221464824360078
(2, 50) 0.17221464824360078
(2, 5) 0.17221464824360078
(2, 51) 0.17221464824360078
(2, 32) 0.17221464824360078
(2, 53) 0.17221464824360078
(2, 33) 0.17221464824360078
(2, 44) 0.17221464824360078
(2, 41) 0.17221464824360078
--- 第一句话的TF-IDF向量 ---
大涨: 0.4377
操作系统: 0.4377
中国: 0.2918
概念股: 0.2918
数学知识:
数学里log表示对数。简单理解,log₂8 = 3 对数就是3 反推 2的3次方就是8

更多推荐


所有评论(0)