TfidfVectorizer 文本特征提取完整教程
【摘要】 核心:fit_transform () 用于训练集(学习词典 + IDF);transform () 仅转换测试集,不能再 fit,避免数据泄露输入格式:每条文本是 1 个字符串,词语用空格分隔。英文自带分割;中文必须手动分词。1. 英文完整示例from sklearn.feature_extraction.text import TfidfVectorizer# 语料,每条是一篇文档,单词...
核心:fit_transform () 用于训练集(学习词典 + IDF);transform () 仅转换测试集,不能再 fit,避免数据泄露输入格式:每条文本是 1 个字符串,词语用空格分隔。英文自带分割;中文必须手动分词。
1. 英文完整示例
from sklearn.feature_extraction.text import TfidfVectorizer
# 语料,每条是一篇文档,单词空格隔开
corpus = [
"bawangchaji beer tastes good",
"milk tea sister looks pretty",
"beer is very good"
]
# 实例化tfidf对象
tfidf = TfidfVectorizer(
stop_words="english", # 开启英文停用词
max_features=1000, # 最多保留多少特征词
ngram_range=(1,1) # 只用1元词
)
# ----------------训练集:fit_transform 学习词典、IDF,同时输出特征矩阵----------------
X = tfidf.fit_transform(corpus)
print("特征词(矩阵每一列对应的单词):")
print(tfidf.get_feature_names_out())
print("\n词到列下标的映射:")
print(tfidf.vocabulary_)
print("\n稀疏矩阵(节省内存):")
print(X)
print("\n稠密矩阵,元素就是TF‑IDF权重:")
print(X.toarray())
2. 训练集、测试集标准写法(重点!)
train_docs = ["apple banana", "banana orange"]
test_docs = ["apple orange"]
tfidf = TfidfVectorizer()
# 训练集:fit+transform,构建词典和idf
X_train = tfidf.fit_transform(train_docs)
# 测试集:只transform!!不fit!复用训练集学到的词典和idf
X_test = tfidf.transform(test_docs)
3. 中文使用要点
TfidfVectorizer不会中文分词,需要先用 jieba 分词,再用空格拼接。
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
corpus_cn = [
"霸王茶姬啤酒真好喝",
"奶茶妹妹真好看"
]
# 分词处理,转空格分隔字符串
processed = []
for s in corpus_cn:
words = jieba.lcut(s)
processed.append(" ".join(words))
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(processed)
print(X.toarray())
print(tfidf.get_feature_names_out())
常用参数
TfidfVectorizer(
stop_words="english", # 英文停用词;中文要自己传集合
max_features=500, # 取词频最高的N个词做特征
ngram_range=(1,2), # 同时提取1元、2元词组
use_idf=True, # True=TF‑IDF;False=只用TF词频
)
返回对象说明
- 返回是scipy 稀疏矩阵,适合大数据,节约内存;
.toarray()转为 numpy 二维数组,小数据集使用,大数据不要调用,会占大量内存;get_feature_names_out():矩阵每一列对应的词语;- 默认开启 L2 归一化:每一行文档向量的模等于 1。
口诀
fit_transform():学知识 + 做转换,只用在训练集
transform():只转换,不学新知识,只用在测试集常见错误
- 中文直接传入原始句子,不分词 → 把整句话当成 1 个特征;
- 测试集使用
fit_transform(),造成数据泄露; - 把 list 直接传入,必须是字符串列表。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)