Extrair informações da frase

11

Estou criando um chatbot simples. Eu quero obter as informações da resposta do usuário. Um cenário de exemplo:

Bot : Hi, what is your name?
User: My name is Edwin.

Desejo extrair o nome Edwin da frase. No entanto, o usuário pode responder de diferentes maneiras, como

User: Edwin is my name.
User: I am Edwin.
User: Edwin. 

Estou tentando confiar nas relações de dependência entre as palavras, mas o resultado não se sai bem.

Alguma idéia de qual técnica eu poderia usar para resolver esse problema?

[ATUALIZADA]

Eu testei com o reconhecimento de entidade nomeada, juntamente com parte do marcador e analisador de fala. Descobri que a maioria dos modelos é treinada de maneira que o primeiro caractere da entidade para o nome da pessoa ou o nome próprio deva estar em maiúsculas. Isso pode ser verdade para documentos normais, mas é irrelevante para um chatbot. Por exemplo

User: my name is edwin.

A maioria dos NER não conseguiu reconhecer isso.

Edwin
fonte
Isso explica como os bots de bate-papo modernos são criados, mas eu não diria que é simples. Você pode saber mais pesquisando "resposta a perguntas".
Emre
I assim como a forma como as pessoas que pedem perguntas e receber respostas marcar uma resposta como um aceitável: P
chewpakabra

Respostas:

7

Você pode usar uma combinação de reconhecimento de entidade nomeada e análise sintática - enquanto a palavra Edwin certamente está se sustentando, imagine uma situação em que o nome seja Edward Philip Martel . O NER detecta cada palavra como uma entidade separada (daí três entidades diferentes) - assim, você terá que encadeá-las com base em alguma lógica. Além disso, no caso de vários nomes estarem presentes, pode ser mais difícil desambiguar (por exemplo, John & Ramsey jantaram em Winterfell ).

É aqui que a análise da sintaxe da sentença também ajudaria (supondo que o usuário final insira uma sentença relativamente coerente e adequada - se gírias e formas curtas de texto forem usadas, até a PNL de Stanford pode ajudar até certo ponto).

Uma maneira de aproveitar a análise / análise de sintaxe e o NER é nos seguintes exemplos -

 1. User: Edwin is my name.
 2. User: I am Edwin.
 3. User: My name is Edwin.

Em cada um dos casos (como também é genericamente o caso), o Nome da entidade (Substantivo / Substantivo próprio) é associado próximo a um Verbo. Portanto, se você primeiro analisar a sentença para determinar verbos e depois aplicar NER a palavras adjacentes (+/- 1 ou 2), poderá ter uma maneira relativamente decente de resolver o problema. Essa solução depende principalmente das regras de sintaxe que você cria para identificar os NERs, bem como da janela ao redor dos verbos.

vsdaking
fonte
2
Você possivelmente implementará um 'autômato finito não determinístico', em que cada sentença é uma resposta que um padrão aceita. Algumas gramáticas são implementadas em algo assim. (PNL / gramática). Se você precisar fazer isso, consulte o framework stanfordnlp.github.io/CoreNLP
Intruso
5

Você deve usar o reconhecimento de entidade nomeada, por exemplo, do NLTK, http://www.nltk.org/book/ch07.html <- você pode encontrar um exemplo de uso lá. Funcionaria muito bem para o seu caso descrito.

chewpakabra
fonte
4

Isso pode ser feito facilmente com os CRFs . Você pode usar a codificação BIO para marcar sua frase. Depois, passe para os CRFs. Você só precisa criar algumas frases marcadas para fins de treinamento, como a seguir,

 I am Edwin.
 O O  B-NAME

 You can call me Alfred
 O   O    O    O B-NAME

 My name is  Edwin   thomas
 O  O     O  B-NAME  I-NAME

CRFsuite e CRF ++ são algumas das boas implementações. O CRFsuite possui um wrapper python chamado pycrfsuite , que é bastante fácil de implementar. Verifique este bloco de notas ipython ou este trecho de código no github para obter a implementação completa do NER.

verifique este projeto de bot de bate-papo de código aberto no github com NER e Intent Classification escritos em python. Eles têm uma interface de treinamento fácil de usar, onde você pode treinar seu bot para extrair informações de frases.

Alfred Francis
fonte
0

Para executar essas tarefas com alta precisão, sugiro que você construa um modelo LSTM com incorporação de palavras com a ajuda do word2vec. Os LSTMs podem ajudar a recuperar informações da frase, bem como prever o próximo caractere ou palavra, dado que um conjunto de palavras já está presente na frase.

enterML
fonte