Столкновение с attributeerror: объект 'list' не имеет атрибута 'lower'

Я разместил свои образцы данных поезда, а также тестовые данные вместе со своим кодом. Я пытаюсь использовать алгоритм Наивного Байеса для обучения модели.

Но в обзорах я получаю список list. Итак, я думаю, что мой код не работает со следующей ошибкой:

return lambda x: strip_accents(x.lower())
AttributeError: 'list' object has no attribute 'lower'

Может ли кто-нибудь из вас помочь мне в том же, что и я новичок в python ....

train.txt:

review,label
Colors & clarity is superb,positive
Sadly the picture is not nearly as clear or bright as my 40 inch Samsung,negative

test.txt:

review,label
The picture is clear and beautiful,positive
Picture is not clear,negative

Мой код:

from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB
from sklearn.metrics import confusion_matrix
from sklearn.feature_extraction.text import CountVectorizer

def load_data(filename):

    reviews = list()
    labels = list()
    with open(filename) as file:
        file.readline()
        for line in file:
            line = line.strip().split(',')
            labels.append(line[1])
            reviews.append(line[0].split())


    return reviews, labels

X_train, y_train = load_data('/Users/7000015504/Desktop/Sep_10/sample_train.csv')
X_test, y_test = load_data('/Users/7000015504/Desktop/Sep_10/sample_test.csv')


clf = CountVectorizer()
X_train_one_hot =  clf.fit(X_train)
X_test_one_hot = clf.transform(X_test)

bnbc = BernoulliNB(binarize=None)
bnbc.fit(X_train_one_hot, y_train)

score = bnbc.score(X_test_one_hot, y_test)
print("score of Naive Bayes algo is :" , score)
lower() не является атрибутом list. Попробуйте преобразовать его в массив numpy. Тогда .lower() должен работать.
berkelem 10.09.2018 08:37

где в вашем коде return lambda x: strip_accents(x.lower())?

Mehrdad Pedramfar 10.09.2018 08:46

Это простой фрагмент кода. Вы можете справиться с этим самостоятельно, 😂

user9477964 10.09.2018 08:48
2
3
5 166
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно перебрать каждый элемент в списке.

for item in list():
      item = item.lower()

Примечание. Применимо только в том случае, если вы перебираете список строк (dtype = str).

Не могли бы вы отредактировать мой код здесь. Так как я новичок в Python. обзоры содержат список списка

intrusive 10.09.2018 08:47
Ответ принят как подходящий

Я внес несколько изменений в ваш код. Тот, что размещен ниже, работает; Я добавил комментарии о том, как отлаживать тот, который вы разместили выше.

# These three will not used, do not import them
# from sklearn.preprocessing import MultiLabelBinarizer 
# from sklearn.model_selection import train_test_split 
# from sklearn.metrics import confusion_matrix

# This performs the classification task that you want with your input data in the format provided
from sklearn.naive_bayes import MultinomialNB 

from sklearn.feature_extraction.text import CountVectorizer

def load_data(filename):
    """ This function works, but you have to modify the second-to-last line from
    reviews.append(line[0].split()) to reviews.append(line[0]).
    CountVectorizer will perform the splits by itself as it sees fit, trust him :)"""
    reviews = list()
    labels = list()
    with open(filename) as file:
        file.readline()
        for line in file:
            line = line.strip().split(',')
            labels.append(line[1])
            reviews.append(line[0])

    return reviews, labels

X_train, y_train = load_data('train.txt')
X_test, y_test = load_data('test.txt')

vec = CountVectorizer() 
# Notice: clf means classifier, not vectorizer. 
# While it is syntactically correct, it's bad practice to give misleading names to your objects. 
# Replace "clf" with "vec" or something similar.

# Important! you called only the fit method, but did not transform the data 
# afterwards. The fit method does not return the transformed data by itself. You 
# either have to call .fit() and then .transform() on your training data, or just fit_transform() once.

X_train_transformed =  vec.fit_transform(X_train) 

X_test_transformed = vec.transform(X_test)

clf= MultinomialNB()
clf.fit(X_train_transformed, y_train)

score = clf.score(X_test_transformed, y_test)
print("score of Naive Bayes algo is :" , score)

Вывод этого кода:

score of Naive Bayes algo is : 0.5

Привет, @Daniel R. Как мы можем рассчитать точность и отзыв?

intrusive 10.09.2018 13:32

Ммм, похоже, что данные в этом формате позволяют вычислить confusion_matrix из sklearn.metrics, но ни precision_score, ни repl_score. Я изучу это, но пока вы можете распечатать матрицу путаницы и вычислить их вручную оттуда, добавив: y_pred = clf.predict(X_test_transformed)from sklearn.metrics import confusion_matrixprint(confusion_matrix(y_test,y_pred))

Daneel R. 10.09.2018 14:01

Обновлено: я заставил это работать. Параметр pos_label='positive' необходимо передать в функцию precision_score следующим образом: y_pred = clf.predict(X_test_transformed)from sklearn.metrics import precision_scoreprint(precision_score(y_test,y_pred,pos_label='positive'))

Daneel R. 10.09.2018 14:14

R, я пробовал использовать ваш отредактированный выше код. Но столкнулся с ошибкой: «выберите другую среднюю настройку». % y_type) ValueError: Цель - мультикласс, но средний = 'двоичный'. Выберите другую среднюю настройку.

intrusive 11.09.2018 02:37

Итак, я изменил precision_score и repl_score, заменив атрибут pos_label = 'positive' на average = 'micro'. print ("Оценка точности:", precision_score (y_test, y_pred, average = 'micro')) print ("Recall Score:", repl_score (y_test, y_pred, average = 'micro'))

intrusive 11.09.2018 02:39

Но я получаю одинаковую оценку за точность, точность и отзывчивость. Это возможно ?

intrusive 11.09.2018 02:40

Другие вопросы по теме