使用Sklearn文本分类时遇AttributeError: lower not found错误求助
解决"AttributeError: lower not found"错误的方案
嘿,你在Sklearn文本分类的Pipeline里踩了几个典型的小坑,我来帮你捋清楚怎么解决:
错误原因拆解
这个报错主要来自三个地方:
- 冗余的向量器叠加:你同时在Pipeline里放了
CountVectorizer和TfidfVectorizer,但TfidfVectorizer本身就包含了"文本计数→TF-IDF转换"的完整流程,先过CountVectorizer会让后续的TfidfVectorizer接收到的不是原始文本,而是计数后的稀疏矩阵,自然没法调用字符串的lower()方法。 - tokenizer参数设置错误:你把
TfidfVectorizer的tokenizer设成了',',这个参数需要的是一个分词函数(比如把句子拆成单词的函数),而不是一个字符串符号,这种错误设置会让向量器完全无法正确处理文本,直接触发属性错误。 - 潜在的数据类型问题:如果你的
contents列里混了非字符串内容(比如NaN、数字),向量器在尝试对其调用lower()时也会报错。
修正后的代码
先处理数据的格式问题,再调整Pipeline的结构:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.multiclass import OneVsRestClassifier from sklearn.svm import LinearSVC # 先确保文本列是字符串类型,处理缺失值 df['contents'] = df['contents'].astype(str).fillna('') train, test = train_test_split(df, random_state=42, test_size=0.3, shuffle=True) X_train = train.contents X_test = test.contents Y_train = train.category Y_test = test.category # 修正Pipeline:去掉冗余的CountVectorizer,正确配置TfidfVectorizer clf_svc = Pipeline([ ('tfidf', TfidfVectorizer(use_idf=True, stop_words="english")), ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)) ]) # 训练并验证模型 clf_svc.fit(X_train, Y_train) accuracy = clf_svc.score(X_test, Y_test) print(f"模型准确率: {accuracy:.2f}")
额外补充
如果你需要自定义分词逻辑,可以把tokenizer参数换成合适的分词函数,比如用NLTK的分词工具:
from nltk.tokenize import word_tokenize # 替换TfidfVectorizer的配置 TfidfVectorizer(tokenizer=word_tokenize, use_idf=True, stop_words="english")
不过要记得先安装NLTK并下载对应的分词资源哦。
内容的提问来源于stack exchange,提问作者SY9
相关产品推荐
相关产品推荐

