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


Datos del alumno (Nombre y Apellidos): Adrián Duque

Fecha: 24/04/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

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:

El etiquetado morfosintáctico obtenido se lo puede analizar en dos aristas principales. La primera con respecto a los resultados obtenidos de la matriz de Viterbi, como se puede ver, los valores de probabilidad son bajos; sin embargo, en la mayoría de casos, solo se marca una de las opciones de Tag, lo que quiere decir que el clasificador es capaz de identificar el TAG asociado; sin embargo, no es lo más preciso del mundo y podría incurrir en errores posteriores. La segunda manera de análisis de resultados es tomando en cuenta la oración etiquetada, la misma que al comprobar en la fuente de EAGLE esta corrobora que todas las palabras fueron clasificadas en su tag correspondiente. Lo único importante adicionalmente a considerar es el valor de las probabilidades que se obtienen, si bien es cierto que se multiplican varias que son de por sí pequeñas, estas obtenidas pueden ser muy ínfimas, lo que podría a posteriori causar problemas o malos niveles de predicción.

En primer lugar, si comparamos los Tags obtenidos en esta ocasión y con la anterior oración, podemos ver que en ambas situaciones coinciden en el tag, aunque la probabilidad difiera un poco. Esto nos permite mostrar que el modelo de etiquetado está funcionando bien y es capaz de detectar las palabras incluso si estas cambian sus ubicaciones en las oraciones. En segundo lugar, se puede ver que el modelo de probabilidad desarrollado cumple su trabajo de abstracción y que esta no sea dependiente de la estructura fija de una oración.

La principal limitación que se puede detectar es la escasa cantidad de palabras que tenemos en nuestro modelo de HMM, lo que esto significa es que si se quiere evaluar futuras sentencias para etiquetar, estas no podrán contener tokens que no existan en nuestro corpus original. Esto hace que los textos que podamos analizar y hacer POS Tag sean solo sujetos dentro de las mismas categorías que el corpus original. Segundo, existe una limitación con respecto al rendimiento de la solución, esto debido a que el texto no se lo preprocesa en términos de stop Word o lematización, lo que puede hacer que nuestro modelo de HMM crezca mucho, en este entorno controlado no es un problema, sin embargo si se busca escalar uno de estos modelos, es una limitación a tomar en cuenta.

En primer lugar, siguiendo lo mencionado anteriormente, podría servir un poco de preprocesamiento del texto, para evitar crear matrices tan grandes, que en entornos que escalen más se vuelva conflictivo, esto mismo se podría aplicar sobre las oraciones o los inputs que necesitan ser etiquetados. Esto reduciría significativamente el espacio muestral mediante lematización o stop words. En segundo lugar, ampliar el corpus de entrada para poder tener una variedad mayor de tokens sobre los cuales podamos referencias las nuevas búsquedas.