Scikit-learn不解析文本,需用TfidfVectorizer或CountVectorizer将字符串转为数值矩阵;直接传字符串给fit()会报错,因其只接受二维数组;两者默认小写、分词、去标点,但不自动做词干提取或停用词扩展。

Scikit-learn 本身不解析文本,它只做数值化转换;真正提取特征靠的是 TfidfVectorizer 或 CountVectorizer 这类转换器,它们把原始字符串变成模型能吃的数字矩阵。
为什么直接传字符串给 fit() 会报错?
因为 fit() 和 fit_transform() 期待的是二维数组(如 [[1, 2], [3, 4]]),而原始文本是字符串列表(如 ["hello world", "goodbye world"])。必须先用向量化器“翻译”一遍。
-
CountVectorizer只统计词频,适合简单场景或作为 baseline -
TfidfVectorizer在词频基础上除以逆文档频率,能压制高频无意义词(比如“的”“and”) - 两者都默认小写、分词(按空格)、过滤标点,但不会做词干提取或停用词扩展——得手动配
stop_words或tokenizer
TfidfVectorizer 的几个关键参数怎么选?
不同参数直接影响特征维度和泛化能力,不是调参,是根据任务定策略。
-
max_features=5000:限制最多保留 5000 个高频词,避免稀疏矩阵爆炸(尤其语料少时) -
ngram_range=(1, 2):启用 unigram + bigram,能捕获“机器学习”这种组合,但维度翻倍,慎用 -
min_df=2:词在至少 2 个文档中出现才保留,过滤拼写错误或极冷门词 -
max_df=0.95:出现在 95% 文档里的词(如“产品”“服务”)直接丢掉,防止主导特征空间
训练集和测试集必须用同一个 TfidfVectorizer 实例
否则维度对不上,transform() 会报 ValueError: Vocabulary wasn't fitted 或维度不匹配。
立即学习“Python免费学习笔记(深入)”;
- ✅ 正确做法:
vec = TfidfVectorizer().fit(train_texts),再用vec.transform(test_texts) - ❌ 错误做法:分别对训练集和测试集调
fit_transform(),导致两套 vocab 和权重 - 如果后续要部署,记得用
joblib.dump(vec, "vectorizer.pkl")保存 fitted 向量化器,别只存数据
特征提取这步看着简单,但 vectorizer 的 vocabulary_ 字典一旦固化,新增词就永远进不来;线上遇到未登录词(OOV),只能靠预处理兜底(比如统一替换成 <UNK>),而不是指望向量化器自动处理。


















