Algunas cosas de PNL relacionadas con la gramática, el etiquetado, la derivación y la desambiguación del sentido de las palabras en Python

Antecedentes (TLDR; proporcionado por el bien de la finalización)

Buscando consejo sobre una solución óptima para un requisito extraño. Soy un estudiante (de literatura) en mi cuarto año de universidad con solo mi propia orientación en progtwigción. Soy lo suficientemente competente con Python para no tener problemas para implementar las soluciones que encuentro (la mayoría de las veces) y desarrollar sobre ellas, pero debido a mi novedad, busco consejos sobre las mejores maneras en que podría abordar este problema peculiar .

Ya estoy usando NLTK, pero de manera diferente a los ejemplos en el libro NLTK. Ya estoy utilizando muchas cosas de NLTK, especialmente WordNet, por lo que ese material no me es extraño. He leído la mayor parte del libro de NLTK. Sabría mejor cómo proceder si estuviera tratando de analizar textos existentes o si los textos de destino eran similares a una prosa, pero mi aplicación se centra en la poesía, en particular en la construcción de textos poéticos sobre la marcha, en base a insumos imprevisibles. de los usuarios.

Estoy trabajando con lenguaje fragmentario, atómico. Mi aplicación se mueve palabra por palabra: en cada ronda, varios usuarios ponen palabras (una palabra por usuario). Mi progtwig busca unificar o combinar estas palabras de entrada para producir una sola palabra de salida. Ya he desarrollado el algoritmo de selección de palabras: utiliza varias características de WordNet para obtener su resultado de una sola palabra. El resultado se encuentra en la forma de un conjunto de palabras de WordNet: una palabra no reflejada (eliminada de la pluralidad y el tiempo). El resultado se anexa al texto del “poema” (después de algunos espacios en blanco). La adición de la palabra resultante influye en la elección de los usuarios de qué palabra tirar en el bote a continuación, y así es como este juego / progtwig avanza, agregando una palabra transformada en una máquina al poema a la vez.

El problema: ¿Cómo flexionar el resultado de una manera gtwigticalmente sensible? Sin ningún tipo de procesamiento gtwigtical, los resultados son solo una lista de palabras de búsqueda de diccionario, sin acuerdo entre palabras. El primer paso es que mi aplicación derive / pluralice / conjugue / inflija las palabras de raíz de acuerdo con el contexto. (Las “palabras de raíz” de las que estoy hablando son synsets de WordNet y / o sus equivalentes legibles por humanos.) Imaginando que ya había un poco de texto gtwigticalmente sensible en el poema con el que comenzar, mi aplicación necesita infligir un nuevo resultado -word para estar de acuerdo con la secuencia existente. Está bien si esto solo funciona como una ventana de 3 palabras o algo así, pero estoy buscando consejos sobre un orden óptimo de operaciones. Espero que alguien pueda darme algunos consejos (espero que sea difícil de implementar, pero quiero asegurarme de que estoy empezando con las ideas correctas).

Escenario de ejemplo (menos contexto más pregunta)

Supongamos que ya tenemos una parte de un poema, al que los usuarios están agregando nuevas entradas. Los nuevos resultados deben ser flexionados de una manera gtwigticalmente sensible.

The river bears no empty bottles, sandwich papers, Silk handkerchiefs, cardboard boxes, cigarette ends Or other testimony of summer nights. The nymphs 

Digamos que mi algoritmo ha tomado un lote de entradas de usuarios, y ahora necesita imprimir 1 de las 4 posibles siguientes palabras / synsets (representadas de manera informal): ['departure', 'to have', 'blue', 'quick'] . Me parece que el 'blue' debería ser descartado; 'The nymphs blue' parece gtwigticalmente impar / improbable. A partir de ahí podría usar cualquiera de estos verbos.

Si elige 'to have' el resultado podría ser sensiblemente inflexionado como 'had' , 'have' , 'having' , 'will have' , 'would have' , etc. (pero no 'has' ). (La línea resultante sería algo así como 'The nymphs have' y el resultado sensiblemente inflexionado proporcionará un mejor contexto para los resultados futuros …)

Me gustaría que 'depature' fuera una posibilidad válida en este caso; mientras que 'The nymphs departure' no tiene sentido (no es "nymphs'" ), 'The nymphs departed' (u otras conjugaciones de verbo ) lo harían.

Aparentemente, 'The nymphs quick' no tendrían sentido, pero algo como 'The nymphs quickly [...]' o 'The nymphs quicken' podrían, por lo que 'quick' también es una posibilidad de inflexión sensible.

Desglosando las tareas

  1. Etiquete parte del habla, pluralidad, tiempo, etc. – de las entradas originales. Tomar nota de esto podría ayudar a seleccionar entre las varias posibilidades (es decir, elegir entre tener / tener / tener podría ser más directo que aleatorio si un usuario hubiera ingresado 'having' lugar de algún otro tiempo). He oído que el etiquetador POS de Stanford es bueno, que tiene una implementación en NLTK. No estoy seguro de cómo manejar la detección de tiempo aquí.
  2. Considerar el contexto para descartar posibilidades gtwigticalmente peculiares. Considere las últimas dos palabras y sus tags de parte del discurso (¿y el tiempo?), Así como los límites de las oraciones, si las hay, y, desde ese punto, elimine las cosas que no tendrían sentido. Después de 'The nymphs' no queremos otro artículo (o determinante, por lo que puedo decir), ni un adjetivo, pero un adverbio o verbo podría funcionar. La comparación de las cosas actuales con las secuencias en los cuerpos etiquetados (¿y / o las cadenas de Markov?), O la consulta de las funciones de verificación gtwigtical, podría proporcionar una solución para esto.
  3. Seleccione una palabra de las posibilidades restantes (aquellas que podrían ser flexionadas sensiblemente). Esto no es algo para lo que necesito una respuesta; tengo mis métodos para esto. Digamos que se selecciona al azar.
  4. Transforme la palabra seleccionada según sea necesario . Si la información del # 1 se puede plegar (por ejemplo, tal vez el indicador “pluralizar” se haya establecido en Verdadero), hágalo. Si hay varias posibilidades (p. Ej., La palabra elegida es un verbo, pero son posibles algunos tiempos), seleccione al azar. En cualquier caso, voy a necesitar transformar la palabra antes de insertarla en el “poema”.

Estoy buscando consejos sobre la solidez de esta rutina, así como sugerencias de pasos para agregar. También serían útiles las formas de desglosar estos pasos. Finalmente, estoy buscando sugerencias sobre qué herramienta podría realizar mejor cada tarea.

Intenté ser lo más conciso posible, a la vez que proporcioné suficiente información. Por favor, no dude en pedirme una aclaración! Apreciaré cualquier información que reciba, y aceptaré la respuesta más clara / iluminadora 🙂 ¡Gracias!

Creo que el comentario anterior sobre el modelo de lenguaje n-gram se adapta a sus requisitos mejor que el análisis y el etiquetado. Los analizadores y etiquetadores (a menos que se modifiquen) sufrirán la falta de un contexto correcto de la palabra de destino (es decir, no tiene el rest de la oración disponible al momento de la consulta). Por otro lado, los modelos de lenguaje consideran el pasado (contexto izquierdo) de manera eficiente, especialmente para ventanas de hasta 5 palabras. El problema con n-grams es que no modelan dependencias de larga distancia (más de n palabras).

NLTK tiene un modelo de lenguaje: http://nltk.googlecode.com/svn/trunk/doc/api/nltk.model.ngram-pysrc.html . Un léxico de tags puede ayudarlo a suavizar más el modelo.

Los pasos a medida que los veo: 1. Obtener un conjunto de palabras de los usuarios. 2. Crea un conjunto más grande de todas las posibles inflexiones de las palabras. 3. Pregunte al modelo qué palabra inflexionada es más probable.