<filename>training.py
import random 
import json 
import pickle
import numpy as np
import nltk 
# nltk.download()
nltk.download('wordnet')

from nltk.stem import WordNetLemmatizer


from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout
from tensorflow.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)
    print("word_list", word_list)
    words.extend(word_list)
    documents.append((word_list, intent['tag']))
    if intent['tag'] not in classes:
      classes.append(intent['tag'])

print("document", documents)

#reomve letters
words = [lemmatizer.lemmatize(word) for word in words if word not in ignore_letters]
print("not sorted", words)

# sort and remove duplicate
words = sorted(set(words))

print("sorted words", words)

classes = sorted(set(classes))

#saving in the files
pickle.dump(words, open('words.pk1', 'wb'))
pickle.dump(classes, open('classes.pk1', 'wb'))

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

for doucment in documents:
  bag= []
  word_patterns = doucment[0]
  word_ptterns = [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) # coping the list
  output_row[classes.index(doucment[1])] = 1 
  training.append([bag, output_row])

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

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

#neural network theory
model = Sequential()
#input layer
model.add(Dense(128, input_shape= (len(train_x[0]),), activation = 'relu'))
#prevent overfitting
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(learning_rate= 0.01, decay= 1e-6, momentum = 0.9, nesterov=True)

model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

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

model.save('chatbot_model.h5', hist)
print("Done")






<filename>training.py
import random 
import json 
import pickle
import numpy as np
import nltk 
# nltk.download()
nltk.download('wordnet')

from nltk.stem import WordNetLemmatizer


from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout
from tensorflow.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)
    print("word_list", word_list)
    words.extend(word_list)
    documents.append((word_list, intent['tag']))
    if intent['tag'] not in classes:
      classes.append(intent['tag'])

print("document", documents)

#reomve letters
words = [lemmatizer.lemmatize(word) for word in words if word not in ignore_letters]
print("not sorted", words)

# sort and remove duplicate
words = sorted(set(words))

print("sorted words", words)

classes = sorted(set(classes))

#saving in the files
pickle.dump(words, open('words.pk1', 'wb'))
pickle.dump(classes, open('classes.pk1', 'wb'))

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

for doucment in documents:
  bag= []
  word_patterns = doucment[0]
  word_ptterns = [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) # coping the list
  output_row[classes.index(doucment[1])] = 1 
  training.append([bag, output_row])

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

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

#neural network theory
model = Sequential()
#input layer
model.add(Dense(128, input_shape= (len(train_x[0]),), activation = 'relu'))
#prevent overfitting
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(learning_rate= 0.01, decay= 1e-6, momentum = 0.9, nesterov=True)

model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

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

model.save('chatbot_model.h5', hist)
print("Done")






# nltk.download() #reomve letters # sort and remove duplicate #saving in the files # coping the list #features #neural network theory #input layer #prevent overfitting