¡Celeste Inteligencia!

En el primer post hice una breve introducción sobre el desarrollo de una inteligencia artificial que era capaz de escribir canciones y en el segundo profundicé en el algoritmo genético que hacía evolucionar a una población inicial de canciones para mejorarlas y llegar a una buena canción. Lo único que queda por explicar (y es por eso que estoy escribiendo este tercer artículo) es cómo hice para crear la población inicial (o generación 0) de canciones.
Para generar esta población inicial usamos técnicas propias del NLP (Procesamiento de Lenguaje Natural) para generar textos, que es una subdisciplina de la inteligencia artificial (AI).
Para que la inteligencia aprenda a escribir canciones es necesario generar un modelo y también alimentarla de ejemplos (canciones ya escritas) para que de alguna forma asimile palabras, oraciones, frases, etc. Hay muchas herramientas que hacen de esta ardua tarea algo más sencillo:
• Analizadores léxicos (lexer, tokenizer, scanner): recibe como entrada un texto (secuencia de caracteres) y produce una salida compuesta de tokens, palabras, lexemas o símbolos (todos sinónimos para decir componentes léxicos).
• Analizadores sintácticos (parser): analiza una lista de símbolos (tokens) de acuerdo a las reglas de una gramática formal transformándola en un árbol sintáctico de derivación. Es uno de los primeros pasos para el análisis de frases de lenguaje natural.
• Stemmer: stemming “recorta” una palabra para intentar quedarse con su raíz también llamado stem (en inglés). De esta forma las palabras “perro”, “perra”, “perrito”, “perrazo”, “perrera”, etc. quedarían todas como “perr”.
• Lematizador (Flexionador, etiquetador morfológico, lemmatizer, morphologic tagger): Segmentación de una palabra para separar la raíz (lexema) de los morfemas de flexión. Básicamente se le asigna a cada palabra una etiqueta con la forma canónica (o lema) de la palabra. Si bien tanto los stemmers como los lematizadores ambos reducen las palabras a una base común la diferencia es que mediante stemming se usan heurísticas crudas que cortan el final de las palabras esperando llegar a un resultado correcto la mayoría de las veces, sin embargo mediante lematización generalmente las cosas se hacen de un modo más apropiado utilizando un vocabulario/diccionario y el análisis morfológico de las palabras.
• Part-Of-Speech Tagger (POS Tagger): Etiqueta las palabras de acuerdo a su categoría gramatical (sustantivo, nombre, pronombre, verbo, adjetivo, adverbio, preposición, conjunción, interjección, fecha, número, puntuación), también si es femenino/masculino, plural/singular, tiempo verbal, etc.
• Analizadores de dependencias: Sirve como análisis sintáctico básicamente se intenta definir la relación entre cada elemento de una oración.
• n-gramas: Es un modelo probabilístico que permite hacer una predicción estadística del próximo elemento de cierta secuencia de elementos sucedida hasta el momento. Por ejemplo dadas 3 palabras predecir cuál será la cuarta. Ej.: Después de las palabras “Ahora golpeas la” probabilísticamente puede venir alguna de las siguientes palabras pared (27%), puerta (18%), mesa (22%) o pelota (33%).

Varias de estas herramientas se basan en el aprendizaje automático (Machine Learning) ya que en vez de estar programadas exhaustivamente para contemplar infinitos casos (sería imposible) se entrenan a partir de información previamente clasificada a mano en forma de ejemplos (corpus). Este enfoque permite al sistema reunir información sobre la frecuencia con que ocurren ciertas combinaciones de palabras en el contexto específico de un tipo de canciones determinado.
De todas formas no es nada fácil analizar frases ya que el idioma humano es muy ambiguo:

Cada noche que bajo ¹  a la calle, el músico bajo² toca el bajo³  bajo×  la luna.
bajo ¹ : verbo
bajo² : adjetivo
bajo³ : nombre
bajo× : preposición

Está claro que una oración no es una simple lista de palabras ordenadas arbitrariamente sin sentido. Existen reglas y restricciones formales que se pueden aprender analizando ejemplos de frases cuyas palabras están etiquetadas gramaticalmente. Por ejemplo, se podría decir que una oración básica está conformada por un sujeto + predicado donde el sujeto puede ser un determinante (opcional) seguido de un sustantivo, pronombre o nombre y el predicado está formado de un verbo (que debe concordar en persona y número con el sujeto) y un adjetivo (opcional).
Teniendo en cuenta todo esto la solución combina varios de los métodos del NLP para generar una secuencia de palabras basada en las probabilidades que arroja el modelo. Esto asegura cierta correctitud gramatical (teniendo en cuenta las licencias artísticas que se pueden dar en una canción) y también la consistencia textual (dada porque todas las canciones con las que se alimentó se tratan de la misma temática).
Para los anteriores posts el modelo había sido entrenado con un dataset de canciones de cumbia pero para este otro ejemplo se utilizaron canciones futboleras relacionadas a la selección uruguaya. Muchas canciones futboleras (como también las cumbias) muestran las mismas estructuras y las mismas características: hay frases que aparecen una y otra vez. En ambos casos se aprovecharon estos patrones para entrenar a la inteligencia.
La secuencia de palabras se va construyendo en base a probabilidades con 4-gramas. Este modelo permite predecir cuál es la probabilidad de que una determinada palabra aparezca teniendo en cuenta las 3 palabras anteriores. Parte del truco está en utilizar la distribución de probabilidad para de forma aleatoria elegir a la palabra y no simplemente elegir a la candidata que tenga la mayor probabilidad. Esto es para que el algoritmo no sea determinista y que genere una canción diferente con cada corrida. Hay un poco de condimento mágico para que la canción quede lo más distinta posible a una canción ya existente. Por ejemplo si el verso que se está armando tiene 3 palabras de una misma canción, el algoritmo le resta peso a las palabras de esa canción para que la siguiente seleccionada pertenezca a una distinta.
En resumen, se alimenta la inteligencia con varias canciones y va guardando el número de ocurrencias de cada palabra (y la forma en que está etiquetadas) en función de las 3 anteriores. Basándose en eso luego va prediciendo sucesivamente una palabra tras otra hasta llegar a una canción de largo dado.

Acá va un resultado, canción que titulé INTELIGENCIA CELESTE:

Llegó la hora
de la batalla
11 hombres defienden
la linda bandera
de 9 rayas

Van a brillar
los gladiadores
como lo hace el sol
del cielo celeste
cuando hacen goles

Con mucha garra
y corazón
vamos por todo
somos tres millones
con mucha ilusión

Dejar lo más alto
la hermosa celeste
sin ser favoritos
buscando la hazaña
cueste lo que cueste

Con tremendo Orgullo
y dientes apretados
vamo’ la celeste
con la frente en alto
están los uruguayos

Cuando la cosa
no está en calma
más transpiramos
la camiseta
celeste del alma

Vamo’ a demostrar
que esto es Uruguay
pase lo que pase
no le tememos
a ningún rival

Vamo’ campeones
con sed de gloria
no hay más honor
para la aldea
que la victoria

Cántese con tonito murguero a ritmo de marcha camión!

Héctor Cotelo  @CoteloHector

Consultor en Business Analytics & Information Management


Las canciones/jingles utilizadas fueron: A diario vivimos el país - Diario El País; A grito de gol - Walter Zeinal; Al fondo de la red - Mauricio Ubal; Cada vez te quiero más – Buitres; Cielo de un solo color - No te va Gustar; Cuando juega Uruguay - Jaime Roos; Descolgando el cielo - Edu "Pitufo" Lombardo; El tipo de la Radio - Tabaré Cardozo; Esto es Uruguay, papá - The Party Band; Gaucho Power - Cuarteto de Nos; Gloriosa celeste - Canario Luna; Himno Nacional Uruguayo - Francisco Acuña de Figueroa; José Sabía - La Vela Puerca; La canción del Mundial - Edison Campiglia (Rafael Cotelo DelSol); La copa de la vida - Ricky Martin; Locura Celeste - Tabaré y Yamandú Cardozo; Marcha mi bandera - Nicolás Bonomi y Luis Suarez; Mi País - Ruben Rada; Murguero Oriental - Tabaré Cardozo; Nací celeste - Snake; Negro Jefe - Canario Luna; Nuestra Bandera - Daniel Viglietti; Orgullo de ser uruguayo - Canarias; Schneck, bien nuestro - Frigoríficos Schneck; Todos Goleando - Pájaro Canzani; Un dulce sentimiento - Daniel Deniesse; Un grito celeste - La Tuerca; United by love - Natalia Oreiro; Uruguayos campeones de América y del Mundo - Canario Luna; Vamos la celeste - Partido Independiente; Vayan pelando las chauchas - Canario Luna; Waca, Waca - Shakira; Waving flag (Spanish version) - K'naan & David Bisbal. También se transcribieron textos de videos homenaje/motivacionales que hay hechos a la selección.

Leave a Reply