-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
123 lines (95 loc) · 3.36 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# Proyecto final - Chatbot de terapia (Psicologo)
# Santiago Poveda Garcia
# Luis Felipe Toro
# Python - TensorFlow
import nltk
from nltk.stem.lancaster import LancasterStemmer
stemmer = LancasterStemmer()
import numpy
import tflearn
from tensorflow.python.framework import ops
import json
import random
import pickle
#nltk.download('punkt')
#Lectura del archivo
with open("contenido.json") as archivo:
datos = json.load(archivo)
palabras = []
tags = []
auxX=[]
auxY=[]
#Iteracion de contenido
for contenido in datos["intents"]:
for patrones in contenido["patterns"]:
auxPalabra = nltk.word_tokenize(patrones)
palabras.extend(auxPalabra)
auxX.append(auxPalabra)
auxY.append(contenido["tag"])
if contenido["tag"] not in tags:
tags.append(contenido["tag"])
# Se pasan cada una de las palabras para que sean mas entendibles adicional != de "?"
palabras = [stemmer.stem(w.lower()) for w in palabras if w!="?"]
#Ordenamos la lista de palabras
palabras = sorted(list(set(palabras)))
#Igual con los tags
tags = sorted(tags)
#Declaramos la lista de entrenamiento como tal
entrenamiento = []
salida = []
salidaVacia = [0 for _ in range(len(tags))]
#Recorremos lsta auxiliar de palabras con enumerate es decir + los indices
for x, documento in enumerate(auxX):
cubeta=[]
auxPalabra= [stemmer.stem(w.lower())for w in documento]
#1 si esta, 0 si no esta
for w in palabras:
if w in auxPalabra:
cubeta.append(1)
else:
cubeta.append(0)
filaSalida = salidaVacia[:]
#En la posicion del indice del tag vamos a obtener el contenido de Y en cada uno de sus indices
# y luego le vamos a asignar un 1 : sera una lista aparte.
filaSalida[tags.index(auxY[x])] = 1
entrenamiento.append(cubeta)
salida.append(filaSalida)
# Las listas las convertiremos en arreglos de numpy
entrenamiento = numpy.array(entrenamiento)
salida = numpy.array(salida)
#Comenzar a entrenar
ops.reset_default_graph()
#Entrada - Entrenamientos
red = tflearn.input_data(shape=[None,len(entrenamiento[0])])
#10 neuronas - 2 Columnas | Entrada - Salida
red= tflearn.fully_connected(red,10) #Completamente conectado - Hidden Layers van a estar dando predicciones
red = tflearn.fully_connected(red,10)
#Neuronas x Salida
red = tflearn.fully_connected(red,len(salida[0]),activation="softmax") #Saludo | despedida | 2 neuronas
#Probabilidades de que tan eficiente es nustro tag
red = tflearn.regression(red)
#Creamos el modelo
modelo = tflearn.DNN(red)
modelo.fit(entrenamiento,salida,n_epoch=1000,batch_size=10,show_metric=True)
#n_epoch Cantidad de veces que vera nuestro modelo el dato|
#batch_size cantidad de entradas (Varia)
#Varia tambien el numero de neuronas x las entradas
modelo.save("modelo.tflearn")
def mainBot():
while True:
entrada = input("Tu: ")
cubeta = [0 for _ in range(len(palabras))]
entradaProcesada = nltk.word_tokenize(entrada)
entradaProcesada = [stemmer.stem(palabra.lower()) for palabra in entradaProcesada]
for palabraIndividual in entradaProcesada:
for i, palabra in enumerate(palabras):
if palabra == palabraIndividual:
cubeta[i] = 1
resultados = modelo.predict([numpy.array(cubeta)])
resultadosIndices = numpy.argmax(resultados)
tag = tags[resultadosIndices]
for tagAux in datos ["intents"]:
if tagAux["tag"] == tag:
respuesta = tagAux["responses"]
print("Chatbot: ",random.choice(respuesta))
mainBot()