AttributeError: у объекта 'int' нет атрибута 'lower' в TFIDF и CountVectorizer - PullRequest
0 голосов
/ 31 декабря 2018

Я пытался предсказать разные классы входных сообщений, и я работал на персидском языке.Я использовал 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(["خريد و فروش لوازم آرايشي از بانه"])))

Но когда я запускаю приведенный выше код, он выдает следующее исключение, в то время как я ожидаю, что в выводе у меня будет класс "ads":

Traceback(последний вызов был последним): файл "... / multiclass-main.py", строка 27, в файле X_train_counts = cv.fit_transform (X_train), файл "... \ sklearn \ feature_extraction \ text.py", строка 1012,в fit_transform self.fixed_vocabulary_) Файл "... sklearn \ feature_extraction \ text.py", строка 922, в _count_vocab для объекта в анализ (документ): файл "... sklearn \ feature_extraction \ text.py", строка 308,в tokenize (preprocess (self.decode (doc))), stop_words) Файл "... sklearn \ feature_extraction \ text.py", строка 256, взамен лямбда x: strip_accents (x.lower ()) AttributeError: 'int'У объекта нет атрибута' ниже '

как я могу использовать Tfidf и CountVectorizer в этом проекте?

Ответы [ 2 ]

0 голосов
/ 27 августа 2019

Вы можете установить lowercase = False:

cv = CountVectorizer(lowercase=False)
0 голосов
/ 31 декабря 2018

Как видите, ошибка 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)]
...