Estoy creando un chatbot simple. Quiero obtener la información de la respuesta del usuario. Un ejemplo de escenario:
Bot : Hi, what is your name?
User: My name is Edwin.
Deseo extraer el nombre Edwin de la oración. Sin embargo, el usuario puede responder de diferentes maneras, como
User: Edwin is my name.
User: I am Edwin.
User: Edwin.
Intenté confiar en las relaciones de dependencia entre palabras, pero el resultado no funciona bien.
¿Alguna idea de qué técnica podría utilizar para abordar este problema?
[ACTUALIZADO]
Probé con reconocimiento de entidad con nombre junto con parte de etiquetador y analizador de voz. Descubrí que la mayoría de los modelos están entrenados de tal manera que el primer carácter de la entidad para el nombre de la persona o el nombre propio debe estar en mayúscula. Esto puede ser cierto para documentos normales, pero es irrelevante para un chatbot. P.ej
User: my name is edwin.
La mayoría de los NER no pudieron reconocer esto.
Respuestas:
Posiblemente pueda usar una combinación de Reconocimiento de entidades con nombre y Análisis sintáctico, mientras que la palabra Edwin ciertamente está apuntalando, imagine una situación en la que el nombre es Edward Philip Martel . NER detecta cada palabra como entidades separadas (por lo tanto, 3 entidades diferentes), por lo tanto, de todos modos tendrá que unirlas según alguna lógica. Además, en el caso de que haya múltiples nombres presentes, puede ser más difícil desambiguar (por ejemplo, John y Ramsey cenaron en Winterfell ).
Aquí es donde el análisis de la sintaxis de las oraciones también ayudaría (suponiendo que el usuario final ingrese una oración relativamente coherente y adecuada, si se usa argot y formas cortas de texto, incluso el PNL de Stanford puede ayudar hasta cierto punto solamente).
Una forma de aprovechar el análisis / análisis sintáctico y NER es en los siguientes ejemplos:
En cada uno de los casos (como también es el caso genérico), el nombre de la entidad (nombre propio / nombre) se asocia muy cerca de un verbo. Por lo tanto, si primero analiza la oración para determinar los verbos y luego aplica NER a las palabras circundantes (+/- 1 o 2), puede tener una forma relativamente decente de resolver el problema. Esta solución dependerá principalmente de las reglas de sintaxis que cree para identificar NER, así como la ventana alrededor de los verbos.
fuente
Debe usar el reconocimiento de entidad con nombre, por ejemplo de NLTK, http://www.nltk.org/book/ch07.html <- puede encontrar un ejemplo de uso allí. Funcionaría para su caso descrito bastante bien.
fuente
Esto se puede hacer fácilmente con CRF s. Puede usar la codificación BIO para etiquetar su oración. Luego páselo a los CRF. Solo tiene que crear algunas oraciones etiquetadas para fines de capacitación de la siguiente manera,
CRFsuite y CRF ++ son algunas de las buenas implementaciones. CRFsuite tiene un contenedor de python llamado pycrfsuite , que es bastante fácil de implementar. Consulte este cuaderno de ipython o este fragmento de código en github para la implementación de extremo a extremo de NER.
verifique este proyecto de bot de chat de código abierto en github con NER y clasificación de intención escrita en python. Tienen una interfaz de usuario de entrenamiento fácil de usar donde puedes entrenar a tu bot para extraer información de las oraciones.
fuente
Para realizar tales tareas con alta precisión, le sugiero que cree un modelo LSTM con incrustaciones de palabras con la ayuda de word2vec. Los LSTM pueden ayudar a recuperar información de la oración, así como a predecir el siguiente carácter o palabra dado que un conjunto de palabras ya está presente en la oración.
fuente