Python文本分类项目出现AttributeError: lower not found报错如何解决
报错含义
AttributeError: lower not found 是因为sklearn的CountVectorizer在处理输入时,默认会对输入文本调用字符串的lower()方法做大小写转换,但你传入的输入不是文本字符串,是scipy稀疏矩阵格式的数值特征,稀疏矩阵没有lower属性,因此抛出该错误。
问题根源
你的代码存在流程逻辑冲突:
- 你提前用
TfidfVectorizer把全量原始文本转成了向量矩阵,经过SMOTE过采样后得到的x_smote已经是纯数值的稀疏矩阵,拆分后的x_train同样是数值矩阵。 - 但你后续构建的Pipeline第一步又加入了
CountVectorizer,这个组件的输入要求是原始文本字符串,传入数值矩阵自然会触发类型适配错误。
除此之外,你的流程还存在数据泄露风险:提前对全量数据集做向量化操作,会让测试集的信息泄露到训练过程中,不符合机器学习建模的规范。
修正方案
推荐采用更规范的流程,使用imblearn的Pipeline整合所有步骤,避免数据泄露:
import pandas as pd import numpy as np from imblearn.over_sampling import SMOTE from imblearn.pipeline import Pipeline as ImbPipeline from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB # 读取数据预处理 df = pd.read_csv("data/emotion_dataset_raw.csv") df["clean_text"] = df["Text"].apply(clean_text) # 先拆分原始文本和标签,不要提前做向量化 x_raw = df["clean_text"] y_raw = df["Emotion"] x_train_raw, x_test_raw, y_train, y_test = train_test_split(x_raw, y_raw, test_size=0.2, random_state=42) # 构建包含SMOTE的完整Pipeline nb = ImbPipeline([ ('vect', CountVectorizer(ngram_range=(1,2))), ('tfidf', TfidfTransformer()), ('smote', SMOTE(random_state=42)), ('clf', MultinomialNB()), ]) nb.fit(x_train_raw, y_train)
如果你希望保留之前提前过采样的逻辑,直接简化Pipeline即可:
# 删去不需要的向量化步骤,直接传入已处理好的数值特征 nb = MultinomialNB() nb.fit(x_train, y_train)
内容的提问来源于stack exchange,提问作者DevLeb2022
相关产品推荐
相关产品推荐

