我正在尝试使用sklearn将几组文本数据分类为3个类别。但在运行时遇到了
“AttributeError: lower not found”
的错误。
代码:
train, test = train_test_split(df, random_state=42, test_size=0.3, shuffle=True)X_train = train.contentsX_test = test.contentsY_train = train.categoryY_test = test.categoryclf_svc = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfVectorizer(tokenizer=',', use_idf=True, stop_words="english")), ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)), ])clf_svc = clf_svc.fit(X_train, Y_train)predicted_svc = clf_svc(X_test)print(np.mean(predicted_svc == Y_test))
数据框架(df)包含两列:contents(长文本数据)和categories(文本数据)。contents是抓取的文本,因此包含数十到数百个单词,而categories是单个单词,例如”A”、”B”。
我已经查看了stackoverflow上的过去的问题,但无法解决这个错误。
如果能知道解决方案,或者代码本身的问题,我将非常感激。
任何建议和答案都将不胜感激。
提前感谢。
回答:
要么删除步骤 ('vect', CountVectorizer())
,要么使用 TfidfTransformer
代替 TfidfVectorizer
,因为 TfidfVectorizer
期望输入为字符串数组,而 CountVectorizer()
返回的是一个出现次数的矩阵(即数值矩阵)。
默认情况下,TfidfVectorizer(..., lowercase=True)
将尝试将所有字符串转换为小写,因此会出现 “AttributeError: lower not found”
的错误信息。
此外,参数 tokenizer
期望是一个可调用的函数(function)或 None
,所以不要指定它。