python-3.xlistlowercaselemmatization

How to solve an Attribute error when lemmatizing a list.lower()


    word_patterns = [lemmatizer.lemmatize(word.lower()) for word in word_patterns]
AttributeError: 'list' object has no attribute 'lower'

I can't figure out how to fix the error. Its saying that my list of word can't be lowercased at all. this is the entire code

import random
import json
import pickle
import numpy as np


import nltk
from nltk.stem import WordNetLemmatizer



from tensorflow import keras
from keras.layers import Dense, Activation, Dropout
from keras.models import Sequential
from keras.optimizers import SGD


lemmatizer = WordNetLemmatizer()

intents = json.loads(open('intents.json').read())

words= []
classes = []
documents = []
ignore_letters = ['?', '!', '.', ',']

for intent in intents["intents"]:
    for pattern in intent['patterns']:
        word_list = nltk.word_tokenize(pattern)
        words.extend(word_list)
        documents.append((word_list, intent['tag']))
        if intent['tag'] not in classes:
            classes.append(intent['tag'])

words = [lemmatizer.lemmatize(word) for word in words if word not in ignore_letters]
words = sorted(set(words))


classes = sorted(set(classes))


pickle.dump(words, open('words.pkl', 'wb'))
pickle.dump(words, open('classes.pkl', 'wb'))


training=[]
output_empty = [0] * len(classes)

for document in documents:
    bag = []
    word_patterns = documents[0]
    word_patterns = [lemmatizer.lemmatize(word.lower()) for word in word_patterns]
    for word in words:
        bag.append(1) if word in word_patterns else bag.append(0)
    

    output_row = list(output_empty )
    output_row[classes.index(document[1])] = 1
    training.append(bag, output_row)

random.shuffle(training)
training = np.array(training)

train_x = list(training[:,0])
train_y = list(training[:,1]) 

#neural network


model = Sequential()
model.add(Dense(128,input_shape = (len(train_x[0]),),activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(len(train_y[0]), activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

model.fit(np.array(train_x), np.array(train_y), epochs=200, batch_size=5, verbose=1)
model.save('chatbot_model.model')

print("done")

the file stopped working once I uploaded the neural network. The neural network was supposed to train the bot but then the Attribute error came up. Unless I fix that I can't train the bot.

Any suggestions would help:D This code was supposed to be for an intelligent chatbot in python. I need to finish training before can actually build the bot


Solution

  •     word_patterns = [lemmatizer.lemmatize(word.lower()) for word in word_patterns]
    AttributeError: 'list' object has no attribute 'lower'
    

    The error here occurs before lemmatize is even called, the problem is already with word.lower().

    You are expecting word_patterns to be a list of strings, but it's not. It's a list of lists.

    I followed the source of word to word_patterns to

    word_patterns = documents[0]
    

    This looks very suspicious, and I think it is clearly meant to be

    word_patterns = document[0]
    

    as document is your actual loop variable.