列表无lower属性引发AttributeError:文本预处理类问题排查
问题解决:Pipeline中预处理类与CountVectorizer的输入格式不兼容错误
问题背景
训练数据与标签均为列表,执行Pipeline拟合时抛出expected str or bytes like object或list has no attribute lower错误,问题根源在自定义文本预处理类与后续组件的输入格式不匹配。
错误原因
自定义NLTKPreprocessor类的transform方法返回嵌套列表(每个文档被处理为token列表,最终输出结构为[[token1, token2,...], [tokenA, tokenB,...]]),但后续的CountVectorizer默认仅接受字符串或字符串列表作为输入。当CountVectorizer接收到列表类型的输入时,会尝试调用字符串专属方法(如lower()),直接触发属性错误。
解决方案
两种可行修正方式,任选其一即可:
方式1:修改预处理类输出为字符串格式
调整NLTKPreprocessor的transform方法,将每个文档的token列表拼接为空格分隔的字符串,适配CountVectorizer的默认输入要求:
class NLTKPreprocessor(BaseEstimator, TransformerMixin): # 其余方法保持不变 def transform(self, X): return [ ' '.join(self.tokenize(doc)) for doc in X ]
方式2:修改CountVectorizer参数适配列表输入
保留预处理类的嵌套列表输出,修改CountVectorizer的analyzer参数,使其直接接受已分词的列表作为输入:
from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer from sklearn.linear_model import SGDClassifier text_clf = Pipeline([ ('preprocess', NLTKPreprocessor()), ('vect', CountVectorizer(analyzer=lambda x: x)), # 关键修改 ('tfidf', TfidfTransformer(smooth_idf=True, use_idf=True)), ('clf', SGDClassifier(loss='log', penalty='l2', alpha=1e-3, random_state=42)), ])
额外注意事项
确保代码导入了所有必要模块:
from sklearn import metrics from sklearn.metrics import accuracy_score
内容的提问来源于stack exchange,提问作者Shivam Panchal
相关产品推荐
相关产品推荐

