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.
Respostas:
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 -
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.
fonte
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.
fonte
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,
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.
fonte
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.
fonte