!pip install -r requirements.txt
import numpy as np
import tensorflow as tf
import spacy
import os
import json
import codecs
import pickle
import random
import csv
construyendo el dataset
nlp = spacy.load('es_dep_news_trf')
data = json.loads(codecs.open(
'categorias.json', 'r', encoding='utf-8').read())
print(data)
palabras = set()
categorias = []
categorias_lemmas = []
ignorar = ["?", "!", ",", ".", ":"]
for categoria in data["categorias"]:
lematizacion = set()
for sentencia in categoria["sentencias"]:
print("Procesando->", sentencia)
tokens = nlp(sentencia)
lemmas = [tok.lemma_.lower()
for tok in tokens if tok.text not in ignorar]
lematizacion = lematizacion.union(set(lemmas))
categorias_lemmas.append([lematizacion, categoria["categoria"]])
palabras = palabras.union(lematizacion)
categorias.append(categoria["categoria"])
print(palabras)
print(categorias_lemmas)
palabras = sorted(palabras)
categorias = sorted(categorias)
pickle.dump(palabras, open('palabras.pkl', 'wb'))
pickle.dump(categorias, open('categorias.pkl', 'wb'))
print(palabras)
print(categorias)
training = []
for arr in categorias_lemmas:
lemmas = arr[0]
categoria = arr[1]
salida = [0] * len(categorias)
salida[categorias.index(categoria)] = 1
index_categoria = categorias.index(categoria)
row = []
for word in palabras:
if word in lemmas:
row.append(1)
else:
row.append(0)
training.append([row, salida])
random.shuffle(training)
training = np.array(training, dtype=object)
train_x = list(training[:,0])
train_y = list(training[:,1])
print(train_x)
print(train_y)
print(len(palabras))
print(len(categorias))
model = tf.keras.Sequential()
model.add(tf.keras.Input(shape=(len(palabras),)))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(.5))
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dropout(.5))
model.add(tf.keras.layers.Dense(len(categorias), activation='softmax'))
opt = tf.keras.optimizers.SGD(learning_rate=0.04, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=opt, metrics=['accuracy'])
hist = model.fit(np.array(train_x),np.array(train_y), batch_size=4000, epochs=200, verbose=1)
model.save('chatbot_model.h5', hist)
print("Done")
import random
import json
import pickle
import numpy as np
import spacy
import codecs
import tensorflow as tf
nlp = spacy.load('es_dep_news_trf')
intentos = json.loads(codecs.open(
'categorias.json', 'r', encoding='utf-8').read())
palabras = pickle.load(open('palabras.pkl', 'rb'))
categorias = pickle.load(open('categorias.pkl', 'rb'))
model: tf.keras.models.Model = tf.keras.models.load_model('chatbot_model.h5')
ignorar = ["?", "!", ",", ".", ":"]
def entradas(sentencia):
tokens = nlp(sentencia)
lemmas = set([tok.lemma_.lower()
for tok in tokens if tok.text not in ignorar])
entrada_palabras = [0] * len(palabras)
for word in lemmas:
for i, palabra in enumerate(palabras):
if word == palabra:
entrada_palabras[i] = 1
return np.array(entrada_palabras)
def prediccion(sentencia):
req = entradas(sentencia)
res = model.predict(np.array([req]))[0]
error = 0.25
resultados = [[i, r] for i, r in enumerate(res) if r > error]
resultados.sort(key=lambda x: x[1], reverse=True)
listado = []
for r in resultados:
listado.append(
{'categoria': categorias[r[0]], 'probabilidad': str(r[1])})
print("prediccion-listado: ", listado)
return listado
def respuesta(sentencia):
categoria = prediccion(sentencia)[0]["categoria"]
datos = intentos["categorias"]
res = "No tengo muchos temas para hablar, hablemos de otra cosa"
for i in datos:
if i["categoria"] == categoria:
res = random.choice(i["respuestas"])
break
return res
print("ChatBot Listo")
salir = True
print("Chatbot, para cerrar el chat escriba 'salir'")
while salir:
message = input("")
print(message)
if message == "salir":
salir = False
print("Adios!!.")
else:
print(respuesta(message))