TF-IDF (Term Frequency-Inverse Document Frequency) 是一种统计方法,用于评估一个词对一个文档集或语料库中的某一个文档的重要性。TfidfVectorizer 是 CountVectorizer 的扩展,它结合了词频(TF)和逆文档频率(IDF),生成更有效的文本表示。
计算公式:
其中:
TfidfVectorizer 本质上是 CountVectorizer 和 TfidfTransformer 的组合, 先使用 CountVectorizer 计算词频,再使用 TfidfTransformer 应用IDF缩放。
关键参数详解 TfidfVectorizer 继承了 CountVectorizer 的所有参数,并增加了以下特有参数:
参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
norm | ‘l1’, ‘l2’, None | ‘l2’ | 归一化方式 |
use_idf | bool | True | 是否使用IDF |
smooth_idf | bool | True | 是否在IDF计算中加1平滑 |
sublinear_tf | bool | False | 是否应用次线性TF缩放(tf = 1 + log(tf)) |
核心方法 TfidfVectorizer 继承了 CountVectorizer 的所有方法,并增加了idf_属性,用于存储计算出的IDF值
场景 | 选择 |
|---|---|
简单词频统计 | CountVectorizer |
大多数文本分类任务 | TfidfVectorizer |
中文文本处理 | TfidfVectorizer + jieba分词 |
需要解释性 | TfidfVectorizer(可查看IDF值) |
后续需词频信息 | CountVectorizer |
常用场景的参数配置
2.1 预处理标准化(统一处理大小写、特殊字符等)
CountVectorizer(lowercase=True)2.2 合理设置n-gram范围:
# 文本分类通常(1,2)足够,信息检索可能需要(1,3)
TfidfVectorizer(ngram_range=(1, 2))2.3 频率阈值设置:
# 避免极端高频/低频词
TfidfVectorizer(max_df=0.8, min_df=2)2.4 特征数量控制:
# 防止维度灾难
TfidfVectorizer(max_features=5000)2.5 内存优化(大数据):
# - 限制特征数量
# - 使用HashingVectorizer
# - 分批处理3. 程序实现
import numpy as np
import jieba
import sklearn
from sklearn.feature_extraction.text import TfidfVectorizer
text = ["自然语言处理是人工智能处理的一个重要领域。",
"自然语言处理和深度学习有着密切的关系。",
"自然语言处理有很多自然语言相关的应用。",
"深度学习是机器学习的一个分支。",
]
words_list = [jieba.lcut(t) for t in text]
words_seg_str = [" ".join(t) for t in words_list]
print("分词后的文本:",words_list_str)
tfidf_vec = TfidfVectorizer()
words_tfidf = tfidf_vec.fit_transform(words_seg_str)
print("TF-IDF及其模型特征向量:")
print(tfidf_vec.get_feature_names_out())
print("IDF值:", np.round(tfidf_vec.idf_,1))
print(np.round(words_tfidf.toarray(),1))