You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:45:04