Ele entende seus comandos de voz, pesquisa notícias e fontes de conhecimento e resume e lê o conteúdo para você.
Confira o vídeo de demonstração.
A Chatbots Magazine apresentou meu artigo Delbot nos 100 principais artigos da Chatbots Magazine.
python app.py
no prompt de comando para iniciar o serviço da web.Os bots continuam sendo um tema quente. Todo mundo está falando sobre eles.
Que tal construir um do zero? O simples que construiremos hoje compreenderá e responderá perguntas como:
Nosso objetivo é codificar um bot desde o início e usar processamento de linguagem natural (PNL) ao fazer isso.
Além disso, nosso bot será habilitado para voz e baseado na web se você também preencher a seção do aplicativo da web. A melhor parte é que não precisamos fazer nada sofisticado para reconhecimento e síntese de fala: usaremos um recurso integrado dos navegadores modernos.
Em alto nível, queremos ser capazes de compreender dois tipos amplos de consultas. A seguir está o fluxograma.
Poderíamos pedir notícias . Por exemplo:
Quais são as novidades sobre Animais Fantásticos no Guardião?
O bot consultará a API da fonte de notícias solicitada (New York Times se nenhuma for especificada) e resumirá os resultados:
[...] Comparar o primeiro filme de Harry Potter (Harry Potter e a Pedra Filosofal de 2001) com o último (Harry Potter e as Relíquias da Morte Parte Dois de 2011) é um pouco semelhante a comparar Bambi com Reservoir Dogs. Nós o conhecemos na década de 1920 em Nova York - quase 60 anos antes mesmo de Harry nascer - onde ele está [...]
(fonte: https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)
Poderíamos fazer uma pergunta de conhecimento . Por exemplo:
O que são triplos RDF?
E o bot responderá:
Um triplo semântico, ou simplesmente triplo, é a entidade de dados atômicos na Estrutura de Descrição de Recursos.nEsse formato permite que o conhecimento seja representado de forma legível por máquina. Particularmente, cada parte de um triplo RDF é endereçável individualmente por meio de URIs exclusivos - por exemplo, a segunda instrução acima pode ser representada em RDF como http://example.name#BobSmith12 http://xmlns.com/foaf/0.1/ conhece http://example.name#JohnDoe34.
(fonte: https://en.wikipedia.org/wiki/Semantic_triple)
Definimos uma regra simples para categorizar entradas: se a consulta contiver uma das palavras news ou latest , é uma consulta news . Caso contrário, é uma consulta de conhecimento .
A função predict
da classe QueryAnalyzer
é o principal ponto de entrada do nosso bot. Ele executa a categorização acima. Ele chama outras funções para
Por fim, retorna a saída e um sinalizador indicando se houve algum erro.
Presumimos que a entrada seja de um dos seguintes formatos.
Quais são as últimas notícias sobre Star Wars no New York Times?
Leia-me as últimas novidades sobre o Brexit.
Dê-me notícias sobre os filmes do Universo Cinematográfico Marvel em 2017 do Guardian.
Símbolo | Dar | meu | o | mais recente | notícias | sobre | Donald | Trunfo | de | o | Novo | Iorque | Tempos | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PDV | VERBO | PRON | DET | AJ. | SUBSTANTIVO | ADP | PROPN | PROPN | ADP | DET | PROPN | PROPN | PROPN | PONTO |
MARCAÇÃO | VB | PRP | DT | JJS | NN | EM | PNN | PNN | EM | DT | PNN | PNN | PNN | . |
Existe um padrão nas frases estruturadas como acima. E as preposições são fundamentais.
O tema da pesquisa está entre a primeira e a última preposição. A fonte solicitada está no final, após a última preposição. O último pedaço de substantivo é a fonte.
Caso a fonte não seja especificada, como no segundo exemplo, tudo o que estiver após a primeira preposição será considerado o tema da pesquisa.
Adposições , simplesmente, são preposições e posposições.
Em uma língua inicial como o inglês, as aposições geralmente precedem o sintagma nominal. Por exemplo, personagens do Universo Cinematográfico Marvel. Enquanto em uma língua final como o Gujarati, as aposições seguem o sintagma nominal. Estas são posposições. Por exemplo, માર્વેલ ચલચિત્ર જગત_ના_ પાત્રો, que traduz palavra por palavra para: Universo Cinematográfico Marvel de personagens.
Invocamos get_news_tokens
da classe QueryExtractor
, que extrai a fonte e a consulta da entrada. Internamente, ele chama _split_text
para extrair trechos de substantivos, classes gramaticais e o texto totalmente analisado da entrada. Lematizamos os termos na consulta.
A seguir, invocamos a função get_news
usando consulta em uma das classes Aggregator
em media_gregator.py com base em source . Isso retorna uma lista de artigos de notícias que foram enviados como resposta pela API de notícias. Atualmente oferecemos suporte à API The Guardian e à API The New York Times.
Finalmente, escolhemos o primeiro item (por padrão) da lista de respostas e o resumimos usando a função shorten_news
.
Presumimos que a entrada seja de um dos seguintes formatos.
John Deere
Joana d'Arc
Quem é Donald Trump?
Quem foi JRR Tolkien?
O que é objeto sujeito predicado?
Conte- me sobre física de partículas.
Símbolo | O que | é | um | RDF | triplo | ? |
---|---|---|---|---|---|---|
PDV | SUBSTANTIVO | VERBO | DET | PROPN | SUBSTANTIVO | PONTO |
MARCAÇÃO | WP | VBZ | DT | PNN | NN | . |
Símbolo | Dizer | meu | sobre | ele | - | homem | e | o | mestres | de | o | universo | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PDV | VERBO | PRON | ADP | PRON | PONTO | SUBSTANTIVO | CONJ | DET | SUBSTANTIVO | ADP | DET | SUBSTANTIVO | PONTO |
MARCAÇÃO | VB | PRP | EM | PRP | HIF | NN | CC | DT | NNS | EM | DT | NN | . |
Se encontrarmos um verbo auxiliar, trataremos tudo após sua primeira ocorrência como consulta. Assim, no Exemplo 1 , a consulta é RDF tripla .
Caso contrário, trataremos todos os pedaços de substantivos após o primeiro como a consulta. Assim, no Exemplo 2 , a consulta é ele-homem, o mestre do universo .
Invocamos get_knowledge_tokens
da classe QueryExtractor
, que extrai a consulta .
Passamos isso para a função get_gkg
, que consulta a API da Wikipedia por meio do pacote wikipedia Python e retorna um resumo de 5 frases do resultado principal.
Usei a classe FrequencySummarizer
do resumo de texto com NLTK. Alternativamente, você pode usar sumy.
Além dos pacotes re , bs4 , requests , operator , Collections , heapq , string e nltk , usaremos o seguinte.
spaCy : configure-o conforme fornecido na documentação de instalação do spaCy. spaCy nos ajudará a fazer uma PNL rápida. Poderíamos usar o NLTK, mas o spaCy fará com que você avance mais rápido. Usamos spaCy neste projeto.
Wikipedia : Isso ajuda a consultar a API da Wikipedia. Você pode ler a documentação do pacote Python da Wikipedia aqui.
Resumidor : O que usei foi emprestado do blog The Glowing Python escrito por JustGlowing. Ele resume um conteúdo extenso. Alternativamente, você pode usar sumy.
Flask-RESTful, Flask (opcional) : servem para construir um aplicativo da web e operacionalizar nosso bot por meio de um serviço da web RESTful.
Adicionamos uma página da web interessante a partir da qual você pode disparar consultas de voz e fazer com que o navegador leia o conteúdo da resposta. Fazemos uso da API Web Speech para isso.
Colocamos nosso serviço da web REST baseado em Flask em funcionamento em menos de 20 linhas de código. A classe QueryService
trata de solicitações.
No momento, precisamos apenas de uma chamada de serviço para enviar informações do nosso aplicativo da web para o nosso bot. Isso é feito por meio da função post
da classe QueryService
. post
, por sua vez, chama a função predict
, que é o ponto de entrada principal conforme mencionado acima.
Criei uma página básica para demonstrar o bot. Ele usa a API Web Speech para receber entrada de voz e ler conteúdo. Você pode encontrar o arquivo index.html na pasta de modelos. Certifique-se de ter instalado todos os pacotes e bibliotecas necessários e de que o serviço da web esteja instalado e funcionando antes de abrir o site.
Nosso bot simples entende uma gama limitada de solicitações. Ele não pode compreender outros tipos de solicitações, como a seguir.
Solicitações de conhecimento com estrutura diferente
Explique-me o que é agregação de bootstrap.
Conte-me algo sobre neurociência computacional.
Solicitações de notícias com estrutura diferente
O que diz o New York Times sobre a última partida de Roger Federer?
O que está acontecendo no mundo do tênis?
Solicitações de conhecimento de outros tipos
Como é feito o queijo?
Onde JK Rowling nasceu?
Podemos construir uma cidade celeste em Vênus?
Quando ocorreu a Revolução Francesa?
Por que Júpiter tem a Grande Mancha Vermelha?
Perguntas de acompanhamento e contexto
Explique-me o que é agregação de bootstrap.
e então: como isso se relaciona com florestas aleatórias?
Compreender a que se refere na pergunta de acompanhamento se enquadra no que é conhecido como resolução de anáfora. Tudo faz parte da compreensão do contexto. Palavras diferentes significam coisas diferentes em contextos diferentes. Embora os humanos tenham uma compreensão diferenciada disso, é significativamente mais difícil ensinar o mesmo às máquinas.
Atingimos nosso objetivo de construir um bot com base em algumas regras que definimos. Também utilizamos algumas técnicas de PNL. Finalmente, implantamos nosso bot em um aplicativo web. No entanto, nosso bot é limitado nos tipos de perguntas que pode compreender e responder. Por que seu escopo de compreensão é tão estreito?
Em geral, fazer com que os computadores realmente entendam a linguagem é um problema difícil para a IA. Existe um campo conhecido como NLU (Natural Language Understanding) dentro da PNL dedicado a isso.
Poderíamos implementar uma solução baseada em aprendizado de máquina para que nosso bot pudesse compreender uma gama muito mais ampla de solicitações.
Por favor, certifique-se de ler os termos de uso das APIs usadas aqui.