Este es un chatbot que dará respuestas a la mayoría de sus preguntas/preguntas frecuentes relacionadas con la corona. El chatbot le dará respuestas a partir de los datos proporcionados por la OMS (https://www.who.int/). Esto ayudará a quienes necesiten información o ayuda para saber más sobre este virus.
Utiliza una red neuronal con dos capas ocultas (suficientes para estos QnA) que predice qué patrón coincide con la pregunta del usuario y lo envía hacia ese Node. Se pueden agregar más patrones a las preguntas del usuario para entrenarlo y obtener mejores resultados y agregar más información sobre el coronavirus en el archivo JSON. Cuanto más entrenas a este chatbot, más preciso se vuelve. La ventaja de usar el aprendizaje profundo es que no tiene que hacer la misma pregunta que está escrita en el archivo JSON porque las palabras derivadas del patrón coinciden con la pregunta del usuario.
requisitos previos:
Python 3 NumPy nltk TensorFlow v.1.15 (no GPU required) tflearn
Datos de entrenamiento:
para enviar los datos al chatbot, he usado JSON con posibles patrones de preguntas y nuestras respuestas deseadas.
El archivo JSON utilizado para el proyecto es QUIÉN
. Para este proyecto, he llamado a mi archivo JSON QUIÉN.json.
La etiqueta del archivo JSON es la categoría en la que caen todas esas respuestas.
Los patrones se utilizan para enumerar todos los patrones de preguntas posibles.
Las respuestas contienen todas las respuestas con respecto a las preguntas con patrón.
Python3
import nltk import numpy import tflearn import tensorflow import pickle import random import json nltk.download('punkt') from nltk.stem.lancaster import LancasterStemmer stemmer = LancasterStemmer() #loading the json data with open("WHO.json") as file: data = json.load(file) #print(data["intents"]) try: with open("data.pickle", "rb") as f: words, l, training, output = pickle.load(f) except: # Extracting Data words = [] l = [] docs_x = [] docs_y = [] # converting each pattern into list of words using nltk.word_tokenizer for i in data["intents"]: for p in i["patterns"]: wrds = nltk.word_tokenize(p) words.extend(wrds) docs_x.append(wrds) docs_y.append(i["tag"]) if i["tag"] not in l: l.append(i["tag"]) # Word Stemming words = [stemmer.stem(w.lower()) for w in words if w != "?"] words = sorted(list(set(words))) l = sorted(l) # This code will simply create a unique list of stemmed # words to use in the next step of our data preprocessing training = [] output = [] out_empty = [0 for _ in range(len(l))] for x, doc in enumerate(docs_x): bag = [] wrds = [stemmer.stem(w) for w in doc] for w in words: if w in wrds: bag.append(1) else: bag.append(0) output_row = out_empty[:] output_row[l.index(docs_y[x])] = 1 training.append(bag) output.append(output_row) # Finally we will convert our training data and output to numpy arrays training = numpy.array(training) output = numpy.array(output) with open("data.pickle", "wb") as f: pickle.dump((words, l, training, output), f) # Developing a Model tensorflow.reset_default_graph() net = tflearn.input_data(shape=[None, len(training[0])]) net = tflearn.fully_connected(net, 8) net = tflearn.fully_connected(net, 8) net = tflearn.fully_connected(net, len(output[0]), activation="softmax") net = tflearn.regression(net) # remove comment to not train model after you satisfied with the accuracy model = tflearn.DNN(net) """try: model.load("model.tflearn") except:""" # Training & Saving the Model model.fit(training, output, n_epoch=1000, batch_size=8, show_metric=True) model.save("model.tflearn") # making predictions def bag_of_words(s, words): bag = [0 for _ in range(len(words))] s_words = nltk.word_tokenize(s) s_words = [stemmer.stem(word.lower()) for word in s_words] for se in s_words: for i, w in enumerate(words): if w == se: bag[i] = 1 return numpy.array(bag) def chat(): print("""Start talking with the bot and ask your queries about Corona-virus(type quit to stop)!""") while True: inp = input("You: ") if inp.lower() == "quit": break results = model.predict([bag_of_words(inp, words)])[0] results_index = numpy.argmax(results) #print(results_index) tag = l[results_index] if results[results_index] > 0.7: for tg in data["intents"]: if tg['tag'] == tag: responses = tg['responses'] print(random.choice(responses)) else: print("I am sorry but I can't understand") chat()
Bolsa de palabras:
como sabemos, las redes neuronales y los algoritmos de aprendizaje automático requieren una entrada numérica. Así que nuestra lista de strings no será suficiente. Necesitamos alguna forma de representar nuestras oraciones con números y aquí es donde entra una bolsa de palabras. Lo que vamos a hacer es representar cada oración con una lista de la longitud del número de palabras en nuestro vocabulario modelo. Cada posición en la lista representará una palabra de nuestro vocabulario, la posición en la lista es un 1, entonces eso significará que la palabra existe en nuestra oración, si es un 0, entonces la palabra no está presente.
Desarrollo de un modelo:
model = tflearn.DNN(net) model.fit(training, output, n_epoch=1000, batch_size=8, show_metric=True) model.save("model.tflearn")
Nuestro chatbot predecirá las respuestas según el modelo que entrenemos. Aquí usaremos las redes neuronales para construir el modelo. El objetivo de nuestra red será mirar una bolsa de palabras y dar una clase a la que también pertenecen (una de nuestras etiquetas del archivo JSON).
Input: What is coronavirus? Output: COVID-19 is an infectious disease caused by the most recently discovered coronavirus. This new virus and disease were unknown before the outbreak began in Wuhan, China, in December 2019. Input: What are the symptoms of COVID 19? Output: The most common symptoms of COVID-19 are fever, tiredness, and dry cough. Some patients may have aches and pains, nasal congestion, runny nose, sore throat, or diarrhoea. These symptoms are usually mild and begin gradually. Some people become infected but don’t develop any symptoms and don't feel unwell. Most people (about 80%) recover from the disease without needing special treatment.
Publicación traducida automáticamente
Artículo escrito por SovonSingha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA