Negli ultimi anni il campo dell’intelligenza artificiale sta compiendo passi da gigante, ottenendo risultati impensabili fino a poco tempo fa (e questo blog non sta certo mancando di trattare l’argomento, vedi qui per esempio).
I computer in generale sono molto bravi a manipolare informazione, ma quest’informazione alla fin fine è sempre codificata in forma numerica, in un modo o nell’altro, mentre noi umani pensiamo in maniera simbolica.
In questo post parleremo di linguaggio. Quando pensiamo alla parola gatto, non stiamo certo pensando alla lista delle lettere che compongono la parola, e se immaginiamo l’immagine di un gatto non immaginiamo di certo una serie di pixel, come purtroppo deve fare un computer.
Non solo, quando pensiamo alla parola gatto abbiamo un gigantesco bagaglio di conoscenze (sia esplicite che implicite) sul significato di questa parola. Un gatto è un animale domestico, di taglia piccola, indipendente, miagola, odia l’acqua, odia i cani (generalmente, ma poi capitano i video su youtube i video di gatti che giocano con i cani o che si fanno il bagno), e così via.
Un computer invece no. Un computer è efficiente nell’immagazzinare informazioni (basta cercare gatto su wikipedia per avere tutte le informazioni di cui abbiamo bisogno) ma sono comunque informazioni scritte da umani e poi categorizzate.
Un computer non ha un’immagine mentale del concetto di gatto. Nè di nessun altra parola.
O forse sì? In questo post proverò a raccontarvi di alcune tecniche che riescono a catturare in maniera automatica la semantica di una parola in una forma numerica (o per essere più precisi, vettoriale).
Ma una cosa alla volta, prima di capire come insegnare il senso di una parola ad un computer, facciamo un passo indietro a capire come facciamo noi esseri umani…
Il tezgüino
Leggete le seguenti frasi (l’esempio è tratto da “Speech and language processing”, Jurafsky Martin):
- C’è una bottiglia di tezgüino sul tavolo.
- Tutti amano il tezgüino.
- Il Tezgüino ubriaca.
- Facciamo il tezgüino partendo dal mais.
Con molta probabilità non avete mai sentito parlare del tezgüino, ma ciononostante vi siete fatti un’idea più o meno precisa di cosa sia: una bevanda alcolica.
Di più, sapete che è tratta dal mais (quindi un cereale), quindi forse ve lo state già immaginando come qualcosa di simile alla birra piuttosto che al vino.
E avreste ragione. Il tezgüino (o anche tesguino, e altre varianti), è effettivamente una bevanda alcolica, simile alla birra, distillata dalla popolazione indigena dei Tarahumara, in Messico.
Ma la cosa interessante è che questa informazione non è stata mai data esplicitamente nelle 4 frasi di cui sopra. Non si parla di alcol esplicitamente, né si parla esplicitamente del suo sapore. Ciononostante siamo stati capaci di imparare il significato di una nuova parola a partire soltanto da 4 esempi, e per di più esempi (relativamente) indiretti.
Come abbiamo fatto? L’intuizione di alcuni linguisti degli anni ’50 (Harris e Firth), è che la semantica di una parola è racchiusa dai contesti in cui questa appare. Deduciamo che il tezgüino è una bevanda alcolica perché abbiamo sentito parlare di altre bevande alcoliche, e invariabilmente ne abbiamo sentito parlare in contesti simili a quelli presentati sopra.
Questa è chiamata l’ipotesi distribuzionale, e il campo della semantica distribuzionale si basa su questa ipotesi per creare delle rappresentazioni numeriche dei significati delle parole.
Contesti linguistici
Come trasformare questa intuizione in qualcosa di calcolabile? Iniziamo a fissare un po’ di idee e notazione. Innanzitutto dobbiamo dire cosa intendiamo per contesto, negli anni sono state sviluppate numerose varianti, ma per noi il contesto in cui una parola appare saranno le due parole che la precedono e le due parole che la seguono (se ci sono, altrimenti nulla), tralasciando per semplicità articoli, preposizioni e altre parole poco interessanti. Date le frasi di prima quindi, avremo 4 contesti per la parola tezgüino:
- $$C_1$$ = [bottiglia, tavolo]
- $$C_2$$ = [tutti, amano]
- $$C_3$$ = [ubriaca]
- $$C_4$$ = [facciamo, partendo, mais]
Corpus
Il secondo passo è collezionare tanti di questi contesti, per ogni parola a cui siamo interessati. Per far questo si usano i corpora (corpus al singolare), che non sono altro che grandi (enormi) collezioni di testi scritti. E per enormi si intendono decine o centinaia di milioni di parole (recentemente si è raggiunto il record di usare un corpus di un miliardo di parole).
Dalle parole ai vettori
Siamo quasi arrivati al punto, ovvero inventare una tecnica per trasformare una parola in un formato comprensibile da un computer (useremo un vettore), in maniera tale che questa rappresentazione contenga informazioni sul significato della parola.
Una volta analizzato un corpus avremo quindi un gigantesco aggregato di dati che comprende tutte le parole che appaiono vicino ad un’altra parola (contando anche quante volte appaiono):
- $$C$$ = [… amano, bottiglia, facciamo, mais, partendo, tavolo, tutti, ubriaca, …]
Prendiamo quindi il nostro corpus, e diciamo per semplicità che considereremo soltanto le 10.000 parole più frequenti (sempre tralasciando articoli e altre parole “poco interessanti”). Costruiamo quindi una matrice quadrata con 10.000 righe e 10.000 colonne, ogni riga di questa matrice sarà un vettore che sarà la rappresentazione della nostra parola, quindi magari $$\mathbf{v}_{1083}$$ sarà il vettore che ingloberà il significato della parola “gatto”, $$\mathbf{v}_{678}$$ per la parola “cane”, e magari $$\mathbf{v}_{8567}$$ per la parola “macchina”.
Cosa ci sarà in questi vettori? Beh, abbiamo detto che ogni vettore rappresenta una parola, ma anche ogni singola componente rappresenta una parola, e il valore di quella componente sarà proprio il numero di volte che le due parole appaiono in uno stesso contesto.
Per esempio consideriamo i tre vettori di prima, relativi alle parole “cane”, “gatto”, e “macchina”, e consideriamone tre componenti, quelle relative alle parole “giocare”, “coda” e “volante” (vedi immagine).
Sia “cane” che “gatto” appaiono spesso in contesti dove appaiono anche le parole “coda” e “giocare”, ma accade raramente che appaiono con la parola “volante”.
Similarità
Dall’immagine si vede già che i vettori delle parole “cane” e “gatto” sono vicini (nel senso che l’angolo che formano è piccolo), mentre i vettori di cane e gatto formano un angolo molto più ampio.
Cosa sta succedendo? Perché funziona? L’angolo tra due vettori si può calcolare tramite un’operazione chiamata il prodotto scalare, definito come segue:
$$\displaystyle\langle v, w \rangle = \sum_i v_i w_i = v_1 w_1 + v_2 w_2 + v_3 w_3 + \ldots + v_n w_n$$
stiamo quindi moltiplicando tra di loro le componenti dei due vettori, e poi sommando il risultato. Nel nostro caso ogni componente corrisponde ad una parola, quindi quando moltiplicheremo tra di loro i vettori di “cane” e di “gatto”, ci troveremo a moltiplicare (tra le altre) le componenti relative a “giocare” e “coda” (ottenendo un numero alto, visto che entrambi i valori sono alti).
D’altra parte, se moltiplichiamo tra di loro i vettori di “cane” e “macchina”, otterremo un valore decisamente più basso, dato che non capiterà mai che combacino valori alti nel prodotto (proprio perché capita molto più raramente che le due parole appaiano in contesti simili).
Varie ed eventuali
Va notato che la misura di similarità che otteniamo è un po’ rozza. Vengono considerate simili parole che appaiono in contesti simili, e questo comprende i sinonimi (due parole con significato uguale), gli antonimi (parole con significato opposto, come bello e brutto) e i coiperonimi (parole che sono una sottoclasse di una classe più ampia, come cane e gatto che sono entrambi animali domestici).
Nei prossimi articoli vedremo più in dettaglio alcuni punti su cui sono stato volutamente vago, parleremo di modi per raffinare molto ciò che abbiamo introdotto in questo post, ed infine vedremo anche altre tecniche che invece usano approcci totalmente diversi.
Alla prossima!
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Ancora nessun commento