Título de la entrada del blog

Subtítulo

Hector Cotelo

En mi post anterior escribí acerca de un desarrollo que realicé para probar si era factible que una computadora aprenda a escribir canciones y prometí intentar explicar un poco cómo funciona el algoritmo. En este artículo describiré algunos métodos del NPL (Procesamiento de Lenguaje Natural) y de paso mostraré un nuevo tema escrito por la inteligencia.

El método que voy a detallar es básicamente un algoritmo genético, inspirado en la evolución biológica, el cual funciona como el corazón de la inteligencia artificial desarrollada. Lo que suelen hacer estos programas es hacer evolucionar a una población, de canciones en este caso, mediante operaciones análogas a las que suceden en la evolución biológica (mutaciones, combinaciones), seleccionando mediante criterios preestablecidos a los individuos más adaptados que son aquellos que sobrevivirán y se reproducirán.

Para explicarlo mejor voy a basarme en el ejemplo concreto del algoritmo que se desarrolló, el cual parte de una población inicial de cientos de canciones que se generan automáticamente a partir de un modelo de lenguaje creado a partir del corpus (conjunto de canciones de cumbia). En un futuro post explicaré como se genera esa población inicial.

A cada una de esas canciones se las evalúa mediante una función de "fitness" que indica qué tan buena es. Aquellas mejor rankeadas son las que tienen más probabilidad de ser seleccionadas para producir, combinándose y mutando, una nueva generación de canciones que son "hijas" de la anterior generación. De este modo se repite el proceso varias veces hasta llegar a una solución, en otras palabras, a una buena canción.

La función de “fitness” lo que hace es puntuar las canciones para ver cuáles son buenas y cuáles no. Los principales criterios que tiene en cuenta son: si los versos son gramaticalmente correctos, si hay rimas entre versos que no se encuentren a más de dos saltos entre sí y si los versos respetan determinada métrica. Cuanto más cumplan estos criterios mejor se considera que es la canción por lo que la función de “fitness” le va a asignar un puntaje mayor.

Una vez evaluadas las canciones de la primera generación se da lugar a los operadores genéticos los cuales se encargan de generar las canciones de segunda generación. Básicamente las operaciones definidas fueron la de entrecruzamiento cromosómico o recombinación y la de mutación.

La operación de entrecruzamiento cromosómico se encarga de seleccionar algunas canciones con buen puntaje y combinarlas entre sí: se intercambian versos para poder crear a la canción hija. Generalmente se utiliza una “máscara”, elegida al azar, para seleccionar de qué canción se elige cada verso.

Ejemplo de entrecruzamiento cromosómico:

Odoo image and text block

Por otro lado, la operación de mutación lo que hace es cambiar palabras por otras, utilizando una ontología y un diccionario de sinónimos. Estos cambios se producen al azar para cambiar cualquier palabra de un verso por otra con un significado similar buscando que todos los versos de la estrofa tengan la misma cantidad de sílabas.

Ejemplo de mutación ALEATORIA “métrica”:

Odoo text and image block

Otra operación de mutación definida cambia la última palabra de versos cercanos entre sí, combinando todos los sinónimos de ellas para hacer que rimen.

Ejemplo de mutación específica “busca rimas”:

Odoo image and text block

Habiendo entendido los operadores genéticos definidos queda aclarar que para cada canción hija se seleccionan canciones padres al azar, preferentemente dentro de las mejores, pero también teniendo en cuenta algunas de las canciones no tan buenas para asegurar la diversidad. El proceso de “reproducción” se repite hasta generar una segunda generación de canciones de tamaño apropiado.

En general, el promedio de los resultados de la función de “fitness” debería incrementarse generación tras generación, esto se traduce en que cada una de ellas va teniendo mejores canciones. 

Este mismo proceso de crear generaciones a partir de los padres se repite hasta una determinada condición de terminación que suele ser difícil de determinar. En este caso particular se definió como condición el alcanzar un número fijo de generaciones combinado con un poco de inspección manual.

Entonces, esquemáticamente, el algoritmo genético funciona de la siguiente manera:

Odoo image and text block

El resultado de una corrida es el siguiente:

El resultado presenta un exceso de rima perfecta que no parecería lo ideal para una canción "seria" salvo que se trate de un rap o canción para niños. De todas formas, creo que queda claro que es posible que una inteligencia artificial escriba letras de canciones de forma automática.

En mi próximo post comentaré cómo se hizo para generar automáticamente la primera generación de canciones utilizando un modelo de lenguaje basado en n-gramas.

Odoo image and text block

Héctor Cotelo @CoteloHector

Ingeniero en Informática, PMP

Especialista en Business Analytics