AttributeError:'int'对象在TFIDF和CountVectorizer中没有属性“ lower”

had*_*ard 4 python machine-learning tf-idf scikit-learn

我试图预测输入消息的不同类别,并且我使用波斯语。我使用Tfidf和Naive-Bayes对输入数据进行分类。这是我的代码:

import pandas as pd
df=pd.read_excel('dataset.xlsx')
col=['label','body']
df=df[col]
df.columns=['label','body']
df['class_type'] = df['label'].factorize()[0]
class_type_df=df[['label','class_type']].drop_duplicates().sort_values('class_type')
class_type_id = dict(class_type_df.values)
id_to_class_type = dict(class_type_df[['class_type', 'label']].values)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
features=tfidf.fit_transform(df.body).toarray()
classtype=df.class_type
print(features.shape)
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB 
X_train,X_test,y_train,y_test=train_test_split(df['body'],df['label'],random_state=0)
cv=CountVectorizer()
X_train_counts=cv.fit_transform(X_train)
tfidf_transformer=TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
clf = MultinomialNB().fit(X_train_tfidf, y_train)
print(clf.predict(cv.transform(["???? ? ???? ????? ?????? ?? ????"])))
Run Code Online (Sandbox Code Playgroud)

但是,当我运行上面的代码时,当我期望在输出中给我“ ads”类时,它将引发以下异常:

追溯(最近一次通话最近):X_train_counts = cv.fit_transform(X_train)中的文件“ ... / multiclass-main.py”,第27行,文件“ ... \ sklearn \ feature_extraction \ text.py”,行1012 (在fit_transform self.fixed_vocabulary_)中,文件analyst.doc中_count_vocab中的文件“ ... sklearn \ feature_extraction \ text.py”,第922行:文件“ ... sklearn \ feature_extraction \ text.py”,行308 ,在tokenize(preprocess(self.decode(doc)))中,stop_words)文件“ ... sklearn \ feature_extraction \ text.py”,行256,返回lambda x:strip_accents(x.lower())AttributeError:' int'对象没有属性“ lower”

如何在此项目中使用Tfidf和CountVectorizer?

Ami*_*mir 6

如您所见,错误是AttributeError: 'int' object has no attribute 'lower'意味着整数不能小写。它会在代码中的某个位置尝试将小写的小写对象变为小写,这是不可能的。

为什么会这样?

CountVectorizer构造函数的参数lowercase默认为True。调用时,.fit_transform()它会尝试将包含整数的输入转换为小写。更具体地说,在输入数据中,您有一个作为整数对象的项目。例如,您的列表包含类似于以下内容的数据:

 corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
Run Code Online (Sandbox Code Playgroud)

当您将上面的列表传递给CountVectorizer它时,将引发此类异常。

如何解决?

这里是一些避免此问题的解决方案:

1)将语料库中的所有行转换为字符串对象。

 corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
 corpus = [str (item) for item in corpus]
Run Code Online (Sandbox Code Playgroud)

2)删除语料库中的整数:

corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
corpus = [item for item in corpus if not isinstance(item, int)]
Run Code Online (Sandbox Code Playgroud)