Universidad Internacional de La Rioja (UNIR) - Máster Universitario en Inteligencia Artificial - Procesamiento del Lenguaje Natural


Datos del alumno (Nombre y Apellidos): Víctor Gomez Fafan

Fecha: 2 de mayo 2022


Trabajo: Etiquetado morfosintáctico

Objetivos

Con esta actividad se tratará de que el alumno consiga aplicar un método basado en modelos ocultos de Markov (HMM) para realizar el etiquetado morfosintáctico de una oración.

Descripción

En esta actividad debes implementar en Python un etiquetador morfosintáctico basado en modelos ocultos de Markov (HMM) y realizar el etiquetado morfosintáctico de la oración:

Habla con el enfermo grave de trasplantes.

Implementando también en Python el algoritmo de Viterbi.

Parte 1: Construir el etiquetador morfosintáctico

En esta primera parte de la actividad tienes que implementar en Python el etiquetador morfosintáctico basado en un HMM bigrama a partir de un corpus etiquetado.


Para ello debes utilizar el corpus mia07_t3_tra_Corpus-tagged, que se encuentra disponible en el aula virtual.


El corpus se compone de frases en español etiquetadas con conocimiento sobre las partes de la oración (categorías gramaticales o POS tags). Estas frases etiquetadas han sido extraídas de algunos documentos que forman parte de Wikicorpus, un corpus trilingüe (español, catalán e inglés) compuesto por más de 750 millones de palabras. Wikicorpus fue creado por investigadores de la Universitat Politèncnica de Catalunya a partir de documentos de la Wikipedia que fueron anotados con la librería opensource FreeLing.

La tabla 1 muestra en formato de texto plano y sin etiquetar algunos ejemplos de frases que componen el corpus. De hecho, también se indica el identificador del documento del cual han sido extraídas las frases etiquetadas.

La versión anotada la conforma el corpus anotado proporcionado para realizar esta actividad. El formato del fichero de texto que contiene el corpus es el mismo que el utilizado en Wikicorpus. Por lo tanto, cada uno de los documentos de Wikipedia se identifica con el tag XML donde se indica el identificador del documento (id).

Además, cada una de las frases en el documento viene separada por una línea en blanco. La información relativa a cada palabra de la frase se representa en una nueva línea del fichero. Para cada palabra, es decir, en cada línea del fichero, se proporciona —además del token que representa a la propia palabra— su lema, la etiqueta gramatical (POS tag) asociada a la palabra y el sentido de esta.

La figura 1 muestra una captura del corpus anotado, donde se observa la frase «Tristana es una película del director español nacionalizado mexicano Luis Buñuel.» perteneciente al documento de Wikicorpus con identificador 27315 y titulado Tristana.

Si se analizan las anotaciones para la palabra «es», se observa que su lema es «ser», que la categoría gramatical a la que pertenece esa palabra es la identificada por la etiqueta gramatical «VSIP3S0» y que el sentido de la palabra es el identificado por el código «01775973175».

También se observa que la palabra «del» en la frase se representa en dos líneas y se anota con dos tokens, el primero «de» y el segundo «el». Esto se debe a que la palabra «del» es la contracción de la preposición «de» y el artículo «el». Por el contrario, el nombre propio «Luis Buñuel», que está formado por dos palabras (el nombre «Luis» y el apellido «Buñuel»), se anota como un único token «luis_buñuel». Además, se observa que el punto final de la frase también viene anotado como un token «.».

Aunque el corpus anotado proporciona más información (ver figura 1), es importante tener en cuenta de que para realizar esta actividad solo será necesario el token y la etiqueta gramatical (POS tag) de cada palabra; es decir, la información contenida en la primera y la tercera cadena de cada línea que representa una palabra en el corpus anotado.

Las etiquetas gramaticales (POS tags) utilizadas para anotar la información morfosintáctica del corpus son las definidas en FreeLing y se basan en EAGLES, una recomendación para la anotación de la mayoría de las lenguas europeas. La definición del conjunto de etiquetas gramaticales (POS tags) utilizadas por FreeLing en el etiquetado de un corpus en español se puede consultar en la web.


Accede al recurso a través del aula virtual o desde la siguiente dirección web: https://freeling-user-manual.readthedocs.io/en/v4.1/tagsets/tagset-es/


Las etiquetas gramaticales de EAGLES utilizadas por FreeLing son de longitud variable, donde cada carácter corresponde a una característica morfosintáctica. El primer carácter en la etiqueta es siempre la categoría gramatical o parte de la oración. Esa categoría gramatical determina la longitud de la etiqueta y la interpretación de cada uno del resto de caracteres en la misma.

La definición de la etiqueta para la categoría gramatical «verbo» se muestra en la tabla 2. Entonces, la etiqueta «VSIP3S0», con la que ha sido etiquetada la palabra «es» en la frase que se presentó anteriormente, se interpreta de la siguiente forma: se refiere a un verbo (V) de tipo semiauxiliar (S) en modo indicativo (I) y en tiempo presente (P) para la tercera persona (3) de (número) singular (S). Asimismo, el carácter «0» al final de la etiqueta indica que esta forma verbal no tiene género.

Es importante destacar que para realizar la actividad se deben utilizar las etiquetas con las que se anota el corpus en formato EAGLES; por ejemplo, «VSIP3S0».

Importante: Si se utilizan otras etiquetas la actividad será considerada incorrecta y puntuada con cero puntos.

Para construir el etiquetador morfosintáctico a partir del corpus etiquetado con los datos de entrenamiento, deberás seguir los siguientes pasos:

Nota: Presenta en el envío de la actividad la tabla (guardada en formato de hoja de cálculo de Microsoft Excel (.xlsx) o equivalente) con las probabilidades de emisión y las de transición, calculadas para todas las etiquetas y tokens (palabras) que aparecen en el corpus.

Cargar el corpus para extraer la primera y tercera columna de cada registro

En primer lugar se va a cargar el corpus leyendo el archivo y recuperando la información de la primera y tercera columna de cada registro que continen el token de la palabra y la etiqueta, respectivamente.

Estos valores se almacenarán en objetos de la clase Palabra.

Esta clase permitirá recuperar el Token() y el Tag() fácilmente para cada registro.

El corpus se guardará como una lista que a su vez contiene una serie de listas de objetos del tipo Palabra. Cada una de las listas de objetos del tipo Palabra guarda una oración.

El siguiente código te permite imprimir el corpus:

Calcular las probabilidades que rigen el HMM bigrama

Una vez se dispone del corpus correctamente cargado se creará un objeto, hmmbigrama de la clase HMMBigrama.

hmmbigrama permitirá hacer el cálculo de las tablas de probabilidades de transición y de emisión.

El siguiente código te permite crear el HMM Bigrama y obtener información relevante:

El método ProbabilidadesDeTransición() de la clase HMMBigrama devuelve la tabla de probabilidades de transición.

El método ProbabilidadesDeEmision() de la clase HMMBigrama devuelve la tabla de probabilidades de emisión.

Parte 2: Etiquetar morfosintácticamente una oración

En esta segunda parte de la actividad tienes que implementar en Python un programa que permita calcular la mejor secuencia de etiquetas para una oración, dicho de otro modo, realizar el etiquetado morfosintáctico de la oración: «Habla con el enfermo grave de trasplantes. ».

Para ello debes utilizar el etiquetador que has construido en la parte 1 de esta actividad, es decir las tablas de probabilidades calculadas, y aplicar el algoritmo de Viterbi.

Para aplicar el algoritmo de Viterbi, se deben seguir los siguientes pasos:

Nota: Presenta en el envío de la actividad la tabla (guardada en formato de hoja de cálculo de Microsoft Excel (.xlsx) o equivalente) con la matriz de probabilidades de la ruta Viterbi para el etiquetado morfosintáctico de la oración «Habla con el enfermo grave de trasplantes. ».

Calcular la matriz de probabilidades de la ruta de Viterbi

La clase Viterbi permitirá realizar el cálculo de la matriz de probabilidades de la ruta de Viterbi y la posterior decodificación de la secuencia óptima de etiquetado para una oración a analizar.

El etiquetado morfosintáctico creado en la Parte 1, es decir el objeto hmmbigrama de la clase HMMBigrama, será proporcionado al objeto viterbi de la clase Viterbi para poder aplicar el Algoritmo de Viterbi.

El cálculo de los valores de Viterbi se realiza en el método Probabilidades() de la clase Viterbi.

Obtener la ruta con máxima probabilidad

El método DecodificacionSecuenciaOptima() de la clase Viterbi permite obtener la secuencia de etiquetas más probables para la oración a analizar.

El siguiente código te permite realizar el análisis de la oración: "Habla con el enfermo grave de trasplantes."

El siguiente código te permite mostrar la matriz de probabilidades de la ruta de Viterbi (solo se presentan aquellas etiquetas que tienen algún valor no nulo para alguna de las palabras de la oración analizada).

El siguiente código te permite mostrar la ruta de Viterbi con máxima probabilidad

Mostrar la oración etiquetada

El siguiente código te permite mostrar la oración etiquetada

Se analiza uso de algoritmo viterno con la frase "El enfermo grave habla de trasplantes"

Parte 3: Analizar el etiquetador morfosintáctico

Una vez hayas creado el etiquetador morfosintáctico y lo hayas utilizado para etiquetar la oración «Habla con el enfermo grave de trasplantes.», reflexiona sobre los resultados obtenidos, interprétalos y analiza el rendimiento del etiquetador creado y sus limitaciones. Para ello responde de forma razonada a las siguientes preguntas:

Para la frase original "Habla con el enfermo grave de traspantes" se observa la siguiente clasificacion

habla / VMIP3S0

con / SPS00

el / DA0MS0

enfermo / NCMS000

grave / AQ0CS0

de / SPS00

trasplantes / NCMP000

. / Fp

Viendo en detalles cada clasificación se obseva que cada identificacion esta corresctamente definida. o sea, a pesar que algunas palabras en el corpus puede tener mas de una clasificacion, el algoritmo identifica adecuadamente el tipo de palabra segun su contexto . Viendo en detalles tenemos

habla / VMIP3S0 :

V:Verb, M:Main, I:indicativ, P:Present,3:3,S:Singular; No gen -. Correcto

con / SPS00 :

S:Adposition, P:Preposition Correcto

el / DA0MS0 :

D:Determiner, A:Article, No person, M:Masculine, S:Singular, No possessornum - Corecto

enfermo / NCMS000 :

N:Noun, C:Common, M:Masculine, S:Person; No nesubclas; No degree - Correcto

grave / AQ0CS0 :

A:Adjective, Q:Qualificative, No degree, C:Common; S:Singular; No possessorpers - Correcto

de / SPS00 :

S:Adposition, P:Preposition Correcto

trasplantes / NCMP000 :

N:Noun, C:Common, M:Masculine; P:Plural; No neclass; No nesubclass; No degree Correcto

el / DA0MS0

enfermo / NCMS000

grave / AQ0CS0

habla / VMIP3S0

de / SPS00

trasplantes / NCMP000

En esta frase las palabras solo cambian ubicaciones pero ninguna de ellas cambia su clasificacion gramatical. Por eso al aplicar el algoritmo ya definido, lo esperado es que se mantengan las clasificaciones. Se observa que eso ocurre y que sigue el sistema manteniendo clasificaciones correctas

el / DA0MS0 :

D:Determiner, A:Article, No person, M:Masculine, S:Singular, No possessornum - Correcto

enfermo / NCMS000 :

N:Noun, C:Common, M:Masculine, S:Person; No nesubclas; No degree - Correcto

grave / AQ0CS0 :

A:Adjective, Q:Qualificative, No degree, C:Common; S:Singular; No possessorpers - Correcto

habla / VMIP3S0 :

V:Verb, M:Main, I:indicativ, P:Present,3:3,S:Singular; No gen -. Correcto

de / SPS00 :

S:Adposition, P:Preposition Correcto

trasplantes / NCMP000 :

N:Noun, C:Common, M:Masculine; P:Plural; No neclass; No nesubclass; No degree Correcto

El analizador morfosintactico se basa principalmente en el uso de un corpus base para la conformacion de las estadisticas de aparicion, las que posteriormente generaran las tablas probabilisticas.

Claramente la calidad de este clasificador depende de la amplitud del corpus y de la calidad del etiquetado.

Imaginemos que pasa si analizamos frases con palabras no existentes en el corpus. Habria que considerar y programar una contingencia para esto.

Otra limitacion esta en la calidad de identificacion gramatical de palabras que tienen varios significados, en este caso, si el corpus no contiene suficientes ejemplos de sus usos el sistema respondera solo lo que tenga como base.

Es importante considerar que aumentar el corpus habria que se requerira mas capacidad de computo y matrices muy grandes.

Podemos entender el rendimiento de dos formas.

Calidad de la clasificacion, entendido con la aplicacion adecuada de las tecnicas y algoritmos definidos para esta técnica.

Aqui la calidad dependera de que tan completo sea el corpus a aplicar. Se entiende que aumentando el corpus se aumentara la exigencia computacional. Seria interesante un modelo de compactacion de datos o de almacenamiento. Tambien se puede aplicar corpus completamente lematizado.

En segundo lugar sobre el costo computacional seria importante incorporar paralelismo en los calculos, estructuras que aceleren dichos calculo y herramientas que permitan que grandes corpus puedan ser incorporados sin afectar la disponibilidad de menoria y de calculo.