要理解 TfidfVectorizer,首先需要掌握 TF-IDF 的基本概念。TF-IDF(Term Frequency-Inverse Document Frequency)是一种广泛应用于信息检索和文本挖掘领域的加权技术,用于衡量一个词语在某篇文档中的重要性程度。
定义: 某个词在当前文档中出现的频率。
计算公式: TF(t) = (词 t 在文档中出现的次数) / (文档中所有词的总数)
核心思想: 一个词在文档中出现得越频繁,它对该文档的主题表达就越关键。
定义: 衡量一个词在整个语料库中的普遍性或稀有程度。
计算公式: IDF(t) = log10(总文档数 / (包含词 t 的文档数 + 1))
核心思想: 如果某个词出现在大量文档中(例如“的”、“是”这类停用词),说明其区分能力弱,应降低权重;反之,若只在少数文档中出现,则更可能具有代表性,IDF 值更高。
定义: 将词频(TF)与逆文档频率(IDF)相乘,得到最终的加权值。
计算公式: TF-IDF(t) = TF(t) × IDF(t)
整体逻辑: 一个词的重要性随其在当前文档中的出现次数正向增长,但会因其在整个语料库中的广泛出现而反向衰减。这种机制有效抑制了常见词汇的影响,突出了具有区分度的关键术语。
简而言之,TF 关注的是局部信息——即词语在单个文档内的表现;而 IDF 提供的是全局视角——反映该词在整个文档集合中的稀缺性。两者结合形成 TF-IDF,成为文本特征提取的重要工具。
TfidfVectorizer 可视为 CountVectorizer 的增强版本,集成了词频统计与 TF-IDF 权重转换功能。
其工作流程分为两个阶段:
因此可以总结为:
TfidfVectorizer = CountVectorizer + TfidfTransformer
以下代码延续前文关于分词、停用词过滤及特征选择的方法,并引入 TfidfVectorizer 进行词频统计。
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
# 示例文本数据
corpus = [
'A股国产软件概念股全线大涨,开普云、正元智慧、君逸数码等好多强势大涨,另有好多只概念股大涨。消息面上,全新一代中国操作系统——银河麒麟操作系统在“2025中国操作系统产业大会”正式发布。',
'上海壹号院五批次好多开盘,数套房源1小时开盘售罄,劲销好多。至此好多,上海壹号院今年好多累计好多开盘总销售金额超,好多继续保持全国单盘销冠位置。',
'当日,在江苏南京举行的2025江苏省城市足球联赛好多第九轮比赛中,南京队对阵盐城队。南京市在部分商场、街区等地设置好多观赛“第二现场”,使用大屏幕同步直播赛事,同时好多设有游戏互动区、烟火市集区,让球迷们度过欢乐时光。'
]
def cut_word(text):
"""
jieba中文分词
:param text: 待分词的文本
:return: 分词后用空格连接的字符a串
"""
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 原理进行分析:
# 查看第一句的TF-IDF权重(只显示权重非零的特征)
print(f"\n--- 第一句话的TF-IDF向量 ---")
feature_names = vectorizer.get_feature_names_out()
first_doc_vector = X[0].toarray()[0] # 我们只关心第一句话,所以我们取矩阵的第 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}")
输出结果为:
--- 第一句话的TF-IDF向量 ---
大涨: 0.4377
操作系统: 0.4377
中国: 0.2918
概念股: 0.2918
这段代码的核心目的在于:识别出第一句话中最能代表其内容的关键词语,并输出它们对应的 TF-IDF 权重分数,从而实现关键词提取的功能。
特征预处理是指将原始数据转换为更适合机器学习模型训练的特征表示的过程。现实世界的数据往往存在多种问题,直接影响建模效果,主要包括以下几个方面:
Scikit-learn 提供了多种处理缺失值的工具,其中 SimpleImputer 是最常用的一种。它可以自动使用指定策略填补缺失数据。以下是具体操作流程:
首先准备环境并导入必要的库(如 pandas):
pip install pandas==2.2.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
本例模拟一份“不完整的用户信息表”,包含四列字段:年龄、薪资、国家、性别。
age
其中,“年龄”
salary
和“薪资”字段各有一个
np.nan
(相当于 Excel 中的空白或 #N/A),而“国家”和“性别”为文本类别变量。
打印原始数据后可见两个 “NaN” 值,这正是我们需要处理的缺失项。
主要功能: 利用数值型特征的平均值自动填充空缺,使数据集恢复完整性。
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
# 创建示例数据,包含不同类型的问题
data = {
'age': [25, 30, np.nan, 45, 60, 30, 15], # 数值,含缺失值
'salary': [50000, 54000, 60000, np.nan, 100000, 40000, 20000], # 数值,尺度大,含缺失值
'country': ['USA', 'UK', 'China', 'USA', 'India', 'China', 'UK'], # 分类型
'gender': ['M', 'F', 'F', 'M', 'M', 'F', 'F'] # 分类型
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 策略通常为 mean(均值), median(中位数), most_frequent(众数), constant(固定值)
imputer = SimpleImputer(strategy='mean')
# 我们只对数值列进行填充
numeric_features = ['age', 'salary']
df_numeric = df[numeric_features]
# fit 计算用于填充的值(这里是均值),transform 应用填充
imputer.fit(df_numeric)
df[numeric_features] = imputer.transform(df_numeric)
print("\n处理缺失值后:")
print(df)
处理后的输出结果为:
原始数据:
age salary country gender
0 25.0 50000.0 USA M
1 30.0 54000.0 UK F
2 NaN 60000.0 China F
3 45.0 NaN USA M
4 60.0 100000.0 India M
5 30.0 40000.0 China F
6 15.0 20000.0 UK F
处理缺失值后:
age salary country gender
0 25.000000 50000.0 USA M
1 30.000000 54000.0 UK F
2 34.166667 60000.0 China F
3 45.000000 54000.0 USA M
4 60.000000 100000.0 India M
5 30.000000 40000.0 China F
6 15.000000 20000.0 UK F
核心组件如下:
# 策略通常为 mean(均值), median(中位数), most_frequent(众数), constant(固定值)
imputer = SimpleImputer(strategy='mean') # 选择“用同列的平均值填补空值”
其中
SimpleImputer
是一个“填充器”对象,通过设置参数指定了填充规则:
strategy='mean'均值填充是一种常见的数据处理方法,其原理是利用某一列中所有非空数值的平均值,来填补该列中的缺失值。例如,在“年龄”这一列中存在一个空缺值时,可以使用其余6个有效年龄数据计算出平均值,并将此值填入空白处;同理,“薪资”列也可以采用相同方式处理。
需要注意的是,这种填充方式仅适用于数值型数据,对于文本类字段(如国家、性别等分类变量)则无法进行均值计算和填充操作。
# 我们只对数值列进行填充
numeric_features = ['age', 'salary'] # 筛选出“数字类型”的列(年龄和薪资)
df_numeric = df[numeric_features] # 从原表格里单独拿出这两列
接下来执行具体的填补流程:
# fit 计算用于填充的值(这里是均值),transform 应用填充
imputer.fit(df_numeric) # 第一步:让填充器“学习”数字列的平均值
df[numeric_features] = imputer.transform(df_numeric) # 第二步:用学到的平均值填补空值
上述两个步骤构成了整个均值填充的核心机制,具体可分解为以下两个阶段:
fit
首先,填充器会扫描“年龄”和“薪资”两列的有效数据,分别计算出它们的平均值(例如,年龄的平均值约为34.17,薪资的平均值约为54000);
transform
随后,系统将计算得出的平均值自动填入对应列的缺失位置中,完成数据补全。
最后,将已完成填充的数值列重新整合回原始表格结构中,形成完整且无缺失的数据集。
df
扫码加好友,拉您进群



收藏
