AttributeError: 'int' object has no attribute 'lower' in TFIDF and CountVectorizer
AttributeError: 'int' object has no attribute 'lower' in TFIDF and CountVectorizer
我试图预测不同的 class 条目消息,并且我研究了波斯语。我使用 Tfidf 和朴素贝叶斯 class 验证我的输入数据。这是我的代码:
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(["خريد و فروش لوازم آرايشي از بانه"])))
但是当我 运行 上面的代码时,它会抛出以下异常,而我希望在输出中给我 "ads" class:
Traceback (most recent call last): File ".../multiclass-main.py",
line 27, in
X_train_counts=cv.fit_transform(X_train) File "...\sklearn\feature_extraction\text.py", line 1012, in fit_transform
self.fixed_vocabulary_) File "...sklearn\feature_extraction\text.py", line 922, in _count_vocab
for feature in analyze(doc): File "...sklearn\feature_extraction\text.py", line 308, in
tokenize(preprocess(self.decode(doc))), stop_words) File "...sklearn\feature_extraction\text.py", line 256, in
return lambda x: strip_accents(x.lower()) AttributeError: 'int' object has no attribute 'lower'
如何在此项目中使用 Tfidf 和 CountVectorizer?
如您所见,错误是AttributeError: 'int' object has no attribute 'lower'
,这意味着整数不能小写。在您的代码中的某处,它尝试小写整数对象,这是不可能的。
为什么会这样?
CountVectorizer
构造函数的参数 lowercase
默认为 True。当您调用 .fit_transform()
时,它会尝试将包含整数的输入小写。更具体地说,在您的输入数据中,您有一个项目是一个整数对象。例如,您的列表包含类似于以下内容的数据:
corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
当您将上述列表传递给 CountVectorizer
时,它会抛出此类异常。
如何解决?
这里有一些可能的解决方案来避免这个问题:
1) 将语料库中的所有行转换为字符串对象。
corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
corpus = [str (item) for item in corpus]
2) 删除语料库中的整数:
corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
corpus = [item for item in corpus if not isinstance(item, int)]
您可以设置lowercase = False
:
cv = CountVectorizer(lowercase=False)
我试图预测不同的 class 条目消息,并且我研究了波斯语。我使用 Tfidf 和朴素贝叶斯 class 验证我的输入数据。这是我的代码:
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(["خريد و فروش لوازم آرايشي از بانه"])))
但是当我 运行 上面的代码时,它会抛出以下异常,而我希望在输出中给我 "ads" class:
Traceback (most recent call last): File ".../multiclass-main.py", line 27, in X_train_counts=cv.fit_transform(X_train) File "...\sklearn\feature_extraction\text.py", line 1012, in fit_transform self.fixed_vocabulary_) File "...sklearn\feature_extraction\text.py", line 922, in _count_vocab for feature in analyze(doc): File "...sklearn\feature_extraction\text.py", line 308, in tokenize(preprocess(self.decode(doc))), stop_words) File "...sklearn\feature_extraction\text.py", line 256, in return lambda x: strip_accents(x.lower()) AttributeError: 'int' object has no attribute 'lower'
如何在此项目中使用 Tfidf 和 CountVectorizer?
如您所见,错误是AttributeError: 'int' object has no attribute 'lower'
,这意味着整数不能小写。在您的代码中的某处,它尝试小写整数对象,这是不可能的。
为什么会这样?
CountVectorizer
构造函数的参数 lowercase
默认为 True。当您调用 .fit_transform()
时,它会尝试将包含整数的输入小写。更具体地说,在您的输入数据中,您有一个项目是一个整数对象。例如,您的列表包含类似于以下内容的数据:
corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
当您将上述列表传递给 CountVectorizer
时,它会抛出此类异常。
如何解决?
这里有一些可能的解决方案来避免这个问题:
1) 将语料库中的所有行转换为字符串对象。
corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
corpus = [str (item) for item in corpus]
2) 删除语料库中的整数:
corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
corpus = [item for item in corpus if not isinstance(item, int)]
您可以设置lowercase = False
:
cv = CountVectorizer(lowercase=False)