www word_tokenize tutorial spanish remove org freqdist book python unicode nltk

python - word_tokenize - ¿Cómo tokenizar una palabra malayalam?



nltk tutorial (5)

Después de un curso intensivo del idioma de wikipedia ( http://en.wikipedia.org/wiki/Malayalam ), hay algunas cuestiones en su pregunta y las herramientas que ha solicitado para obtener el resultado deseado.

Tarea combinada

En primer lugar, el OP combinó la tarea de análisis morfológico, segmentación y tokenización. A menudo hay una distinción especial, especialmente para idiomas aglutinativos como el turco / malayalam (ver http://en.wikipedia.org/wiki/Agglutinative_language ).

PNL aglutinante y mejores prácticas.

A continuación, no creo que el tokenizer sea ​​apropiado para el malayalam, un lenguaje aglutinante. Como uno de los lenguajes de aglutinación más estudiados en la PNL, el turco adoptó una estrategia diferente en lo que respecta a la "tokenización", descubrieron que es necesario un analizador morfológico completo (consulte http://www.denizyuret.com/2006/11/turkish-resources.html , www.andrew.cmu.edu/user/ko/downloads/lrec.pdf).

Límites de palabras

La tokenización se define como la identificación de unidades lingüísticamente significativas (LMU) del texto de la superficie (ver ¿Por qué necesito un tokenizador para cada idioma? ) Y un idioma diferente requeriría un tokenizador diferente para identificar el límite de la palabra en diferentes idiomas. Diferentes personas han abordado el problema para encontrar diferentes límites de palabras, pero en resumen, en NLP, las personas se han suscrito a lo siguiente:

  1. Los idiomas aglutinantes requieren un analizador morfológico completo, entrenado con algún tipo de modelos lingüísticos. A menudo, solo hay un solo nivel cuando se identifica lo que es token y está en el nivel morfémico, por lo que la comunidad de PNL ha desarrollado diferentes modelos de lenguaje para sus respectivas herramientas de análisis morfológico.

  2. Los lenguajes polisintéticos con límite de palabra especificado tienen la opción de una tokenization dos niveles donde el sistema puede identificar primero una palabra aislada y luego, si es necesario, se debe realizar un análisis morfológico para obtener fichas de grano más fino. Un tokenizer de grano grueso puede dividir una cadena usando cierto delimitador (por ejemplo, word_tokenize o punct_tokenize que usa espacios en blanco / puntuación para el inglés). Luego, para un análisis de grano más fino a nivel morfémico, las personas usualmente usarían algunas máquinas de estados finitos para dividir las palabras en morfemas (por ejemplo, en alemán http://canoo.net/services/WordformationRules/Derivation/To-N/N-To-N/Pre+Suffig.html )

  3. Los lenguajes polisintéticos sin límite de palabra especificado a menudo requieren un segmentador primero para agregar espacios en blanco entre los tokens porque la ortografía no distingue los límites de la palabra (por ejemplo, en https://code.google.com/p/mini-segmenter/ en chino). Luego, a partir de los tokens delimitados, si es necesario, se puede realizar un análisis morfémico para producir tokens de grano más fino (por ejemplo, http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html ). A menudo, estos tokens de grano más fino se atan con etiquetas POS.

En respuesta a la solicitud / pregunta de OP, el OP había utilizado las herramientas incorrectas para la tarea :

  • Para generar tokens para Malayalam, es necesario un analizador morfológico, un tokenizador simple de grano grueso en NLTK no funcionaría.
  • El tokenizer de NLTK está destinado a tokenizar lenguajes polisintéticos con un límite de palabra específico (por ejemplo, inglés / idiomas europeos), por lo que no es que el tokenizer no funcione para el malayalam, simplemente no fue diseñado para tokenizar idiomas aglutinativos.
  • Para lograr el resultado, se debe construir un analizador morfológico completo para el lenguaje y alguien lo haya construido (aclweb.org/anthology//O/O12/O12-1028.pdf), el OP debe comunicarse con el autor del Papel si está interesado en la herramienta.
  • A falta de construir un analizador morfológico con un modelo de lenguaje, aliento al OP a detectar primero los delimitadores comunes que dividen las palabras en morfemas en el lenguaje y luego re.split() el simple re.split() para lograr un tokenizador de referencia.

ഇതുഒരുസ്ടലംമാണ്

itu oru stalam anu

Esta es una cadena Unicode que significa que este es un lugar

import nltk nltk.wordpunct_tokenize(''ഇതുഒരുസ്ഥാലമാണ് ''.decode(''utf8''))

no esta trabajando para mi

nltk.word_tokenize(''ഇതുഒരുസ്ഥാലമാണ് ''.decode(''utf8''))

Tampoco está funcionando otros ejemplos.

"കണ്ടില്ല " = കണ്ടു +ഇല്ല, "വലിയൊരു" = വലിയ + ഒരു

Dividir a la derecha:

ഇത് ഒരു സ്ഥാലം ആണ്

salida:

[u''/u0d07/u0d24/u0d4d/u0d12/u0d30/u0d41/u0d38/u0d4d/u0d25/u0d32/u0d02/u0d06/u0d23/u0d4d'']

Solo necesito dividir las palabras como se muestra en el otro ejemplo. Otra sección de ejemplo es para pruebas. El problema no es con Unicode. Es con la morfología del lenguaje. Para ello necesita utilizar un analizador morfológico.
Echa un vistazo a este papel. http://link.springer.com/chapter/10.1007%2F978-3-642-27872-3_38


Intenté lo siguiente:

# encoding=utf-8 import nltk cheese = nltk.wordpunct_tokenize(''ഇതുഒരുസ്ഥാലമാണ്''.decode(''utf8'')) for var in cheese: print var.encode(''utf8''),

Y como salida, obtuve lo siguiente:

ഇത ു ഒര ു സ ് ഥ ാ ലമ ാ ണ ്

¿Está esto en algún lugar cerca de la salida que desea? Estoy un poco en la oscuridad, ya que es difícil hacerlo bien sin entender el idioma.


Parece que tu espacio es el carácter Unicode u''/u0d41'' . Así que deberías str.split() normalmente con str.split() .

import sys reload(sys) sys.setdefaultencoding("utf-8") x = ''ഇതുഒരുസ്ഥാലമാണ്''.decode(''utf8'') y = x.split(u''/u0d41'') print " ".join(y)

[afuera]:

ഇത ഒര സ്ഥാലമാണ്`


Un tokenizer es de hecho la herramienta correcta; Ciertamente esto es lo que el NLTK los llama. Un analizador morfológico (como en el artículo al que se vincula) es para dividir palabras en partes más pequeñas (morfemas). Pero en su código de ejemplo, trató de usar un tokenizador que es apropiado para el inglés: reconoce palabras delimitadas por espacios y tokens de puntuación. Ya que Malayalam evidentemente no indica límites de palabras con espacios, o con cualquier otra cosa, necesita un enfoque diferente.

Por lo tanto, el NLTK no proporciona nada que detecte límites de palabras para Malayalam. Sin embargo, podría proporcionar las herramientas para construir uno decente con bastante facilidad.

El enfoque obvio sería intentar buscar en el diccionario: intente dividir su entrada en cadenas que están en el diccionario. Pero sería más difícil de lo que parece: necesitaría un diccionario muy grande, aún tendría que tratar con palabras desconocidas de alguna manera, y dado que Malayalam tiene una morfología no trivial, es posible que necesite un analizador morfológico para que coincida con las palabras inflexionadas. el diccionario. Suponiendo que puede almacenar o generar cada forma de palabra con su diccionario, puede usar un algoritmo como el que se describe here (y ya mencionado por @amp) para dividir su entrada en una secuencia de palabras.

Una mejor alternativa sería utilizar un algoritmo estadístico que pueda adivinar dónde están los límites de las palabras. No conozco un módulo de este tipo en la NLTK, pero ha habido bastante trabajo en esto para los chinos. Si vale la pena, puede encontrar un algoritmo adecuado y capacitarlo para trabajar en Malayalam.

En resumen: los tokenizadores de NLTK solo funcionan para el estilo tipográfico del inglés. Puede entrenar una herramienta adecuada para trabajar en Malayalam, pero el NLTK no incluye dicha herramienta por lo que sé.

PD. El NLTK viene con varias herramientas de tokenización estadística; El PunctSentenceTokenizer puede entrenarse para reconocer límites de oraciones usando un algoritmo de aprendizaje no supervisado (lo que significa que no es necesario marcar los límites en los datos de entrenamiento). Desafortunadamente, el algoritmo se enfoca específicamente en el problema de las abreviaturas, por lo que no puede adaptarse a la detección de límites de palabras.


Tal vez el algoritmo de Viterbi podría ayudar?

Esta respuesta a otra pregunta de SO (y la otra respuesta de voto alto) podría ayudar: https://.com/a/481773/583834