Loading repository data…
Loading repository data…
amirelemam / repository
SciPy #1: Chatbot em Python: Criação de um chatbot simples com Microsoft LUIS
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Este código refere-se à palestra "Chatbot em Python", do SciPy #1 de 29/07/2017. Ver slides da apresentação
luisNota: Os seguintes comandos funcionam em Linux e macOS. Se você está usando Windows, os passos são os mesmos, porém os comandos podem ser diferentes.
chatbot-python.$ cp -R chatbot-python ~/$ cd ~/$ pip3 install virtualenv$ virtualenv chatbot-python$ cd chatbot-python$ source bin/activate$ pip3 install -r requirements.txtO primeiro passo é importar e inicializar os módulos necessários, além de criar a estrutura para que o código seja feito usando Programação Orientada a Objetos.
Para isso, vamos:
start() da classe Main() é o método principal da classe e deve ser o chamado quando o arquivo é executado, nas linhas 7 e 8.#!/usr/bin/env python
import luis
LUIS_ENDPOINT = "" # Coloque aqui a URL do seu endpoint
LUIS = luis.Luis(url=LUIS_ENDPOINT)
if __name__ == '__main__':
Main().start()
Agora vamos criar categorias de perguntas e suas respostas.
Para isso, vamos criar um dicionário ANSWERS, que recebe como chave a categoria, chamada de intent pelo LUIS, e o valor do dicionário é a resposta.
Este dicionário será criado localmente na classe Main().
Vamos criar também o método start(), para manter o código de acordo com a especificação de execução, feitas no passo anterior.
O código abaixo deve ser inserido na linha 6, abaixo da inicialização do módulo luis na constante LUIS.
class Main(object):
"""Baseado na pergunta do usuário, mostra a resposta mais adequada"""
ANSWERS = {
"BEST_LANGUAGE": "Sem sombra de dúvidas, a melhor linguagem de programação é Python.",
"WORST_LANGUAGE": "Não sei, mas com a mais absoluta certeza, não é Python.",
"ABOUT_PYTHON": "Python é a melhor linguagem de programação do mundo.",
"WELCOME": "Oi amigo! Faça sua pergunta...",
"GOODBYE": "Tchauzinho! :)",
"SENTIDO_VIDA": "O sentido da vida é programar em Python",
"None": "Desculpe, não entendi. Por favor, tente escrever de outra forma."
}
def start(self):
"""Initializa o bot"""
pass
Vamos criar o código para receber a mensagem do usuário e responder de acordo.
Primeiro, vamos colocar uma mensagem indicando o início da interação. (linha 3)
Depois, a mensagem recebida pelo usuário é armazenada numa variável. (linha 6)
Esta variável é passada como parâmetro para método replies() que fará a análise da mensagem e retornará a resposta. Daqui a pouco criaremos este método replies(). (linha 7)
A resposta, então, é exibida para o usuário. (linha 8).
Vamos colocar o processo de receber a mensagem e responder num loop, para que possa haver múltiplas interações.
Caso a mensagem seja de despedida, o bot é encerrado. (linhas 9 e 10)
No método start(), substitua o pass pelo código abaixo.
def start(self):
"""Initializa o bot"""
print("Início da interação:")
while True:
question = input("Usuário: ")
answer = self.replies(question)
print(f"Bot: {answer}")
if answer == self.ANSWERS["GOODBYE"]:
break
Para responder o usuário de forma mais adequada, vamos utilizar o serviço Microsoft LUIS.
Para isso, vamos criar o método replies() que, a partir de uma mensagem, consulta o LUIS, e retorna o texto da resposta mais adequada.
Na linha 3, vamos fazer o envio da mensagem para análise, através do método analyze().
Este método retorna o atributo best_intent(), que retorna com dois itens, o primeiro sendo a intent com maior probabilidade de ser a correta e o segundo é a probabilidade em si.
Vamos pegar apenas o nome da intent, através do atributo intent e armazenar numa variável.
Com o nome da intent, vamos fazer a busca no dicionário ANSWERS e retornaremos a resposta, nas linhas 4 e 5.
Mais pra frente, criaremos as intents no LUIS.
Coloque este código dentro da classe Main(), logo acima do método start()
def replies(self, text):
"""Baseado na pergunta do usuário, identifica qual a sua intenção"""
intent = LUIS.analyze(text).best_intent().intent
answer = self.ANSWERS[intent]
return answer
Nosso código está pronto, porém as perguntas não serão entendidas sem que o LUIS tenha sido treinado.
Primeiro, vamos criar o app:
A explicação detalhada de como criar o app no LUIS por ser encontrada aqui.
Agora que temos o App criado, temos que adicionar as intents:
ANSWERS.ANSWERS tenham uma intent no Microsoft LUIS. A intent None é criada por padrão e não precisa ser criada novamente.A explicação detalhada de como criar intents no LUIS por ser encontrada aqui.
Depois de criada, a intent precisa ser treinada:
A explicação detalhada de como adicionar mensagens numa intent do LUIS por ser encontrada aqui
Depois de criar todas as intents e inserir mensagens e todas elas, precisamos fazer o treinamento em si.
A explicação detalhada de como fazer o treinamento no LUIS por ser encontrada aqui
Caso o treinamento não esteja satisfatório, coloque mais mensagens nas intents (passo anterior) e refaça o treinamento (este passo).
Com a aplicação treinada, precisamos publicá-la para uso externo.
LUIS_ENDPOINTLUIS_ENDPOINT = "https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/LETRASENUMEROS?subscription-key=NUMERODASUBSCRIPTIONKEY8&timezoneOffset=0&verbose=true&q="
Toda vez que fizer um novo treinamento, as alterações só estarão disponíveis após fazer a publicação (este passo). A publicação tem que ser feita todas as vezes.
A explicação detalhada de como fazer a publicação do App do LUIS por ser encontrada aqui
Agora está tudo pronto! Basta rodar o script e tudo deve funcionar perfeitamente.
Para isso, dentro da pasta chatbot-python, execute o seguinte comando e manda uma mensagem para o bot:
$ python3 chatbot.py
Este projeto está licenciado sob a Licença MIT