Em um artigo que publicamos recentemente, escrevemos sobre alguns termos que são essenciais quando falamos sobre chatbots.
Contamos um pouco sobre “intenções” e “entidades” e neste artigo iremos explicar como trabalhamos com intenções e entidades. Também iremos mostrar os motivos para o uso de machine learning nestes cenários.
Neste texto você vai encontrar:
Uma breve introdução ao NLU
Linguagens naturais – como o Português, Inglês e Latim – foram criadas ao longo de milhares de anos pelo homem na tentativa se comunicar. Isso resultou em diversas linguagens com inconsistências, peculiaridades, ambiguidades, contextos e outros elementos que as tornam extremamente difíceis de serem analisadas por um computador.
No entanto, nós humanos entendemos frases de forma trivial e natural. Mesmo quando a frase não faz muito sentido gramatical, conseguimos extrair seu significado usando o contexto da conversa, linguagem corporal, entonação, entre outros elementos.
Acontece que existem situações complexas que o cérebro humano resolve de forma melhor e mais eficiente do que qualquer computador. Entendimento de linguagem natural (Natural Language Understanding, ou NLU na sigla em Inglês) é um desses casos.
Observe a seguinte tabela, onde indicamos quem consegue resolver de forma mais eficiente: nós humanos ou um computador:
Problema | Quem resolve melhor? | Solução/Algoritmo |
Calcular impostos de uma Nota Fiscal | Computador | Regras complexas e operações matemáticas básicas |
Faturamento total da empresa no ano | Computador | Regras complexas e operações matemáticas básicas |
Calcular Folha de Pagamento | Computador | Regras complexas e operações matemáticas básicas |
Menor caminho para ir de Porto Alegre à Buenos Aires | Computador | Algoritmo de Dijkstra. |
Entender que “Oi” e “Olá” significam a mesma coisa (NLU) | Humano | Machine Learning |
Reconhecer seu amigo em uma foto | Humano | Machine Learning |
Escrever um parágrafo coerente sobre um assunto | Humano | ??? |
Computadores são muito bons para resolver problemas puramente matemáticos como cálculos de faturamento, notas fiscais, folhas de pagamento, encontrar o melhor caminho entre 2 pontos, entre outros. No entanto, alguns problemas são difíceis de se definir matematicamente e nesses casos utilizamos machine learning.
O problema das intenções
A intenção da frase pode ser definida de forma simples como o significado da frase. Extrair o significado da frase é um problema complexo para o qual um algoritmo de machine learning é o mais adequado. Não iremos entrar em detalhes de como o algoritmo de machine learningpara NLU funciona em baixo nível, mas caso estiver interessado, alguns dos termos que você pode pesquisar são Maxent, CRF, Word Vectors, Bag of Words e Word Embeddings.
Vários serviços e bibliotecas implementam esses algoritmos, como o Apache OpenNLP, Rasa NLU, DialogFlow, Stanford NLP, Snips NLU, Watson, LUIS.ai, Scikit, NLTK, entre outros.
Se você é um programador, pode estar se perguntando:
- Ué? Por que eu preciso de machine learning? Não vejo porque isso é difícil. Se eu quiser detectar a intenção de uma frase, não posso fazer um monte de ifs analisando se a frase possui algumas palavras-chave?
Podemos tentar, mas só de ter a expressão “um monte de ifs” nessa frase já é preocupante. Para exemplificar como isso pode ser feito, utilizarei Python – embora na Ubots usemos Java e Groovy no desenvolvimento de nossos bots.
Neste exemplo, estamos testando se as palavras “meio” e “pagamento” estão na frase. Mas o que aconteceria se eu perguntasse “quais as formas de pagamento”? A princípio isso é uma alteração simples, então vamos resolver esse caso também:
Como você pode ver, mal começamos e esse código já está ficando terrível. Mas como precisamos entender o que o usuário diz, então vamos em frente. Considere a seguinte frase:
Agora teremos que lidar com as ambiguidades da Língua Portuguesa. Neste caso, o cliente está fazendo uma reclamação, mas encontram-se no enunciado as palavras “pagamento” e “meio”, fazendo com que nossa função significado(frase) retorne “MEIO_PAGAMENTO”.
Para resolvermos esta ambiguidade, podemos olhar para a palavra “mas” e modificar nosso código da seguinte forma:
Outro cliente pode digitar a seguinte frase para o nosso bot:
Essa frase é detectada como “RECLAMACAO”… E agora?
Esse trabalho se torna frustrante muito rapidamente. Quem vai querer dar manutenção a este código? É óbvio que este método não é escalável. Se tivermos 10 intenções, o código será gigantesco e muito difícil de manter.
Essa não-escalabilidade se mantém mesmo quando tivermos mais informações sobre o enunciado. Podemos analisar se as palavras são verbos, substantivos, adjetivos, podemos avaliar também listas de sinônimos… mas, com toda essa informação, a análise se torna ainda mais complexa. Claramente precisamos de um jeito melhor.
O que queremos é criar uma tabela de frases e intenções e alimentar um algoritmo de machine learning. Considere a seguinte tabela:
Enunciado | Intenção |
quero fazer um pedido | REALIZAR_PEDIDO |
atendimento ótimo | ELOGIO |
fui muito mal atendido | RECLAMACAO |
quais formas de pgto vcs aceitam | MEIO_PAGAMENTO |
quais meios de pagamento são aceitos? | MEIO_PAGAMENTO |
tem pizza calabresa? | CARDAPIO |
quais sabores posso pedir? | CARDAPIO |
quantos sabores posso colocar em uma pizza | CARDAPIO |
….. | …… |
Com uma lista suficientemente grande de exemplos para cada intenção, podemos ensinar um algoritmo a reconhecer a intenção de um enunciado independente da forma como o cliente irá se expressar. O cliente não precisa escrever algo exatamente igual aos exemplos de nossa lista.Por exemplo, se um cliente disser “quais sabores dá pra colocar na pizza”, é muito provável que o algoritmo reconheça corretamente que a intenção é CARDAPIO, mesmo a frase não estando na lista de treinos.
Ok, mas e se a pessoa disser algo totalmente diferente do que está treinado?
Nós, meros seres humanos, aprendemos palavras novas mesmo quando adultos. Esse processo de aprendizagem é gradual. Além disso, no nosso dia-a-dia, ouvimos ideias iguais sendo expressas de formas muito diferentes e, às vezes, não as compreendemos. Isso também ocorre com chatbots.
Aqui na Ubots, o time de linguística computacional realiza curadorias de forma recorrente para melhorar o entendimento do chatbot. Esse é um trabalho que nunca acaba, já que as pessoas criam novas formas de expressar ideias a todo tempo.
🤖 Leia também: Chatbot – o que é, para que serve e como funciona?
O que são entidades? E como elas funcionam?
Até agora vimos exemplos de como extrair a intenção de uma frase. Mas considere as seguintes frases:
1 – “Quero comprar um smartphone”
2 – “Qual é o prazo de entrega para o meu último pedido? Foi feito para o cpf 67156341532”
Nestes dois enunciados, vemos que existe uma intenção e uma informação específica que podemos usar. No caso do enunciado número 1, podemos dizer que a intenção é “COMPRAR_PRODUTO”. Em casos como este, um chatbot poderia detectar a intenção e mostrar uma lista de produtos em promoção.
Mas sabemos que o usuário está procurando por algo específico – no caso, um smartphone – portanto o chatbot pode mostrar uma lista de smartphones em promoção, por exemplo. Dessa forma, podemos tratar o termo “smartphone” como uma entidade do tipo “nome_produto”. Eis alguns exemplos de como as ferramentas de NLU podem interpretar frases com intenções e entidades:
quero comprar um smartphone
Resultado: COMPAR_PRODUTO(nome_produto=smartphone)
Qual é o prazo de entrega para o meu último pedido? Foi feito para o cpf 67156341532
Resultado: STATUS_PEDIDO(cpf=67156341532)
Quero reservar uma mesa para 4pessoas amanhã à noite
Resultado: RESERVAR_MESA(lugares=4, horario=10/01/2019 20:00:00)
Assim como nos treinamentos de intenção, podemos indicar em cada uma das frases treinadas se elas contém alguma entidade relevante.
Observe que algumas palavras possuem um significado especial: a palavra “amanhã”obviamente muda de significado a cada dia que passa e podemos atribuir um valor específico a ela (no caso, a data do dia seguinte). Com outros auxiliares, como “de noite”, podemos também atribuir um horário aproximado para o horário ao qual o usuário se refere.
Ferramentas como Rasa NLU possuem um módulo chamado “duckling”, que atribui valores numéricos a algumas expressões como “amanhã”, “vinte e cinco”, “daqui uma semana”, “meia dúzia”, “10 pila”, entre outros. Você pode ler mais sobre duckling em https://github.com/facebook/duckling.
E qual é a diferença entre NLP e NLU?
Tudo que discutimos até agora faz parte do conceito de NLU (Natural Language Undestanding). Se temos um conceito relacionado a entender o que foi dito, é de se esperar que exista o conceito de gerar uma resposta apropriada. A este damos o nome de NLG (Natural Language Generation), que é o ato de gerar linguagem natural (falada ou escrita).
🤖 Leia também: Processamento de linguagem natural
Já o NLP (Natural Language Processing, na sigla em Inglês) é uma área de estudo que busca criar métodos para entendere gerar linguagem natural de forma automática. Um chatbot é a aplicação prática de NLP. De forma super simplificada:
NLP = NLU + NLG
A intenção deste artigo foi mostrar em alto nível alguns detalhes técnicos de NLU e como o machine learning é aplicado ao problema de detecção de intenções e entidades de um enunciado, em especial em chatbots.
Caso quiser aprender mais sobre NLU ou, até mesmo, colocar a mão na massa, sugerimos dar uma olhada no Rasa NLU. É feito em Python e fácil de instalar e fazer integrações com suas APIs.
Texto por Ricardo Pieper, desenvolvedor na Ubots.