44
César Antonio Aguilar Facultad de Lenguas y Letras 02/05/2012 Curso de procesamiento del lenguaje natural [email protected]

Curso de procesamiento del lenguaje natural - Iniciocesaraguilar.weebly.com/uploads/2/7/7/5/2775690/pln_uc_08.pdf · Un hecho que se da muchas veces por sentado en lenguaje natural

  • Upload
    voxuyen

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

César Antonio Aguilar Facultad de Lenguas y Letras

02/05/2012

Curso de procesamiento del lenguaje natural

[email protected]

Un hecho que se da muchas veces por sentado en lenguaje natural es el término palabra. Usualmente, la vemos como una cadena de caracteres delimitada por espacios en blanco, con un contenido léxico específico, además de tener rasgos fonológicos, morfológicos y sintácticos. Ahora, ¿esto es así de claro siempre? ¿Qué pasa con las lenguas que tienen como medio de escritura los ideogramas?

El primer grafo se pronuncia rén, y significa “persona”; el segundo se prouncia mù, y significa “árbol”. Ambos son identificados como “palabras”.

¿Qué es una palabra dentro de un corpus? (1)

¿Qué es una palabra dentro de un corpus? (2)

Otro caso, por ejemplo, son las lenguas con morfología aglutinante, p. e., en alemán una frase como La biblioteca de la Universidad de Stuttgart equivalen a dos palabras: Universitätsbibliothek Stuttgart . Existen casos curiosos como la palabra Bundeslandwirtschaftsministerin, que equivale en español a Ministro de Estado para Asuntos Económicos.

¿Qué es una palabra dentro de un corpus? (3)

Incluso en español tenemos casos curiosos. ¿Cómo escribirían estas palabras?:

Análisis al nivel de palabra (1)

Análisis al nivel de palabra (2)

Análisis al nivel de palabra (3)

Un déjà vu con el POS

¿Por qué es útil el etiquetado POS?

Textos crudos y cocidos

Procesando textos nuevamente (1)

Una vez hecho esto, importemos nuestro archivo de texto:

Cadena_Turing01 = open(‘Escritorio/turing01.txt', 'rU').read()

Retomemos nuestros experimentos con NLTK, para lo cual vamos a emplear nuestro conocido texto sobre Turing. Las herramientas que requerimos importar primero son:

Procesando textos nuevamente (2)

Volvamos a desarrollar el código que hicimos la clase pasada:

1. Tokenizar con la opción que NLTK da default: Tokens_Turing01 = nltk.word_tokenize(Cadena_Turing01) 2. Insertar etiquetas POS default desde NLTK: Tagged_Turing01 = nltk.pos_tag(Tokens_Turing01) 3. Mostrar algunos resultados: Tagged_Turing01[0:100]

Pregunta: ¿que tenemos realmente en nuestro archivo Turing: types o tokens asociados a palabras? Mientras pensamos esto, resolvamos la siguiente cuestión: ¿cuántas palabras hay aquí?

Procesando textos nuevamente (3)

Procesando textos nuevamente (4)

Procesando textos nuevamente (5)

>>> Tokens_Turing01 = nltk.word_tokenize(Cadena_Turing01)

Procesando textos nuevamente (6)

Un resultado conocido:

Procesando textos nuevamente (6)

Un atajo: podemos tokenizar directamente nuestro documento con las siguientes funciones:

El algoritmo de Porter (1)

La lematización de corpus textuales (sobre todo en inglés) ha tenido un avance considerable a partir de la implementación del algoritmo de Porter.

http://tartarus.org/~martin/PorterStemmer/def.txt

Para ahorrarnos unas palabras, veamos la explicación que da de este algortimo Dan Jurafsky en su curso:

El algoritmo de Porter (2)

Las reglas que aplica Porter son las siguientes:

El algoritmo de Porter (3)

El algoritmo de Porter (4)

El algoritmo permite trabajar con palabras que tengan flexión regular o irregular:

El algoritmo de Porter (4)

Finalmente, este algoritmo nos permite hacer un análisis morfológico bastante eficaz, incluso adaptándolo a otras lenguas.

El algoritmo de Porter (5)

El algoritmo de Porter (6)

http://snowball.tartarus.org/algorithms/spanish/stemmer.html

El algoritmo de Brill (1)

Otro algoritmo útil en esta clase de procesamiento al nivel de palabra es el que desarrolló Eric Brill, el cual reconoce formas de palabras, asociándolas posteriormente a una etiqueta sintáctica. Al respecto pueden ver el siguiente sitio WEB:

Eric Brill

http://en.wikipedia.org/wiki/Brill_tagger

El algoritmo de Brill (2)

El algoritmo de Brill se fundamenta en el aprendizaje basado en transformaciones y dirigido por el error. Este algoritmo consta de los siguientes módulos:

El algoritmo de Brill (3)

El etiquetador léxico funciona del siguiente modo:

El algoritmo de Brill (4)

Por su parte, el etiquetador de palabras desconocidas intenta adivinar una etiqueta para una palabra desconocida en función de sus afijos (sufijos o prefijos), y de otras propiedades relevantes similares

El algoritmo de Brill (5)

El algoritmo de Brill cuenta también con una plantilla genérica de transformaciones léxicas, esto es:

El algoritmo de Brill (5)

Un ejemplo de transformaciones:

El algoritmo de Brill (6)

Ejemplos de aplicación en español:

El algoritmo de Brill (7)

El etiquetador contextual actúa justo después del etiquetador de palabras desconocidas, ya que aplica en orden una secuencia de reglas contextuales que han sido aprendidas de manera automática a partir del corpus de entrenamiento. Un ejemplo es:

El algoritmo de Brill (8)

El etiquetador contextual también cuenta con una plantilla de transformaciones:

El algoritmo de Brill (9)

Veamos un caso aplicado al inglés. Supongamos que queremos aplicar un proceso de etiquetado basados en el Corpus Brown:

El algoritmo de Brill (10)

Aplicamos nuestro etiquetador, y obtenemos oraciones anotadas como:

El algoritmo de Brill (11)

Si aplicamos el algoritmo de Brill, el módulo de etiquetado contextual podría aplicar las siguientes reglas:

El algoritmo de Brill (12)

Para mayores detalles, pueden consultar la siguiente página, la cual es una explicación que dan Miguel Alonso, Jorge Graña y Jesús Virales, de la Universidad de La Coruña (España):

http://www.grupolys.org/docencia/ln/biblioteca/traspas_brill.pdf

Aplicando la segunda regla obtenemos:

Vamos a complementar el uso del algoritmo de Porter con otro similar, llamado alroritmo de Lancaster:

El algoritmo de Porter en NLTK (1)

>>> lancaster = nltk.LancasterStemmer()

NLTK nos permite usar estos dos algoritmos de manera automática para detectar raíces en nuestros textos. En esta clase, vamos a abordar en concreto el algoritmo de Porter. La instrucción para importarlo es:

>>> porter = nltk.PorterStemmer()

El algoritmo de Porter en NLTK (2)

El resultado lo podemos ver en la siguiente lámina:

>>> [porter.stem(t) for t in Tokens_Turing01]

Apliquemos entonces el algoritmo de Porter con la siguiente instrucción:

El algoritmo de Porter en NLTK (3)

Intuitivamente, ¿qué errores comete el algoritmo en nuestro texto? ¿De qué manera creen que puedan mejorarse?

El algoritmo de Porter en NLTK (4)

El resultado lo podemos ver en la siguiente lámina:

>>> [lancaster.stem(t) for t in Tokens_Turing01]

Ahora, usemos el algoritmo de Lancaster:

El algoritmo de Porter en NLTK (5)

¿Qué diferencias encuentran respecto a los resultados arrojados por el algoritmo de Porter?

Usando WordNet para lematizar palabras (1)

La instrucción es:

http://wordnet.princeton.edu/perl/webwn

>>> wnl_Turing01 = nltk.WordNetLemmatizer() >>> [wnl_Turing01.lemmatize(t) for t in Tokens_Turing01]

Finalmente, también se puede lematizar un documento. Para ello, NLTK emplea como diccionario una red léxica (otros lo llamarían ontología) con un listado de palabras asociadas a uno o varios ítems léxicos. Esta red léxica es WordNet.

Usando WordNet para lematizar palabras (2)

Resultado:

¿Qué diferencias encuentran respecto a

la tokenización y la lematización?

¿En qué les podría

resultar útil?

Blog del curso: http://cesaraguilar.weebly.com/curso-de-procesamiento-del-lenguaje-natural.html

Gracias por su atención