Scikit-learn中的TfidfVectorizer
是一个强大的工具,用于将文本数据转换为TF-IDF(词频-逆文档频率)特征矩阵。以下是对其的详细介绍:
1. TF-IDF简介
TF(Term Frequency):词频,衡量词在文档中的出现频率。计算公式为:
@@ \text{TF}(t, d) = \frac{\text{词 t 在文档 d 中出现的次数}}{\text{文档 d 的总词数}} @@IDF(Inverse Document Frequency):逆文档频率,衡量词的普遍重要性。计算公式为:
@@ \text{IDF}(t) = \log \frac{\text{文档总数}}{\text{包含词 t 的文档数 + 1}} @@
(当smooth_idf=True
时,分母加1进行平滑处理)TF-IDF:综合TF和IDF,突出文档中的重要词:
@@ \text{TF-IDF}(t, d) = \text{TF}(t, d) \times \text{IDF}(t) @@
2. TfidfVectorizer的作用
将原始文本转换为TF-IDF加权特征矩阵,适用于文本分类、聚类等任务。其流程为: 1. 文本分词:按规则(如正则)提取词(token)。 2. 构建词表:统计所有文档的词,生成词汇表。 3. 计算TF-IDF:对每个词,计算其在各文档的TF-IDF值。
3. 主要参数解析
文本预处理:
lowercase=True
:转为小写。stop_words=None
:停用词列表(如'english'
)。token_pattern=r"(?u)\b\w\w+\b"
:匹配至少2字符的词的正则。
特征提取控制:
ngram_range=(1,1)
:n-gram范围,如(1,2)
包含单字和双字词。max_df=1.0
/min_df=1
:忽略高于max_df
或低于min_df
频率的词。max_features=None
:限制最大特征数。
TF-IDF计算:
use_idf=True
:启用IDF加权。smooth_idf=True
:平滑IDF,避免除零(公式中加1)。sublinear_tf=False
:若为True,TF替换为@@1 + \log(\text{TF})@@。
归一化:
norm='l2'
:对特征向量按L2范数归一化。
4. 主要属性和方法
属性:
vocabulary_
:词到特征索引的字典。idf_
:各词的IDF值数组。
方法:
fit(raw_documents)
:学习词表和IDF。transform(raw_documents)
:将文本转换为TF-IDF矩阵。fit_transform(...)
:合并fit和transform。
5. 使用示例
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
"This is the first document.",
"This document is the second document.",
"And this is the third one.",
]
vectorizer = TfidfVectorizer(stop_words='english', ngram_range=(1,2))
X = vectorizer.fit_transform(corpus)
print("特征词:", vectorizer.get_feature_names_out())
print("TF-IDF矩阵:\n", X.toarray())
输出:
- 特征词:['and', 'document', 'first', 'one', 'second', 'third']
(简化的示例)
- 矩阵为稀疏矩阵,可通过toarray()
转为稠密形式。
6. 注意事项
- 中文处理:需先分词(如用jieba),再传入
TfidfVectorizer
。 - 稀疏矩阵:输出为
scipy.sparse.csr_matrix
,节省内存。 - 新数据处理:测试集需用训练集的
vectorizer.transform()
,而非重新拟合。 - 特征维度:
ngram_range
或max_features
过大易导致维度爆炸。
7. 常见问题与技巧
- IDF平滑的作用:防止未在训练集出现的词导致除零错误。
- 归一化的选择:L2归一化常用于保持向量方向一致性。
- 参数调优:通过交叉验证调整
max_df
、min_df
等,以提升模型效果。
通过灵活调整参数,TfidfVectorizer
能够有效捕捉文本关键特征,适用于大多数文本分析任务。
Source:DeepSeek