python - texto - nltk tutorial
Python: ¿cómo se intuye la palabra a partir de texto abreviado utilizando NLP? (4)
Hace poco estuve trabajando en un conjunto de datos que usaba abreviaturas para varias palabras. Por ejemplo,
wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball
No parecía haber consistencia en términos de la convención utilizada, es decir, a veces usaban vocales a veces no. Estoy tratando de construir un objeto de mapeo como el anterior para abreviaturas y sus palabras correspondientes sin un corpus completo o una lista completa de términos (es decir, podrían introducirse abreviaturas que no se conocen explícitamente). Por simplicidad, di que está restringido a cosas que podrías encontrar en un gimnasio, pero podría ser cualquier cosa.
Básicamente, si solo observa el lado izquierdo de los ejemplos, qué tipo de modelo podría hacer el mismo procesamiento que nuestro cerebro en términos de relacionar cada abreviación con la etiqueta de texto completo correspondiente.
Mis ideas se han detenido al tomar la primera y la última letra y encontrarlas en un diccionario. Luego asigne probabilidades a priori basadas en el contexto. Pero dado que hay una gran cantidad de morfemas sin un marcador que indica el final de la palabra, no veo cómo es posible dividirlos.
ACTUALIZADO:
También tuve la idea de combinar un par de algoritmos de métrica de cadena como un algoritmo de clasificación de coincidencia para determinar un conjunto de términos relacionados y luego calcular la distancia de Levenshtein entre cada palabra en el conjunto a la abreviatura de destino. Sin embargo, todavía estoy a oscuras cuando se trata de abreviaturas para palabras que no están en un diccionario maestro. Básicamente, deducir la construcción de palabras: un modelo de Naive Bayes podría ayudar, pero me preocupa que cualquier error de precisión causado por el uso de los algoritmos anteriores invalide cualquier proceso de capacitación modelo.
Cualquier ayuda es apreciada, ya que estoy realmente atrapado en esta.
... abreviaturas para palabras que no están en un diccionario maestro.
Entonces, ¿está buscando un modelo de PNL que pueda proponer palabras en inglés válidas sin haberlas visto antes?
Probablemente sea más fácil encontrar un diccionario de palabras más exhaustivo, o quizás asignar cada palabra en el diccionario existente a extensiones comunes como +"es"
o word[:-1] + "ies"
.
Así que miré un problema similar y encontré un paquete fantástico llamado PyEnchant . Si usas la construcción en el corrector ortográfico puedes obtener sugerencias de palabras, lo que sería una solución sencilla y agradable. Sin embargo, solo sugerirá palabras sueltas (hasta donde yo sé), y entonces la situación que tiene:
wtrbtl = water bottle
No trabajará.
Aquí hay un código:
import enchant
wordDict = enchant.Dict("en_US")
inputWords = [''wtrbtl'',''bwlingbl'',''bsktball'']
for word in inputWords:
print wordDict.suggest(word)
El resultado es:
[''rebuttal'', ''tribute'']
[''bowling'', ''blinding'', ''blinking'', ''bumbling'', ''alienable'', ''Nibelung'']
[''basketball'', ''fastball'', ''spitball'', ''softball'', ''executable'', ''basketry'']
Quizás si sabes qué tipo de abreviaturas hay, puedes separar la cadena en dos palabras, por ejemplo
''wtrbtl'' -> [''wtr'', ''btl'']
También está el Kit de procesamiento de lenguaje natural ( NLTK ), que es INCREÍBLE, y puede usar esto en combinación con el código anterior al observar qué tan común es cada palabra sugerida, por ejemplo.
¡Buena suerte!
Si no puede encontrar un diccionario exhaustivo, podría compilar (o descargar) un modelo de lenguaje probabilístico, para generar y evaluar candidatos de oración para usted. Podría ser un modelo de n-gram de caracteres o una red neuronal.
Para sus abreviaturas, puede construir un "modelo de ruido" que predice la probabilidad de omisiones de caracteres. Puede aprender de un corpus (debe etiquetarlo manualmente o a medias) que las consonantes se pierden con menos frecuencia que las vocales.
Con un modelo de lenguaje complejo y un modelo de ruido simple, puede combinarlos utilizando un enfoque de canal ruidoso (consulte, por ejemplo, el artículo de Jurafsky para obtener más detalles), para sugerir oraciones candidatas.
Actualización . Me entusiasmé con este problema e implementé este algoritmo:
- modelo de lenguaje (personaje de 5 gramos entrenado en el texto del Señor de los Anillos)
- modelo de ruido (probabilidad de que cada símbolo sea abreviado)
- algoritmo de búsqueda de haz, para sugerencia de frase candidata.
Mi solución está implementada en este cuaderno de Python . Con modelos entrenados, tiene una interfaz como noisy_channel(''bsktball'', language_model, error_model)
, que, por cierto, devuelve {''basket ball'': 33.5, ''basket bally'': 36.0}
. Los valores del diccionario son puntajes de las sugerencias (cuanto más bajo, mejor).
Con otros ejemplos, funciona peor: para ''wtrbtl'' regresa {''water but all'': 23.7, ''water but ill'': 24.5, ''water but lay'': 24.8, ''water but let'': 26.0, ''water but lie'': 25.9, ''water but look'': 26.6}
.
Para ''bwlingbl'' da {''bwling belia'': 32.3, ''bwling bell'': 33.6, ''bwling below'': 32.1, ''bwling belt'': 32.5, ''bwling black'': 31.4, ''bwling bling'': 32.9, ''bwling blow'': 32.7, ''bwling blue'': 30.7}
. Sin embargo, cuando se entrena en un corpus apropiado (por ejemplo, revistas deportivas y blogs, tal vez con sobremuestreo de nombres), y tal vez con un ancho más generoso de búsqueda de rayos, este modelo proporcionará sugerencias más relevantes.
Una opción es retroceder en el tiempo y calcular el equivalente del algoritmo Soundex .
Soundex suelta todas las vocales, maneja errores de pronunciación comunes y deletrea la ortografía. El algoritmo es simplista y solía hacerse a mano. El inconveniente es que no tiene una palabra especial derivada o detiene el soporte de trabajo.