Corona HelpBot

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *