Digi Tales

Caso amico ti scrivo

Dic
04

Il ruolo del caso nella sperimentazione è fondamentale. Lo sanno gli artisti, che l’hanno usato come motore di generazione di opere. Basta andarsi a riprendere gli esempi di Queneau, di Calvino, dei dadaisti.
Ma a me il caso interessa come strumento didattico, di didattica della lingua e delle letteratura.
Per la precisione, come strumento che mette in evidenza la relazione tra semantica e sintassi, o meglio tra la staticità semantica e la tensione sintattica. La sintassi vista come una forza che spinge in una direzione precisa, mentre la semantica cerca di opporsi. Chiaro? Non tanto? Vediamo.

Partiamo da questa affermazione: “Un testo ha un significato complessivo che dipende dalle parole che lo compongono“.
Sembra una teoria banale. Ma è proprio vera?

Prendiamo un esempio: la poesia di Chamie Gorkin “Worst Day Ever?”. Questa poesia ha la particolarità di potersi leggere dall’inizio alla fine, oppure dalla fine all’inizio; ma offre un’interpretazione diversa, anzi opposta, a seconda della direzione. Non è un caso, naturalmente, è stata scritta apposta, sulla base delle convinzioni chassidiche dell’autrice.
Allora possiamo riformulare la nostra teoria: “Un testo ha un significato complessivo che dipende dalle parole che lo compongono e dal loro ordine. Se l’ordine delle parti del testo cambia, cambia anche il significato”.

Che succede se invece si mescolano i versi a caso? Beh, se gli elementi vengono mescolati a caso, il significato del testo si perde del tutto.
Ho scritto un frammento di codice in Snap! che fa proprio questo: scrive la poesia della Gorkin al dritto, al rovescio, e poi mescola i versi, ogni volta in maniera diversa. Lo trovate qui: https://snap.berkeley.edu/project?user=stefano63&project=worst_day

A priori potremmo dire che mescolando non si capirà nulla; ma se provate avrete delle sorprese. Compaiono dei frammenti, a volte lunghi tre-quattro versi, che sembrano avere un significato compiuto.
Perché? E’ una caratteristica di questa poesia particolare? Delle poesie in generale? O della maniera con cui sono stati scritti i versi?

In effetti, alcuni versi sono composti da una singola parola molto generica, che non ha valore di per sé, ma solo come aggancio tra il verso precedente e quello seguente (es. “Perché”, “Anche se”), oppure possono avere facilmente sia il ruolo di soggetto che di oggetti (“La realtà”, “Il mio atteggiamento”).
Altri sono fatti per rovesciare l’interpretazione del verso seguente (“E non è vero che”, “Non provare a convincermi che”). Insomma, il significato dei frammenti si costruisce in base all’accostamento di due o più versi, e il significato complessivo – se esiste – risulta dall’aggregazione di questi sotto-significati. Anzi: il significato si stabilizza alla fine della lettura, come una specie di media tra i sotto-significati.

Si può fare la stessa analisi, in maniera più semplice, a livello di frase. Prendiamo una frase semplice, di tre parole: due sostantivi (lupo, pecora) e un verbo transitivo (insegue).
La sintassi ci dice che quando il verbo è transitivo, il primo sostantivo è il soggetto e il secondo l’oggetto dell’azione espressa dal verbo. Il significato di:
lupo insegue pecora
è molto chiaro. Invertendo l’ordine delle parole la frase diventa
pecora insegue lupo
Dopo un momento di attrito, di sorpresa Rodariana, l’interpretazione torna ad assestarsi su quella precedente. Anzi, tutta la poesia che abbiamo imparato a scuola ci ha abituato a questo tipo di inversioni. Quella pecora messa all’inizio è un rafforzativo: è proprio la pecora che il lupo insegue, non un coniglio o una gallina.
Anche se si mescolano le parole, così:
pecora lupo insegue
insegue pecora lupo

il significato sembra resistere a tutti i nostri tentativi di scardinarlo.

Prendiamo una frase più complessa e mescoliamola.
il vorace gatto insegue un furbo topo
Potremmo ottenere:
topo gatto un vorace furbo insegue il
oppure
furbo un insegue gatto vorace il topo
Anche qui, il significato generale si capisce lo stesso, no? Perché?
Perché le parole sono semanticamente dense, e il rapporto tra esse si definisce indipendentemente dalla posizione reciproca. C’è una conoscenza implicita, anche se non diretta (non tutti hanno visto un gatto inseguire un topo) ma derivata dalle storie che abbiamo ascoltato o letto, che ci spinge verso un’interpretazione statisticamente più accettabile di quella opposta. I topi non sono descritti come voraci, e di solito non inseguono i gatti, tranne appunto nelle opere di Rodari.

Cambiamo frase di partenza:
credi che la vita sia felice non triste
Ora facciamo delle variazioni:
vita triste la credi non felice sia
la non credi felice vita sia triste

sia la vita credi triste non felice

Qui invece è evidente che l’ordine è fondamentale. “Triste” e “felice” si possono entrambi abbinare con “vita” senza che si possa sapere a priori quale relazione è più probabile (almeno, senza altre informazioni contestuali sulla biografia dell’autore, sul suo obiettivo, il destinatario).
Ci sono poi delle parole che acquistano un senso diverso a seconda della posizione. “Sia” è una parola ambigua, come un attore che può recitare parti diverse: può funzionare da verbo o da congiunzione; “credi” può essere un indicativo o un imperativo e anche “la” può essere articolo o pronome. Ovviamente la punteggiatura aiuterebbe a precisarne il ruolo (“ecco a che serve! ecco perché se non si usa succedono pasticci…”).

vita triste, la credi!, non felice sia
la non credi felice vita sia triste

sia vita – la credi triste? – non felice

Ecco allora spiegato il senso dell’esperimento: mescolare a caso consente di evidenziare il peso semantico, l’inerzia dei segmenti (delle parole, dei versi, delle frasi) rispetto alla tensione della sintassi, la quale invece spinge verso un’interpretazione che dipende dall’ordine degli elementi, secondo uno schema che si sovrappone alle parole. A seconda del valore di questo peso, la sintassi riesce, o non riesce, a rompere l’inerzia e a trascinare il significato nella direzione che vuole.
Questo è il valore didattico dell’uso del caso: rompere con l’abitudine a vedere le cose sempre nello stesso modo. Il caso ci propone un mondo non semplicemente al contrario, ma retto da regole diverse da quelle che conosciamo. Ci spinge ad esplorare queste regole, a confrontarle con quelle abituali e a capirle meglio.


Seconda parte: questo esercizio di applicazione del caso alla lingua si può fare a mente? Sì; ma è complicato se il testo è lungo. Si può fare su carta? Sì; ma se vogliamo cambiare testo dobbiamo ricominciare ogni volta da capo. Allora si può far fare ad un programma di computer? Eccoci qua.
Intanto sappiate che non è un’idea nuova; smontare e rimontare frasi lo si faceva anche con il linguaggio Logo, quello delle tartarughe, che oltre a permette di disegnare girandole e casette permette molto, ma molto facilmente di lavorare con liste di parole, rigirarle, estrarre pezzetti. Inoltre i computer sono abbastanza bravi a tirare fuori un numero a caso; più bravi di noi, che in qualche modo rischiamo di essere orientati da qualche associazione inconsapevole. Quindi sì, si può fare, e in più ha il vantaggio di permetterci di sperimentare con tanti testi diversi senza modificare il programma. Per esempio, invece della poesia della Gorkin si può provare con i versi della Divina Commedia. Come ho fatto qui: https://www.stefanopenge.it/inferno/

Il sommo poeta avrebbe amato
i computer?

Ma non c’è solo il vantaggio della forza bruta del computer.

Prima di provare a scrivere un pezzetto di codice che permette di rovesciare una poesia, bisogna domandarsi come si farebbe a mano, sulla carta. La risposta probabilmente è questa: si prende l’ultima riga della poesia, si cancella, e si ricopia in testa, e così via. E invece no, questa modalità non funziona: alla fine si ottiene la stessa poesia iniziale (provate). Quindi?
Quindi si possono usare due liste: quella iniziale (la poesia originale) e quella finale (la poesia rovesciata). Si prende l’ultimo verso dalla prima, lo si cancella e lo si mette come primo della seconda, e così via, finché la prima lista di versi è vuota.
Lo stesso sistema si può usare per mescolare a caso i versi di una poesia. Si prende una riga a caso dalla poesia originale, la si cancella da lì e la si inserisce in testa alla seconda lista. Quando la prima lista è vuota, la seconda contiene una copia mescolata.
Perché questa attenzione alla modalità carta-e-matita? Perché il coding serve soprattutto a questo: a riflettere sulla maniera in cui facciamo le cose, esplicitarla, discuterla, verificarla. A volte alcune cose pensiamo di saperle fare, ma non è vero; in questo caso, è l’occasione per andare a cercare dei metodi, che poi potremo mettere in pratica. In generale, il percorso è da dentro a fuori, e non il contrario. Una volta fatto questo, si può cominciare a scrivere codice (o a trascinare blocchetti, come preferite).
Ma ci sono tanti modi diversi di mescolare un testo. Possiamo aggiungere dei vincoli: nessun verso deve restare nella posizione originale; oppure le coppie di versi presenti nella poesia originale non devono ripresentarsi insieme in quella mescolata. Questo sarebbe un po’ noioso da fare sulla carta, ma non particolarmente con la versione digitale.
Usare un computer per programmare questo frullatore di testi offre però un altro vantaggio che è legato alla “consapevolezza” dei programmi, cioè al fatto che quando fanno un’azione possono registrarne il risultato, cosa che per noi umani è più lungo e faticoso, e soggetto ad errore. Siccome le azioni che fa il programma le possiamo accelerare e rallentare a piacere, possiamo fargli generare cento volte una nuova versione mescolata a caso e registrarle tutte.
Potremmo misurare il grado di mescolamento della frase in termini di distanza dalla versione originale. Poi possiamo “votare” le versioni in cui il significato è più chiaro, e mettere i voti in relazione con il grado di mescolamento degli elementi. Alla fine potremo verificare se è proprio vero che un’insalata più assomiglia all’originale, più mantiene il significato; o forse scopriremo altre regolarità. Per esempio, pensando ad una frase: ci sono parole che galleggiano più facilmente di altre? i verbi hanno un ruolo più importante? oppure le preposizioni? o le parole astratte? E le relazioni transitive soffrono di più dello spostamento rispetto alle descrizioni di una qualità o di uno stato? Eccetera.

Insomma ecco un altro esempio di come fare coding possa servire a mettere alla prova una teoria implicita e a imparare qualcosa su come funziona il mondo.

Poeti, navigatori, santi e cuochi: cosa insegna la linguistica computazionale al coding?

Gen
31

L’incontro tra informatica e letteratura avviene ufficialmente, almeno in Italia, quando nel 1949 Padre Busa SJ si dedica all’immane compito di compilare un Index Thomisticus, cioè un repertorio di tutti i termini utilizzati dall’Aquinate nelle sue opere. Per farlo, chiede il supporto dell’IBM (parlando con il suo fondatore, Watson) e inizia un lavoro di lemmatizzazione durato trent’anni. Dopo la versione cartacea (1980) e quella su cdrom (1989), nel 2005 nasce la versione web (http://www.corpusthomisticum.org/it/index.age).

La linguistica computazionale si presenta così con un aria seriosa, doppiamente sostenuta dall’oggetto (il testo classico) e lo strumento (il programma di lemmatizzazione e ricerca), per non parlare dello scopo scientifico.

Ma ci sono stati altri incontri meno nobili, come quello tra il libro cartaceo Cent Mille Miliards de Poèms di Raymond Queneau e il web. Per chi non avesse avuto la fortuna di sfogliare quel meraviglioso oggetto, si tratta di un libro pubblicato nel 1961 che raccoglie dieci sonetti di quattordici versi ognuno. La peculiarità che lo rende unico è la pagina è tagliata in orizzontale in modo da rendere ogni verso un oggetto autonomo; è possibile così leggere (e costruire con la mente) un sonetto costituito, poniamo, dal primo verso della prima pagina, il secondo dalla decima, il terzo dalla quinta, e così via. Le possibilità totali sono 1014, cioè appunto 100.000.000.000.000. Di questa macchina per generare sonetti ne esistono varie versioni consultabili su web, come per esempio questa: http://www.growndodo.com/wordplay/oulipo/10%5e14sonnets.html

Queneau realizza (cioè “dimostra la possibilità”) di qualcosa che nel cielo delle invenzioni letterarie era ben nota. A partire per lo meno dalla macchina creata dagli scienziati dell’Accademia di Laputa:

La superficie risultava di vari pezzetti di legno, grossi press’a poco come dadi, alcuni di maggiore dimensione degli altri. Erano tutti congiunti da esili fili di ferro. Incollata sopra le quattro facce dei pezzetti di legno era della carta, e su questa si trovavano scritte tutte le parole della loro lingua, coniugate nei diversi modi e tempi e declinate nei vari casi, ma senza ordine veruno. Il professore m’invitò a prestare attenzione, ché appunto s’accingeva a mettere in moto la macchina. Ciascun discepolo prese, al cenno del maestro, un manico di ferro (ce n’erano quaranta fissati intorno agli orli della macchina) e d’un tratto lo fece girare. Naturalmente la disposizione delle parole cambiò in tutto e per tutto. Il maestro ordinò allora a trentasei scolari di leggere pian pianino i vari righi così come apparivano sulla macchina; e quando quelli trovavano tre o quattro parole unite insieme che potevano far parte d’una sentenza, le dettavano ai quattro rimanenti discepoli che fungevano da scrivani (Jonathan Swift, I viaggi di Gulliver, Traduzione di Carlo Formichi, a cura di Masolino d’Amico, Mondadori, Milano, 1982, p. 393).

passando, naturalmente, per Borges, Levi, Landolfi e Dahl. Molti altri esempi sono citati in questa trascrizione di una bellissima conferenza del 2015 tenuta da Paolo Albani (a meno che non sia anche questo un testo generato automaticamente) che potete leggere qui: http://www.paoloalbani.it/Letteraturacombinatoria.pdf.

Cosa mostra davvero questo strano artefatto, nella versione cartacea come in quella digitale? Che la letteratura (e in particolare la poesia) non è tutta intuizione ed espressione libera. Che il gioco tra sistema e creatività, tra regola ed eccezione, non è proprio così chiuso come sembra. La poesia, in particolare, nasce proprio dal vincolo (tematico, formale), come orizzonte e come sfida. Non lo dico io, lo dice Calvino: la letteratura è

“un’ostinata serie di tentativi di far stare una parola dietro l’altra seguendo certe regole definite, o più spesso regole non definite né definibili ma estrapolabili da una serie di esempi o protocolli, o regole che ci siamo inventate per l’occasione cioè che abbiamo derivato da altre regole seguite da altri” (Cibernetica e fantasmi. Appunti sulla narrativa come processo combinatorio, in: Una pietra sopra. Discorsi di letteratura e società, Einaudi, Torino, 1980, pp. 164).

E cosa fa il poeta quando crea, se non andare a pescare nella sua memoria linguistica e scegliere combinazioni di parole, vincolate da regole precise (come il metro o la rima)? Certo, la scelta è anche governata dal significato – in maniera difficile da precisare. Il poeta parte con l’idea da esprimere e cerca le parole più adatte? Oppure si lascia guidare dalle parole stesse, sfruttando somiglianze fonetiche, rimandi per analogia o opposizioni? O ancora, più probabilmente, attua un misto delle due strategie? Insomma: come si scrive, praticamente, una poesia?

E di qui l’idea di proporre delle attività didattiche di coding intorno ai temi della forma e della variazione, delle categorie, dell’accettabilità. In un periodo in cui il machine learning sembra riproporre il vecchio mito dell’intelligenza artificiale, viene voglia di ragionare intorno ai processi creativi anche utilizzando paradossi, e di provare a costruire un automa in grado, se non di scrivere poesie originali (come questo: http://thinkzone.wlonk.com/PoemGen/PoemGen.htm, o quest’altro fatto addirittura in Scratch che lavora per sottrazione da una poesia di Walt Whitman: https://scratch.mit.edu/projects/12331423/) almeno di inventare ricette sempre nuove, che tutto sommato sono sempre forme di testo vincolate, come questa: http://www.lynxlab.com/staff/steve/public/ricette.

Per restare nel dominio letterario, due modesti esempi di macchine figlie di quella di Queneau (ma che pescano nel testo di due classici sempreverdi come l’Inferno di Dante Alighieri e l’Orlando Furioso di Ludovico Ariosto) li trovate qui http://www.lynxlab.com/staff/steve/public/inferno e qui http://www.lynxlab.com/staff/steve/public/orlando. Oltre a Queneau, questi due oggetti digitali si ispirano più precisamente a “Il centunesimo canto. Philologica dantesca“di Luca Chiti, che è un meraviglioso esempio di centone umoristico che “crea” un intero canto giustapponendo versi esistenti ma dandogli un senso completamente nuovo. Per realizzarli, ho dovuto affrontare problemi letterari, come la definizione di rima, di struttura metrica, di novità e ripetizione (oltre che qualche problema informatico, come il loop infinito o la conversione dei caratteri in UTF-8). Non ho seguito alla lettera le indicazioni di Nanni Balestrini, ma ci sono andato vicino. Ed ecco apparire terzine più o meno improbabili come la seguente:

Parlando cose che ‘l tacere è bello
rispuosemi: «non omo, omo già fui
venimmo al piè d’un nobile castello

o come questa:

Nel nome che sonò la voce sola
poscia vid’io mille visi cagnazzi
cosí vidi adunar la bella scola

Una valutazione estetica del risultato? Non è l’obiettivo, anche se può essere divertente provare e riprovare, fino a far emergere dei frammenti di senso che possono essere anche divertenti. Ma quelle che mi paiono importanti, come sempre, sono le domande che emergono ogni volta che si prova a realizzare un modello funzionante di una teoria: come si riconosce una rima? Come si produce una struttura metrica? Come si ottiene un testo casuale sempre diverso? Come si riconosce che il testo non è stato scritto da un poeta umano?

Mi sembrano tutte domande legittime da porsi in una classe che studia letteratura: portano con sé riflessioni e discussioni che integrano, anche se non sostituiscono, l’apprendimento di nomi di forme di testo come “trimetro scazonte” o “endecasillabo sciolto” o di opere particolari.

E ancora una volta mostrano come la costruzione reale di un programma possa essere un’attività didattica sensata al di là di ogni mitologia computazionale.

 

Critical Code Studies

Gen
20

Critical Code Studies è un’etichetta che copre le attività di discussione e studio del codice sorgente che si svolgono presso l’Università della Southern California (Humanities and Critical Code Studies Lab, HaCCS).

Oggetto di studio sono i codici sorgente, cioè quella cosa scritta da umani (per lo più) e che poi viene eseguita dai computer, telefoni, satelliti, droni, etc. Solo che, avete letto bene, non è il dipartimento di Computer Science che se ne occupa.

“Critical” è un termine chiave. Si può leggere in due modi: il primo è come parallelismo alla critica letteraria, cioè come richiamo all’utilizzo di approcci e tecniche che finora sono state applicate ai testi tradizionali (digitalizzati o meno). Significa che i codice sorgenti vengono trattati come opere, con una dignità che va oltre quella di pure macchine strumentali fatte di codici binari. Un codice sorgente è scritto in un linguaggio (uno dei circa 2500 censiti), e viene non solo scritto per essere “interpretato” dal computer, ma anche per essere letto, discusso, modificato, copiato. E – come è normale per ogni prodotto di scrittura – presenta aspetti estetici, stilistici, retorici. Se esistono poesie scritte in linguaggi di programmazione (la prestigiosa e serissima Stanford University fa annualmente un concorso, http://stanford.edu/~mkagen/codepoetryslam/), virus presentati come opere d’arte http://0100101110101101.org/biennale-py/, programmi scritti per sfidare il lettore alla loro comprensione http://ioccc.org/, linguaggi in cui si programma usando i colori in omaggio a Mondrian http://progopedia.com/language/piet/, significherà pure qualcosa.

L’altro senso di “Critical” è più forte: indica che non ci si vuole limitare a studiare i testi, ma anche i contesti della loro produzione e uso. Significa che l’approccio usato vuole tener conto anche delle questioni di genere, di cultura, di divario economico. Perché non basta allenare i bambini al pensiero algoritmico: il software è qualcosa di ben più complesso di un algoritmo che muove un pupazzetto su uno schermo.

Per farsi un’idea, si può leggere questa introduzione di Mark Marino, del 2006: http://www.electronicbookreview.com/thread/electropoetics/codology

Trovate tanti riferimenti alle persone che hanno riflettuto su questo tema: da John Cayley a Florian Cramer, Loss Pequeño Glazier, Geoff Cox, Alex McClean, Adrian Ward.

A partire dal 2010, viene tenuto annualmente un Working Group (http://haccslab.com/) dove si possono discutere online frammenti di codice. Quello di quest’anno è appena cominciato.

Tutto questo accade a Los Angeles, USA.

Qui da noi, sono anni – almeno dal 1999 – che cerco di impostare un lavoro simile (con seminari, articoli, slide, wiki: http://ada.lynxlab.com/staff/steve/public/docu/lidia/), ma ahimé senza molto successo. Ma sono io che ho sbagliato Paese.