Afinal, o que é NLU?

Em um artigo que publicamos recentemente, falamos sobre alguns termos que são essenciais quando falamos sobre chatbots. Falamos 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 learningnestes cenários.

 

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.

 

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).

 

Já o NLP (Natural Language Processing, na sigla em Inglês) é uma área de estudo que busca criar métodos para entendergerar linguagem natural de forma automáticaUm 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.

WhatsApp chat
close

Assine nossa Newsletter