Este é um chatbot que dará respostas para a maioria de suas perguntas / FAQ relacionadas ao corona. O chatbot lhe dará respostas a partir dos dados fornecidos pela OMS (https://www.who.int/). Isso ajudará quem precisa de informações ou ajuda a saber mais sobre este vírus.

Ele usa uma rede neural com duas camadas ocultas (o suficiente para esses QnA) que prevê qual padrão combina com a pergunta do usuário e envia em direção a esse nó. Mais padrões podem ser adicionados a partir das perguntas do usuário para treiná-lo para resultados mais aprimorados e adicionar mais informações sobre o coronavírus no arquivo JSON. Quanto mais você treina este chatbot, mais ele se torna preciso. A vantagem de usar o deep learning é que você não precisa fazer a mesma pergunta que foi escrita no arquivo JSON, porque palavras derivadas do padrão são correspondidas com a pergunta do usuário

Pré-requisitos:

Python 3
NumPy
nltk
TensorFlow v.1.15 (sem necessidade de GPU)
tflearn

Dados de treinamento:
para alimentar os dados para o chatbot, usei json com possíveis padrões de perguntas e as respostas desejadas.
O arquivo JSON usado para o projeto é WHO
Para este projeto, denominei meu arquivo JSON como WHO.json.
Na tag do arquivo JSON está a categoria em que todas essas respostas se enquadram.
padrões são usados ​​para listar todos os padrões de pergunta possíveis.
respostas contém todas as respostas com respeito às perguntas padronizadas

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() 
  
 
with open("WHO.json") as file:                   
    data = json.load(file) 
      
try: 
    with open("data.pickle", "rb") as f: 
        words, l, training, output = pickle.load(f) 
except: 
      
    
    words = [] 
    l = [] 
    docs_x = [] 
    docs_y = [] 
      
   
    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"]) 
    
    words = [stemmer.stem(w.lower()) for w in words if w != "?"]          
    words = sorted(list(set(words))) 
    l = sorted(l)                                       
      
    
    
    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) 
          
    
    training = numpy.array(training)         
    output = numpy.array(output) 
    with open("data.pickle", "wb") as f: 
        pickle.dump((words, l, training, output), f) 
  
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) 
  
  
model = tflearn.DNN(net) 
    
  
model.fit(training, output, n_epoch=1000, batch_size=8, show_metric=True)         
model.save("model.tflearn") 
   
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(
    ) 
      
    while True: 
        inp = input("You: ") 
        if inp.lower() == "quit": 
            break
 results = model.predict([bag_of_words(inp, words)])[0] 
        results_index = numpy.argmax(results) 
        
        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()