Poesía Automática
Ir al Generador de Poemas
Bueno, en este articulo pasare a explicar como Kobra17 se ha embarcado en hacer un generador de poesía automática, que de momento es algo “precario” y “provisional”.
Explicar primeramente que la curiosidad es la que me ha empujado a realizar esto, y ver si es posible crear un algoritmo capaz de componer un poema que pueda competir con un ser humano. Mas adelante intentare realizar otro algoritmo de creación de textos, un inventor de historias.
Siempre ha estado presente en la literatura digital la generación y creación automática de poemas.
El potencial de un computador ha sido muy utilizado, en especial en el tipo de poesía libre, que no se sujeta a métrica o rima, muy onírica, metafórica y fantástica.
Al igual que la fábula del asno, que debido a la casualidad logra hacer sonar una flauta y hacer música con sus resoplidos, es posible que entre millones de versos generados automáticamente algunos lo sean de calidad. Pero, hoy en día, sera más fruto del azar que de que la programación del algoritmo disponga del conocimiento poético y literario básico.
Aun así, sorprende como con un poco de código pueden realizarse poemas. ¿Por qué no puede existir un Lope de Vega cibernético o un Lorca digital, o incluso un Pushkin escondido en las entrañas de un microprocesador?
Bueno…. Paso a explicar la creación del algoritmo
Todo ello lo realizaremos en cualquier tipo de lenguaje de programación que deseemos. Concretamente en mi caso ha sido realizado en JavaScript, aunque perfectamente puede realizarse en PHP y ser perfeccionado.
Vamos a usar una técnica que usa palabras que encajan en modelos de versos predeterminados o plantillas (en inglés reciben el nombre de pattern o template), son moldes donde existen huecos que se rellenaran con ciertas palabras, de entre las de una lista, y elegidas al azar. Como si se tratara de encajar piezas de un puzle donde faltan algunas, y quedan huecos libres donde solo caben ciertas piezas.
Por ejemplo, tenemos la frase:
Una oropéndola, eso eres. Como el espíritu, masculino de la helada tranquilidad
Y podemos crear una plantilla como la siguiente:
(PALABRA1), eso eres. Como el (PALABRA2), (PALABRA3) de la (PALABRA4) (PALABRA5)
Las PALABRAS a rellenar los huecos en esta plantilla pueden elegirse de unos listados, tan largos y variados como queramos.
PALABRA1 – Lista de sustantivos femeninos singular, PALABRA2 – Lista de sustantivos masculinos en singular (espíritu, en el ejemplo), PALABRA 3 – de una lista de adjetivos en masculino, PALABRA 4 – de una lista de adjetivos femeninos, PALABRA 5 – de una lista de sustantivos femeninos.
También es posible definir plantillas que contengan verbos:
La aurora espera sosegadamente entre deseos que sufren
Se interpretaría como:
La – sustantivo femenino – verbo tercera persona singular presente de indicativo – adverbio – entre – sustantivo masculino plural – que – verbo tercera persona plural del presente de indicativo.
Se pueden definir miles de plantillas y listas de palabras, incluso copiarlos de poetas humanos celebres (en un futuro) donde su estructura puede ser mejor para poemas. Teniendo esas plantillas y listas solo falta realizar un código sencillo que vaya rellenando las plantillas de forma aleatoria. Cada verso creado será más o menos bueno según lo depare el azar. Cuantas más plantillas tengamos y las listas de palabras sean más largas, más variados y creativos serán los versos resultantes.
Un poema completo lo montaremos uniendo versos uno tras otro. Y aquí nos chocaremos con el problema de dar sentido al poema y relacionar un verso con el siguiente…. Problema para el que no hay solución todavía pero que intentaremos mejorar o solucionar parcialmente en futuro.
Ir al Generador de Poemas
Vamos a crear paso a paso nuestro poema que (de momento) será, abierto, libre y sin rima.
Primero definimos 14 listas con el siguiente contenido:
- – Acción verbal en presente de indicativo (soy, si no eres,)
- – Artículo + sustantivo femenino singular (una golondrina, la vida,)
- – Adjetivo femenino singular (desnuda, anhelante, sincera,)
- – Verbo en tercera persona del singular del presente de indicativo (muere, canta, no comprende,)
- – Sustantivo masculino singular (vino, elixir,)
- – Adverbio (calmadamente, remotamente,)
- – Artículo + adjetivo + nombre en masculino singular (El suave rostro, El perdedor,)
- – Sustantivo femenino singular (apatía, senda, miel,)
- – Exclamación (¡oh!, ¡Señor!)
- – Sustantivo masculino plural (marinos, deseos,)
- – Verbo en tercera persona del plural del presente de indicativo ( mueren, sienten,…)
- – Adjetivo femenino (extraña, ansiosa,…)
- – Sustantivo masculino plural (mentirosos, arrogantes,…)
- – Adjetivo masculino singular (extraño, veleidoso,…)
Ahora creamos 15 Plantillas como estas, donde se sustituye su número por una palabra de las listas anteriores. Es decir, el 5 por una palabra de la lista 5 y así con el resto:
- 2 – eso eres. Como el – 5 – 14 – de la -3 – 8
- Los – 10 – son – 13 – cuando un – 14 – 5 – 4 – 6
- 3 – 3 – 12 – 12 – 9 – cuán – 6 – 7 – 4
- Y – 4 – 3 – porque – 1 – 2 – 3 – que – 4
- 9 – 10 – que – 11 – , que – 1 – entre – 13
- Etcétera, etc. etc.
Y ahora, a escribir el código para rellenar los huecos de las plantillas… Como es lógico no está contemplado el tratamiento de la puntuación y puede corregirse manualmente una vez generado el poema.
HTML y Código JavaScript:
<HEAD>
<TITLE>EJEMPLO DE POEMA AUTOMáTICO. Kobra17.com</TITLE>
<META http-equiv=Content-Type content=»text/html; charset=windows-1252″><script language=»JavaScript1.2″>
function displaymessage() {// Vamos a generar un poema de una cantidad de versos aleatoria entre 6 y 12. Por tanto hemos de repetir la creación de un verso esas veces con un bucle del tipo ‘for’.
// Podemos cambiar el número de versos mínimos y máximos a voluntad.var poema=» «;
var rnd_versos = 6 + Math.round((6)*Math.random());
for (x1 = 1; x1 < rnd_versos; x1++) {// Ahora determinamos aleatoriamente el tipo de verso que vamos a construir de entre las 15 plantillas posibles. Posible ampliar el número de plantillas a voluntad.
var rnd_tipo = 1 + Math.round((14)*Math.random());
// Ahora determinamos aleatoriamente las 14 palabras a sustituir de nuestras listas de palabras.
// También ampliable como queramosvar palabras1 = new Array (
«soy»,»eres»,»te muestras como»,»somos»,»vives como»,»si no eres»,»no soy»,»quiero ser»,»deseo que seas»,»seremos siempre»
);
var l1 = palabras1.length;
var rnd_no1 = Math.round((l1-1)*Math.random());
var espacio=» »
var message1=palabras1[rnd_no1]+espacio;var palabras2 = new Array (
«una oropéndola»,»una golondrina»,»una idea fugaz»,»una caricia en la noche»,»una serpiente»,»una estancia»,»la vida»,»la muerte»,»la casta piedad»,»la aurora»
);
var l2 = palabras2.length;
var rnd_no2 = Math.round((l2-1)*Math.random());
var message2=palabras2[rnd_no2]+espacio;var palabras3 = new Array (
«desnuda»,»disconforme»,»anhelante»,»helada»,»sincera»,»vacía»,»plena»,»inquieta»,»velada»,»arrebolada»
);
var l3 = palabras3.length;
var rnd_no3 = Math.round((l3-1)*Math.random());
var message3=palabras3[rnd_no3]+espacio;var palabras4 = new Array (
«muere»,»vive»,»canta»,»expira»,»gime»,»espera»,»no comprende»,»liba»,»revolotea»,»lame»);
var l4 = palabras4.length;
var rnd_no4 = Math.round((l4-1)*Math.random());
var message4=palabras4[rnd_no4]+espacio;var palabras5 = new Array (
«vino»,»hechizo»,»manantial»,»elixir»,»espíritu»,»aire»,»grito»,»sonido»,»emporio»,»nirvana»
);
var l5 = palabras5.length;
var rnd_no5 = Math.round((l5-1)*Math.random());
var message5=palabras5[rnd_no5]+espacio;var palabras6 = new Array (
«calmadamente»,»estrechamente»,»suavemente»,»sosegadamente»,»remotamente»,
«imperiosamente»,»injustamente»,»verdaderamente»,»solamente»,»perdidamente»
);
var l6 = palabras6.length;
var rnd_no6 = Math.round((l6-1)*Math.random());
var message6=palabras6[rnd_no6]+espacio;var palabras7 = new Array (
«el suave rostro»,»el verde Elíseo»,»el noble Arturo»,»el perdedor»,»un ganador»,
«el pretendiente»,»el solitario»,»el mercader»,»el respirar»,»el soñador»
);
var l7 = palabras7.length;
var rnd_no7 = Math.round((l7-1)*Math.random());
var message7=palabras7[rnd_no7]+espacio;var palabras8 = new Array (
«apatía»,»cárcel»,»ubre»,»senda»,»miel»,»esperanza»,»marea»,»tranquilidad»,»poesía»,»sangre»
);
var l8 = palabras8.length;
var rnd_no8 = Math.round((l8-1)*Math.random());
var message8=palabras8[rnd_no8]+espacio;var palabras9 = new Array (
«¡Oh!»,»¡Señor!»,»¿Por qué?»,»¡No!»,»Sí!»,»¡Oh, poesía!»,»¡Ah, imposibles lejanos!»,»¡Ven!»,
«¡Ah, destino!»,»¡No más!»
);
var l9 = palabras9.length;
var rnd_no9 = Math.round((l9-1)*Math.random());
var message9=palabras9[rnd_no6]+espacio;var palabras10 = new Array (
«marinos»,»deseos»,»sentimientos»,»veleros»,»vapores»,»humos»,»sueños»,»suspiros»,»perfumes»,»afectos»
);
var l10 = palabras10.length;
var rnd_no10 = Math.round((l10-1)*Math.random());
var message10=palabras10[rnd_no10]+espacio;var palabras11 = new Array (
«mueren»,»viven»,»cantan»,»sienten»,»compran»,»sufren»,»arrullan»,»esperan»,»acallan»,
«liban»
);
var l11 = palabras11.length;
var rnd_no11 = Math.round((l11-1)*Math.random());
var message11=palabras11[rnd_no11]+espacio;var palabras12 = new Array (
«extraña»,»ansiosa»,»veleidosa»,»encantadora»,»sensata»,»silenciosa»,»femenina»,»gozosa»,
«olvidada»,»endiosada»
);
var l12 = palabras12.length;
var rnd_no12 = Math.round((l12-1)*Math.random());
var message12=palabras12[rnd_no12]+espacio;var palabras13 = new Array (
«mentirosos»,»extasiados»,»melindrosos»,»arrogantes»,»sumisos»,»vencidos»,»sensatos»,
«inquietos»,»serenos»,»hundidos»
);
var l13 = palabras13.length;
var rnd_no13 = Math.round((l13-1)*Math.random());
var message13=palabras13[rnd_no13]+espacio;var palabras14 = new Array (
«extraño»,»ansioso»,»veleidoso»,»encantador»,»precario»,»masculino»,»inguinal»,»ebrio»,
«mechón de cabello»,»alocado»
);
var l14 = palabras14.length;
var rnd_no14 = Math.round((l14-1)*Math.random());
var message14=palabras14[rnd_no14]+espacio;// Ahora creamos el verso de acuerdo con los modelos – en este ejemplo hay 12 tipos- elegido aleatoriamente. Son las plantillas, y cada una se programa en un caso de la función case
// Creamos una variable que maneje la coma ya que es un carácter reservado de JavaScript
var lacoma=’,’;// y ahora elegimos el tipo de verso
switch (rnd_tipo) {
case 0:
var verso=»El «+message5+» «+message4+» «+message14+» y «+ message6+». La «+message8+» «+message4+» «+message12+» entre «+messsage13+».»;
break;case 1:
var verso=»El «+message5+» «+message4+» «+message14+» y «+ message6+». La «+message8+» «+message4+» «+message12+» entre «+messsage13+».»;
break;case 2:
var verso=message2+» «+lacoma+» eso eres. Como el «+message5+lacoma+» «+message14+» de la «+message3+» «+message8;
break;case 3:
var verso=»Los «+message10+» son «+message13+ «cuando un «+message14+» «+message5+» «+message4+» «+message6;
break;case 4:
var verso=message3+» «+lacoma+» «+message3+» «+lacoma+» «+message12+» «+lacoma+message12+». «+message9+lacoma+» cuán «+message6+» «+message7+» «+message4;
break;case 5:
var verso=»Y «+message4+» «+message3+» porque «+message1+» «+message2+» «+message3+» que»+» «+message4;
break;case 6:
var verso=message9+» «+message10+» que «+» «+message11+lacoma+» «+» «+message11+» entre»+» «+message13;
break;case 7:
var verso=message1+» «+message2+» «+message3+» que «+message4+» como el «+message5+» de los «+message10;
break;case 8:
var verso=message3+lacoma+» «+message6+» «+lacoma+» como la «+message8;
break;case 9:
var verso=message9+» «+message2+» de los»+» «+message10+» que «+message6+» «+message4;
break;case 10:
var verso=»El»+» «+message5+» es una»+» «+message8+» «+message12+»que»+» «+message4+» «+message6+» junto a los»+» «+message13+» «+message10;
break;case 11:
var verso=message7+» de tu»+» «+message14+» «+message5+» que «+message4+» entre»+» «+message10;
break;case 12:
var verso=message2+lacoma+» «+message3+lacoma+» es una «+message12+»y»+» «+message3+» «+message8;
break;case 13:
var verso=»Los «+message10+» «+message11+» cerca de «+message2+lacoma+» y parecen tan «+message13;
break;case 14:
var verso=message1+» la «+message8+» que «+message6+» «+message4;
break;case 15:
var verso= message11+» los «+message10 +» «+message6+». «+message11+» y somos la «+message3+» y «+message12+» «+message8+» del «+message14;
break;
}//Al salir del bloque switch case tenemos el verso almacenado en la variable verso.
// var poema=poema + verso;
//espacio = document.createTextNode(«br»);var myDiv1 = document.getElementById(«div1»);
myDiv1.appendChild(document.createTextNode(verso));
myDiv1.appendChild(document.createElement(«br»));// y volvemos al bucle for para completar el poema
}
}// lo visualizamos en una zona DIV llamada div1.
// var poemafinal=poema
</script>
<!–ahora escribimos la estructura HTML de la página–>
<BODY bgcolor=»#EEDDD9″>
<CENTER>
Generador automático de poemas <bR>
Kobra17.com<BR>
Año 2020<br><br>
</center>
<LEFT><!–en la zona DIV1 escribimos el texto cuando hacemos click en un botón–>
<div id=»div1″>
<input type=»button» value=»Crear texto» onclick=»displaymessage()» />
<br><br>
</div><!–en la zona DIV2 ponemos un botón que borre el texto y empiece de nuevo–>
<div id=»div2″><br><br>
<input type=»button» value=»Limpiar pantalla» onclick=»window.location.reload()» style=»font-family: Verdana; font-size: 8 pt»>
</div></BODY>
</HTML>
Ir al Generador de Poemas
Para comprobar su funcionamiento solo copiar en el bloc de notas, guardar el fichero con el nombre que queramos y extensión “.html”.
Puede ampliarse las listas de palabras y las plantillas a voluntad…
Algunos ejemplos “medianamente razonables” generados con este código, y modificada la puntuación ya que el algoritmo no la tiene en cuenta.
¿Por qué? suspiros que cantan, cantan entre melindrosos,
Y vacía porque deseo que seas la casta piedad que canta
el noble Arturo de su encantador hechizo que vive entre sentimientos.
Anhelante, verdaderamente, como la ubre.
Los veleros esperan cerca de una estancia, y parecen tan melindrosos,
Los marinos viven cerca de la vida, y parecen tan mentirosos.
La muerte, eso eres. Como el elixir, veleidoso de la velada sangre.
El espíritu es una poesía extraña que gime injustamente junto a los mentirosos sueños.
Los marinos cantan cerca de la vida, y parecen tan arrogantes,
el aire es una miel encantadora que espera calmadamente junto a los sumisos vapores,
si no eres la vida velada que espera como el espíritu de los perfumes,
Los veleros viven cerca de la casta piedad, y parecen tan sensatos.
Si no eres la vida plena que canta como el sonido de los sueños,
Los afectos acallan cerca de la aurora, y parecen tan extasiados.
¡Oh! una golondrina de los deseos que injustamente revolotea,
una caricia en la noche, eso eres. Como el aire, masculino de la sincera sangre.
Te muestras como la tranquilidad que calmadamente muere.
Los valores sufren cerca de una serpiente, y parecen tan melindrosos.
Basado en un trabajo de Félix Remírez de http://biblumliteraria.blogspot.com/