Emarkovescu – Poezie generativă (Eminescu prin lanțuri Markov) – Claudiu Ioan Maftei

Foto: @daaniel.john

Introducere

Generarea de text prin lanțuri Markov și N-grame e printre cele mai ușoare, rapide, și satisfăcător de fun exerciții în generarea procedurală de texte. @Haiku Botto generează haiku-uri pe twitter, @mar_phil_bot generează propoziții bazat pe scriituri a diverși filosofi (incluzând Nietzche și Kant), B9-Indifference generează bucăți de scenarii bazate pe Star Trek: The Next Generation.

Bineînțeles că dezamăgirea mea a fost nemăsurată când am văzut că nu există niciun Eminescu-bot care să genereze poezii, așa că mi-am asumat responsabilitatea de a face această dreptate în lume. Sub nicio formă tehnica ce urmează a fi sumar explicată nu e singura, și nici pe departe cea mai avansată (sau, a se citi, după preferință, „îmbârligată”), dar e o introducere prietenoasă în Natural Language Generation.

Lanțuri Markov și N-grame

Lanțul Markov este un model stocastic ce descrie o secvență de evenimente în care probabilitatea evenimentului curent este dată de starea modelului la momentul evenimentului precedent. Pentru generarea procedurală de text evenimentul trebuie să descrie o unitate de limbă, în general litere sau cuvinte și, eventual, punctuație. Vom folosi un model de N-grame, în care probabilitatea apariției unui item (alegem cuvinte) este dată de ultimii N itemi.

Cu modelul reprezentat mai sus de 1-gramă / unigramă (în care starea este determinată de un singur cuvânt) se pot genera următoarele secvențe:

  • cumpără salam. (șansă de 0.18 = 0.6*0.3)
  • cumpără salam bănățean. (șansă de 0.21 = 0.6 * 0.7 * 0.5)
  • cumpără pentru masă. (șansă de 0.08 = 0.4 * 0.2 * 1)
  • cumpără pentru mâine. (șansă de 0.32 = 0.4 * 0.8 * 1)
  • cumpără salam bănățean pentru masă. (șansă de 0.042 = 0.6 * 0.7 * 0.5 * 0.2 * 1)
  • cumpără salam bănățean pentru mâine. (șansă de 0.168 = 0.6 * 0.7 *0.5 * 0.8 * 1)

A se observa că:

  •  întotdeauna suma șanselor (arcelor) de tranziție de la starea curentă la evenimentul următor este 1 (adică 100%)
  • suma probabilităților tuturor secvențelor posibile este 1 (=0.18 + 0.21 + 0.08 + 0.32 + 0.042 + 0.168)
  • sunt unele combinații de itemi ce nu pot fi generate; spre exemplu ”cumpără pentru mâine salam” – putem spune că probabilitatea acestei secvențe este 0
  • unitățile textuale, în modelul de mai sus, nu iau în considerare aspecte ce țin de morfologie, sintaxă, semantică etc. – ele nu conțin atașate orice altă informație decât textul lor

De unde luăm bucăți din corpu(su)l lui Eminescu?

Pentru a obține lista de itemi și șansele aferente este necesar un corpus de unde se poate face extragerea.

Adevărul aici este că inițial am vrut să fac un Arghezi-bot, dar wikisource menționează că opera autorului este sub incidența drepturilor de autor până la data de 1 ianuarie 2038. Binecuvântarea a făcut ca textele lui Eminescu să fie în domeniu public.

Corpusul este totalitatea textelor găsite aici.

Ce facem cu bucățile din corpu(su)l lui Eminescu?

Pentru crearea modelului vom folosi 2-grame (bigrame) – ultimii doi itemi sunt utilizați în generarea itemului curent.

Având modelul, deci graful, putem facem o plimbare prin el. Un random walk pornește de la un cuvânt considerat de start (ce poate apărea la început de secvență), alegând aleatoriu itemul următor bazat pe starea curentă și probabilitățile aferente, până la întâlnirea unei punctuații finale. Astfel obținem o secvență de cuvinte și punctuație.

Cea mai evidentă diferență dintre o poezie și o secvență de cuvinte și punctuație este tăietura. În mod foarte convenabil, versurile scrise de Eminescu încep cu literă mare, și deci putem presupune că înainte de fiecare cuvânt ce începe cu o majusculă se află o tăietură. Presupunerea asta creează tăieturi și înainte de substantive proprii, ceea ce poate duce la tăieturi necaracteristice poeziei eminesciene – dar care în alt context ar fi acceptabile (dat fiind că nu există tăietură incorectă).

Vom considera o strofă ca fiind o astfel de secvență cu tăieturi inserate, iar o poezie drept o secvență de una sau mai multe strofe cu o linie ce le separă.

Un alt aspect de luat în calcul este rima silabică. Aproximarea făcută este că oricare două cuvinte ce se termină în aceleași două litere rimează. Acest lucru nu este întotdeauna adevărat, dar este adevărat în suficient de multe cazuri încât să satisfacă.

Probleme ce țin de despărțirea în silabe, sintaxă, acord etc. sunt informații în afara modelului prezentat mai sus, așa că vom face abstracție de ele. Sigur, consecința este șansa de a obține secvențe ce sunt dezacordate, nu au sens etc. Aici intervin factorii favorabili ai selecției umane (generez 10 texte, sigur unul va fi decent) și flexibilitatea ridicată a discursului poetic în comparație cu discursul uzual (secvențe ce ar fi nonsens spuse în viața de zi cu zi pot deveni acceptabile, poate chiar expresive, când secvența este considerată poezie).

Două texte (generate) de Emarkovescu

***

Doresc ca să piardă din ochi a lumei valuri și țipă,

Fugarul ușor

Nechează, s-aruncă de spintecă-n pripă

Al negurei flor;

Vergina îl strînge mai tare.

Se uită cum omătul copaci și case-ncarcă,

Cum vântul o-ncruntă-n suspin,

Simt zčfiri cu-aripi de fiori

Atinge ușoară, cu gândul,

Pământul.

La

Paris, în lupanare de cinismu și de oi,

Ciobănașii dinapoi

Cu fluiere și cimpoi,

Mai avea de suspinat,

Când vei ști că ele-au fost?

***

Dar deodat-un punct se mișcă… cel întâi

Ce mi-a răpi chiar piatra ce-oi pune-o căpătâi.

Orologiul ești ce fu din cer albastru în senină depărtare,

Rezimați pe lănci și arcuri răzimate

De păreți ­ pavezi de-aur ridicate,

Lănci ce fulgeră în soare,

Unele-albe, nalte, fragezi, ca argintul de ninsoare,

Desfaci visând pieptarul de la cerb;

Unde-i boul lui cuminte, unde-i vulpea diplomată?

Abia din carnea vechiului

Titan,

Noi suntem răi

Fără de-a-avea puterea lui.

Și de-aici încotro?

Spre deosebire de copywriting, unde în unele cazuri ar fi favorabilă generarea automată de conținut, necesitatea și gradul de implicare al elementului uman în poezie e o mare dezbatere a naturii auctoriale – dezbatere în care prefer să nu mă bag sau să nu mă bag aici. Ceea ce prefer este să las câteva direcții:

  • dacă vreți să vedeți un remix al unui autor oarecare, lanțurile Markov sunt un exercițiu fun (poate chiar poggers) de făcut pe orice (incluzând aici și cărți de Magic: the Gathering și abilitățile campionilor din League of Legends)
  • dacă scrieți poezie și vreți să generați automat niște versuri de inspirație, care să fie și pe baza a ceea ce ați scris deja – lanțuri Markov
  • dacă aveți familiaritate cu Python, puteți să vă jucați cu codul sursă
  • dacă sunteți interesați de Natural Language Generation, lumea este largă și are multe poisons to pick, incluzând descrieri pornind de la ontologii, rețele neurale recurente, template-based generation etc.
  • dacă vreți să încercați să vă jucați, dar nu știți programare – în primul rând învățați; secundar, un spam frumos, corect, corespunzător poate fi făcut la adresa claudiu.ioan.maftei@gmail.com – în funcție de cerere, și dacă-mi sunteți dragi, pot face o interfață

Leave a Reply

Your email address will not be published. Required fields are marked *

© MAFIA SONETELOR | Scrisul: e de argint, dar tăcerea e de aur.

Up ↑