jueves, marzo 11, 2021

Cómo hacer que la Inteligencia Artificial te haga los deberes de literatura usando la Wikipedia

Dime la verdad, ¿has tenido alguna vez que hacer algún trabajo sobre un libro de lectura de esos que te mandan en los cursos de la ESO sin leerte el libro? No es lo mejor para tu educación, que yo - como Chema Alonso nos cuenta en su artículo de "Leer para vivir más y mejor preparado" - soy un ferviente creyente de que la lectura es una de las mejores formaciones para prepararse en el futuro.

Figura 1: Cómo hacer que la Inteligencia Artificial
te haga los deberes de literatura usando la Wikipedia

Sin embargo, alguna vez ha pasado que el libro de lectura, el momento de atacarlo, o el volumen de trabajo no me ha ayudado mucho, y recuerdo frases como esta como si fueran un mantra de mi paso por la ESO:

“Bruno, para la semana que viene trae el Capítulo 1 resumido y con tus propias palabras.”

Supongo que alguna vez, al menos una, habéis ido, como confieso que he hecho yo alguna vez, directamente al Rincón del Vago por si ya estaba hecho. Mal, está muy mal. Pero lo hemos hecho. Analizando el porqué de esta petición, La profesora quería que hicierais los siguientes ejercicios mentales:
  • Síntesis de ideas en aquello más importante, es decir, un resumen.
  • Simplificación léxica y gramatical con tus propias palabras, para ver la comprensión.
En Natural Language Processing (NLP) existen dos ramas de investigación muy adecuadas para esta anécdota, y son el Automatic Text Summarization y el Automatic Text Simplification donde se ha metido de lleno el mundo del Machine Learning. Como bien define su nomenclatura, son algoritmos que te simplifican o te generan un resumen de un texto de entrada. La línea entre ambas es a veces fina, ya que cuando resumes sueles simplificar y viceversa, por lo que hablaré de ambos conceptos en el artículo, entendiendo sus diferencias, y jugaremos con la Inteligencia Artificial y el Machine Learning al final.

Figura 2: Libro de Machine Learning aplicado a Ciberseguridad de
Carmen Torrano, Fran Ramírez, Paloma Recuero, José Torres y Santiago Hernández

Aunque luego comentaré nuevas aproximaciones al problema a resolver - que será con técnicas de Deep Learning -, y antes de empezar con la historia, os cuento una anécdota: La compañía Boeing invirtió en 1992 para abordar la simplificación automática, ya que sus manuales debían cumplir con el estándar para AECMA Simplified English. Digamos que grandes avances de la humanidad se han hecho a partir de simplificar problemas.

1) Automatic Text Sumarization

Empecemos con el problema del resumen automático. Algunos primeros intentos de abordarlo lo intentaron utilizando un método basado en el "score" o puntuación por oración, para luego seleccionar las que tengan más puntuación. Si una palabra poco común se repite mucho en el texto - comparado con un texto normal -, el resumen debe contener frases que contengan esa palabra.

Por ejemplo, si hago un resumen de un libro de Metasploit para Pentesters, la palabra "Metasploit" se utilizará mucho en éste, siendo poco común en cualquier otro texto, por lo que deberá aparecer en su resumen. Pero estas métricas se basarían en la importancia de una sola frase, palabra o conjunto de términos, por lo que estaríamos obviando referencias entre ellas.

Una forma de evaluar cómo lo está haciendo un algoritmo de "summarization" es con la métrica ROUGE o Recall-Oriented Understudy for Gisting Evaluation. Esta métrica compararía la oración de entrada con los resúmenes creados por humanos, calculando cuántos "n-gramas"  o conjuntos consecutivos de n palabras del resumen generado por un ordenador aparecen también en el resumen hecho por un humano. Ésta métrica, por lo tanto, se utiliza para comparar modelos o resúmenes durante la etapa de entrenamiento o evaluación, no cuando desplegamos el modelo, ya que no tendremos ningún resumen hecho por humano con el que comparar.

Con el uso de algoritmos de Deep Learning todo esto ha cambiado. Los modelos Seq2Seq, que empezaron a coger fuerza en 2017, han hecho que cualquier otra aproximación quede demasiado pobre. Primero las LSTM, luego BERT, Transformers… Con un par de librerías lo tienes hecho, y otro día veremos cómo se hace.

1) Automatic Text Simplification

Empecemos con la Simplificación Léxica. Primero se realizaron experimentos sencillos en cuanto a sinonimia, en los que se escogen qué palabras tienen más complejidad, se consigue su lista de sinónimos y, en base a un contexto, se selecciona el mejor candidato de substitución. Un ejemplo sacado de Shardlow 2014.

Figura 3: Ejemplo de simplificación por sinónimo

En la imagen anterior podemos observar que la simplificación léxica es relativa: “broken arm” es más simple que “fractured arm”, y ésta que “fractured tibia”. ¿Y cómo sabemos qué pareja de palabras es la menos compleja? Pue es sencillo, si no es una palabra que se utiliza con frecuencia, no es una palabra simple. Y para ello podemos encontrar en la web distintas listas de sinónimos en orden de complejidad. Por ejemplo, se hizo una lista de frecuencia de palabras.  

Ahora vamos con la Simplificación Gramatical, que es otra aproximación distinta al ejemplo visto anteriormente. Tomemos esta universalmente famosa frase del también universalmente famoso Miguel de Cervantes Saavedra, con toda su belleza.

«En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor».

Como podéis ver, es una forma compleja, a la par que bonita, de decir que un hombre vivía en Castilla la Mancha! En nuestro equipo de Ideas Locas estamos muy enamorados de mezclar la tecnología con la literatura después de habernos puesto las pilas con el Proyecto Maquet, donde hemos tenido la suerte de trabajar con el gran maestro Arturo Pérez-Reverte.


Para este problema, los algoritmos basados en normas, como Chandrasekar et al. 1996, hacían lo mismo que un alumno en el instituto. Es decir, coger la oración compuesta, analizarla y separarla en distintas oraciones simples según grupos sintagma nominal, sintagma verbal, subordinación, etcétera. Para nuestra frase ejemplo hubiese detectado dos verbos y dos sujetos, y un posible resultado sería: 

“Don Quijote vivía en un lugar de la Mancha. No quiero acordarme del lugar de la Mancha”. 

Poca trascendencia hubiese tenido Don Miguel de Cervantes si hubiera seguido esta forma simplista de contar la historia de "El ingenioso hidalgo Don Quijote de la Mancha"
Este tipo de algoritmos basados en reglas no son muy extrapolables a otros dominios, son muy costosos de realizar, y por eso se siguió por otros andares con los algoritmos Data-Driven. ¿Y de dónde podemos sacar datos? Como siempre, de Wikipedia. Y no, no es broma, como podemos ver en Zhu et al. 2010Para resolver este problema existen dos Wikipedia, la English Wikipedia (EW) y la Simple English Wikipedia (SEW), y Zhu propuso utilizar un dataset compilado con más de 65.000 artículos, alineando las frases emparejadas a partir de métricas de distancia, como la Cosine SimilarityTenemos dos corpus, EW y SEW, con conjuntos de oraciones emparejadas: 

oración A en corpus SEW = oración B1 + oración B2 en corpus EW

"Corpus" en este escenario, para los no orientados al mundo del Machine Learning, no es más que el conjunto cerrado de textos con el que se modeliza el lenguaje para el problema a abordar. Entonces se puede utilizar este dataset, y tratar el problema como uno cualquiera de traducción, donde no traducimos entre idiomas sino entre registros lingüísticos. La gran diferencia es que un algoritmo de simplificación automática puede traducir una oración en N nuevas oraciones, o incluso traducirla en un conjunto vacío de palabras (eliminar una de las frases de entrada).
Tanto la Simplificación como el Resumen automático de textos son dos áreas que plantean retos muy interesantes y complejos, ya que ni los propios humanos harían la misma tarea de la misma forma. En comparación, por ejemplo, un humano si sabe decir si un texto es o no "Hate Speech", o si una pregunta hace referencia a un lugar o persona. Las aplicaciones de esta rama de investigación son palpables en el mundo real, donde ya se piensa en generar resumen automático de correos para CEOs, por ejemplo.

Hay muchas formas de juntar estos tres conceptos comentados, es decir Resumen Automático o Automatica Text Summarization,  Simplificación Léxica y Simplificación Gramatical o Automatic Text Simplification para realizar por fin un Rincón del Vago 2.0 automatizado. El texto de entrada para nuestra demo viene de mi queridísima Wikipedia, con la que puedes colaborar si estás en MyPublicInbox como Perfil Público, y será el artículo de "Dog".


Aunque la simplificación se pensó como un pre-procesamiento para tareas como el resumen automático, en este proyecto lo utilicé como un post-procesamiento. Por lo que, lo primero será importar el Summarizer pre-entrenado que se basa en BERT, del que hablaré más tarde. Esta herramienta escrita en Python es super sencilla: se instala, creamos el objeto modelo y, con uno de los tokens (ratio output/input o número de oraciones en la salida) decimos cómo queremos que resuma los datos.


Nada de TF-IDF, Score, Lematización, etcétera. ¡Qué sencillo es trabajar en Inteligencia Artificial así! Escogemos que nos reduzca a tres frases, calculamos el ratio de número de palabras del resumen por número de palabras de la entrada, y nos da un 18%. Esta es la salida y, para que mentir, no está nada mal.

Figura 9: Resultado con BERT Extractive Summarizer

Para la simplificación, y aunque podría coger también el LS-BERT, empezamos en modo difícil con el pre-procesamiento de texto con dos herramientas: NLTK y Spacy, que son dos de las mejores en Natural Language Processing (NLP). Ambas herramientas son comunes para trabajar en texto, incluyendo distintos corpus y recursos léxicos.

Se pueden hacer una enorme cantidad de tareas, ya sea clasificación, tokenization, lematización, tagging o incluso parsing. Pero como cada uno programando tiene sus manías yo utilizo una para unas cosas, y otra para otras, eso sí, todo completamente justificado claro. Simplificaremos gramaticalmente, siguiendo normas parecidas al estado del arte, pero más sencillas, a partir de dos premisas:
  • Toda frase entre paréntesis o guiones es una explicación de la oración principal, por lo que puede ser obviada (se utiliza mucho en Wikipedia).
  • Se puede obviar la frase post coma siempre y cuando exista un sujeto (nombre o pronombre) y un predicado (verbo o auxiliar).
Para las categorías gramaticales de las palabras, el POS (Part-Of Speech) tag es muy útil. Este es un estándar para la diferenciación de las partes más importantes de una oración como, por ejemplo, “NOUN” para sustantivos, “ADJ” para adjetivos… Y yo utilizo el de Spacy ya que trabaja con los tokens al estilo Object Oriented.

Figura 10: Tokens de Spacy

Y, por último, la Simplificación Léxica. Aunque más que simplificación léxica, lo que hemos hecho es “maquillar” el resultado, ya que no queremos que nos “pille” el profesor. BERT (aquí el modelo utilizado) es el modelo del lenguaje por excelencia, entrenado para predecir una palabra según un contexto. 

Figura 11: Se pone MASK en 75%

Modificamos el texto, intercambiando el 75% de los adjetivos, adverbios y verbos, es decir, uno en cada iteración, por la máscara “[MASK]” , haciendo un "DeepCopy", claro. Y así predecimos qué palabra se debe intercambiar por la máscara.

Figura 12: Predicción de la mascara

BERT es maravilloso, por lo que muchas veces predice la palabra que teníamos antes así que debemos forzar el cambio de Mask por una palabra distinta a la que había antes. Y aquí tenemos el resultado final, con un 12% de ratio de síntesis.

Figura 13: Resumen final del artículo de Dog con "mis propias palabras",

Espero que os haya gustado este ejercicio de Inteligencia Artificial pero no lo utilicéis para hacer los deberes. Es mejor que desarrolléis vuestras capacidades cognitivas y no deleguéis vuestras tareas en las tareas cognitivas de la tecnología. Ya tendréis tiempo de jugar con ellas cuando toque. Ahora a estudiar y aprender mucho. Si queréis contactar conmigo podremos discutir cómo mejorar este trabajo, que yo ya tengo un par de ideas, como por ejemplo utilizar el interesante parser de Stanford.

¡Saludos!

No hay comentarios:

Publicar un comentario