In questi giorni ho lavorato nuovamente al mio vecchio script per la generazione di testi tramite markov chains. L’ho totalmente riscritto e nel prossimo futuro la versione definitiva (completa di tutti gli strumenti per la generazione multipla di markov pages tematizzate e ottimizzate) verrà venduta.

Adesso vi presento lo script php che permette una rapida generazione di testi markov. Chi è capace può implementarlo in suoi script e gestirlo a suo piacere, senza dover acquistare in futuro la mia versione completa.

Il tool si compone appunto dello script (che potete chiamare come vi pare, ad esempio markov.php) e di un db testuale (chiamato db.txt).

Il db testuale dev’essere composto da testo pulito che vi dovrete formattare a mano, perché non ho incluso la funzione di pulitura. Vi dico quindi cosa va fatto:

  1. inserimento in db.txt di almeno 350kb di testo abbastanza pulito (per fare prove potete usare libri online free, specialmente romanzi con pochi dialoghi).
  2. eliminazione di tutte le parentesi e dei loro contenuti
  3. eliminazione di tutti i dialoghi
  4. eliminazione di tutto ciò che non può considerarsi testo pulito: asterischi, liste, simboli, etc..
  5. trasformazione di tutti gli accapo in spazi
  6. trasformazione di tutti gli spazi multipli in uno spazio singolo.

Lo script invece aprirà il testo e lo inserirà in una variabile. Sceglierà una coppia iniziale di parole nel testo e tramite espressioni regolari troverà nel testo tutte le parole che possono seguire la coppia, sceglierà una di queste parole e la inserirà in una variabile che contiene il testo finale. Dopo di che creerà una nuova coppia tramite la seconda e la terza parola della tripla precedente e cercherà una possibile continuazione e così via. Infine eliminerà dal testo ottenuto tutto ciò che segue l’ultimo punto cosicché il testo finisca con un punto.

Ecco lo script:

—-

$fp = fopen(’db.txt’, ‘a+’);
$content = str_replace(” “, ” “, str_replace(”\n”, ” “, fread($fp, filesize(’db.txt’))));
fclose($fp);preg_match_all(”/([\S]*) ([\S]*) ([\S]*) /”, $content, $matches);
shuffle($matches[0]);$var_iniz = explode(” “, $matches[0][0]);
$var1 = $var_iniz[0];
$var2 = $var_iniz[1];$markovtesto = ucfirst($var1).” “.$var2.” “;
$i = 0;while($i<300){

@preg_match_all(”/”.preg_quote($var1).” “.preg_quote($var2).” ([\S]*) /”, $content, $matches);if(count($matches[1])>0){

shuffle($matches[1]);
$markovtesto = $markovtesto.$matches[1][0].” “;
$var1 = $var2;
$var2 = $matches[1][0];

}else{

shuffle($var_iniz);
$var1 = $var_iniz[0];
$var2 = $var_iniz[1];
$markovtesto = $markovtesto.$var1.” “.$var2.” “;

}

$i++;

}

$lastpunto = strrpos($markovtesto, “.”)+1;

$markovtesto = substr($markovtesto, 0, $lastpunto);
echo $markovtesto;

—-

L’output del Text Generetor sarà, per esempio:
Mi aveva affidato, e fui certa, ed ebbi da lui a cavallo. A Chester io licenziai la cameriera. Lui era impietrito, per un valore di due anni fece fallimento e non fosse tale; e, fondandosi sulla propria innocenza, non si sposeranno in fretta come potrebbero in altro modo se non poteva non restar fermo all’idea che io volevo, nel senso cioè di essere una sciocca che non avevo nessuna tentazione davanti a me. Non avevo altra compagnia che la sposerò. Come potrei deciderlo io, quando sai che sarebbe stata por fine alle nostre nozze in forma privata, e avrebbe più creduto a una settimana era passata che si facessero avanti più di un calcolo inteso ad accumulare interessi e a far penitenza; e magari la povera brava donna ne aveva del denaro più di qualche bacio, nè pretese altro da fare, allora sarebbe tornato da me sulla nostra relazione; era facile, infatti, accorgersi che li ponesse in grado di riflettere seriamente, mi assicurò che non potevano far nulla per me, e mia madre sarebbe stato ottenuto il divorzio, noi però non avremmo potuto nè sciogliere il nostro affetto reciproco; potevamo, con quella conversazione, seppe rispondere a qualsiasi domanda, di trarcene fuori salvando la nostra relazione era stata lei a tenerla ancora per molti minuti non fui troppo entusiasta della proposta, non sapendo che cosa gli dispiaceva; mi assicurò che se le armi, vale a dire di no, se non è affar mio indagare se questa signora siano piuttosto alla vostra portata, e di quanti ne ho colpa.

Fatene buon uso!