Dalle parole ai numeri
Apertura
0:00:00
Corso per i docenti · Liceo scientifico · 3 ore

Dalle parole
ai numeri

Introduzione al Natural Language Processing: come un computer trasforma una frase in qualcosa che può contare, confrontare e imparare.

La stessa idea che vedremo oggi, in movimento: ogni frase diventa una riga di 0 e 1.

A cura di Nicola Palmeri · Ingegnere dell'informazione, sviluppatore XR/VR, docente di informatica

Apertura 0:03

Perché uno che costruisce mondi virtuali vi parla di parole

Di mestiere costruisco esperienze in realtà virtuale, film immersivi e software. In classe insegno informatica. In entrambi i lavori il linguaggio è diventato la porta d'ingresso alla tecnologia.

In laboratorio

Un visore che obbedisce a un comando vocale, un personaggio virtuale che capisce una domanda, una guida museale che risponde al visitatore: sotto c'è sempre l'elaborazione del linguaggio.

In classe

I nostri studenti usano ogni giorno assistenti AI, traduttori, correttori. Sapere come trasformano le parole in numeri è il primo passo per usarli con spirito critico.

Oggi

Non serve saper programmare. Costruiremo insieme, a mano e con le animazioni, lo strumento più semplice e più istruttivo di tutti: il bag-of-words.

Alcuni dei miei progetti
VR Valle dei Templi
virtualizzazione del parco archeologico di Agrigento
FILM VR Tataratà
la danza delle spade di Casteltermini, girata in 8K 3D stereoscopico
FORMAZIONE VigilòVR
formazione sulla sicurezza sul lavoro in realtà virtuale
SCUOLA IISS «Archimede»
docente di informatica
Le frasi di esempio di oggi vengono da questi mondi: realtà virtuale, scuola, tecnologia.
Programma 180 minuti

Il percorso di oggi

La parte evidenziata è il cuore del corso. Cliccate su un blocco per saltare a quella sezione.

Parte 1 0:10

Un computer non legge. Calcola.

Noi capiamo una frase al volo. Un computer vede solo una sequenza di caratteri: non sa che «visore» e «caschetto VR» indicano la stessa cosa, né che «non» capovolge il senso.

Il Natural Language Processing (NLP) è l'insieme dei metodi che permettono a una macchina di trattare il linguaggio umano, scritto o parlato. Il primo passo è sempre lo stesso: trasformare il testo in numeri.

Tutta la lezione risponde a una domanda: come si passa dalla colonna di sinistra a quella di destra?

Quello che scriviamo
«Il visore rende la lezione coinvolgente»
↓ ? ↓
Quello che il computer può usare
Parte 1 0:15

Ottant'anni in sei tappe

Cliccate su una tappa.

Parte 1 0:20

L'NLP lo usiamo già, ogni giorno

Otto esempi che incontriamo a scuola e nella tecnologia di tutti i giorni. Cliccate per leggere come funzionano.

Parte 1 · Demo 0:25

Il primo filtro antispam: una lista di parole

I primi filtri cercavano parole sospette. Più parole sospette trovano, più il messaggio è probabilmente spam. Scrivete un messaggio e guardate cosa succede.

Parole sospette:
0parole sospette trovate

Il filtro è fragile: «gr4tis» passa, «la ricreazione è gratis» viene bloccato. Nella parte 3 rifaremo questo filtro con il bag-of-words e un po' di probabilità: imparerà da solo quali parole contano.

Parte 1 · Demo 0:30

Testo predittivo: contare chi viene dopo chi

La tastiera del telefono suggerisce la parola successiva. La versione più semplice conta, in un insieme di testi, quante volte una parola segue un'altra.

Suggerimenti (cliccate per aggiungere):

Questo è un modello a bigrammi. I grandi modelli linguistici di oggi fanno la stessa cosa, prevedere il prossimo pezzo di testo, ma guardando contesti molto più lunghi.

Il «corpus» su cui ha imparato (10 frasi):
Parte 2 0:35

Prima di contare, si pulisce

I testi reali sono pieni di rumore. Prima di darli a un modello passano in una catena di trasformazioni, scelte in base al compito. Premete «Avanti» per far attraversare la catena a una frase.

01Rimozione del rumorenumeri, simboli, HTML
02Minuscololowercasing
03Tokenizzazionefrasi e parole
04Stopwordvia le parole vuote
05Stemmingtaglia alla radice
06Lemmatizzazioneforma del dizionario
Testo grezzoIl Prof. ROSSI ha spiegato 3 lezioni!!! <br>
01 rumoreIl Prof ROSSI ha spiegato lezioni
02 minuscoloil prof rossi ha spiegato lezioni
03 token
ilprofrossihaspiegatolezioni
04 stopword
profrossispiegatolezioni
05 stemming
profrossspieglezion
06 oppure lemmi
profrossispiegarelezione
Parte 2 · Passo 01 0:40

Rimozione del rumore con le espressioni regolari

Il rumore sono i caratteri che non servono al nostro scopo: numeri, punteggiatura, link, tag HTML. In Python si usa la libreria re, che sostituisce tutto ciò che corrisponde a uno schema.

import re

Cosa è «rumore» dipende dal compito. Se analizziamo prezzi o date, i numeri sono proprio l'informazione da tenere.

Un avviso scolastico di esempio:
In rosso, per un attimo, vedrete i caratteri che stanno per sparire.
Parte 2 · Passo 02 0:45

Minuscolo: «Il» e «il» sono la stessa parola?

Per un computer "Il" e "il" sono stringhe diverse. Portando tutto in minuscolo con testo.lower() il modello non deve imparare due volte la stessa parola.

Ma a volte la maiuscola porta significato. Rosa è una persona, la rosa è un fiore: dopo il minuscolo diventano la stessa colonna.

Quante volte compare ogni forma
Parte 2 · Passo 03a 0:50

Dove finisce una frase?

Tokenizzare significa spezzare il testo nelle unità che analizzeremo. Si parte di solito dalle frasi. Sembra facile: basta tagliare a ogni punto. Proviamo.

La libreria nltk offre sent_tokenize, basata su un modello addestrato a riconoscere abbreviazioni come «Prof.» o «n.».

Parte 2 · Passo 03b 0:55

Tokenizzazione in parole

Dividere in parole è obbligatorio per quasi ogni metodo NLP. Non si ottengono solo parole: anche numeri, punti, sigle diventano token. In nltk si usa word_tokenize.

parolanumeropunteggiatura

Molti tokenizzatori pensati per l'inglese lasciano «l'esperienza» come un unico token. Per l'italiano conviene separare l'articolo: altrimenti «l'esperienza» ed «esperienza» diventano due parole diverse.

0token
Parte 2 · Passo 04 1:00

Stopword: le parole che non portano contenuto

Articoli, preposizioni, congiunzioni e ausiliari compaiono ovunque e dicono poco sull'argomento del testo. nltk ne fornisce una lista per l'italiano con stopwords.words("italian").

Output Python: —
Parte 2 · Passo 05 1:05

Stemming: tagliare fino alla radice

Lo stemming toglie le desinenze con regole fisse. Non serve che la radice sia una parola vera: basta che parole della stessa famiglia finiscano sulla stessa radice. Così un motore di ricerca tratta «programmare» e «programmazione» come equivalenti.

Provate con altre parole (stemmer semplificato a scopo didattico, separate con spazi):

In Python: SnowballStemmer("italian") di nltk. Applica molte più regole di questa versione semplificata.

Parte 2 · Passo 06 1:08

Lemmatizzazione: tornare alla voce del dizionario

Il lemma è la forma che cerchereste nel vocabolario. Per trovarlo servono le regole e il lessico della lingua, non basta tagliare: «andò» e «vado» hanno forme diverse ma lo stesso lemma «andare».

Premete «Avanti» per vedere i lemmi accanto agli stem.

In nltk: WordNetLemmatizer con il dizionario wordnet, pensato per l'inglese (built → build). Per l'italiano si usano strumenti come spaCy o Stanza.

Parte 2 · Laboratorio 1:10

Componete la vostra catena

Provate a scrivere un testo della vostra materia.

Pausa 1:15 – 1:30
15:00

Al rientro: il bag-of-words, il cuore del corso.

Parte 3 1:30

Da parole a numeri

Dopo la pulizia abbiamo ancora stringhe, cioè variabili categoriali. Un algoritmo di machine learning lavora con numeri: dobbiamo dare a ogni testo delle coordinate.

Vedremo due metodi:

Bag-of-words (BoW)

Conta quali parole ci sono. Semplice, trasparente, si fa a mano. Ci dedicheremo un'ora.

Word embedding (WE)

Impara vettori che rappresentano il significato. Più potente, meno trasparente.

↓
Parte 3 · Prerequisito 1:35

Un mattone: il one-hot encoding

Fissiamo un elenco di parole, il vocabolario. Ogni parola diventa un vettore lungo quanto il vocabolario, con tutti 0 e un solo 1 nella sua posizione.

È come una fila di interruttori: per ogni parola se ne accende uno solo.

Il bag-of-words è la somma (o l'unione) dei vettori one-hot di tutte le parole di una frase.

Cliccate una parola del vocabolario:
Parte 3 1:40

Perché si chiama «sacchetto di parole»

Immaginate di ritagliare le parole di una frase e metterle in un sacchetto. Scuotete. Quello che resta è solo quali parole ci sono e quante volte. L'ordine è perso.

Avanti: 1) nel sacchetto · 2) conteggio

Il modello si chiede soltanto se una parola nota è presente, non dove. Il risultato è l'istogramma delle parole del testo: ogni parola diventa una caratteristica.

Parte 3 · Passo 1 di 2 1:45

Passo 1 · Costruire il vocabolario

Leggiamo tutte le frasi parola per parola. Se una parola non è ancora nel vocabolario la aggiungiamo in fondo; se c'è già, andiamo avanti.

0parole lette0nel vocabolario
Vocabolario
Parte 3 · Passo 2 di 2 1:52

Passo 2 · Ogni frase diventa una riga di 0 e 1

Scorriamo il vocabolario una parola alla volta e per ognuna ci chiediamo: è nella frase? Sì → 1, no → 0.

Parte 3 1:58

La tabella completa: righe = frasi, colonne = parole

Passate il mouse su una cella o su un'intestazione.

Ogni cella risponde alla domanda «questa parola è in questa frase?».

Le colonne il, visore, rende, la, lezione valgono 1 ovunque: non aiutano a distinguere le frasi. Le differenze stanno tutte in coinvolgente, e, divertente, non, immersiva.

Le colonne seguono l'ordine in cui abbiamo incontrato le parole. Va bene qualsiasi ordine, purché sia lo stesso per tutte le frasi.

Parte 3 2:03

Presenza (0/1) oppure conteggio?

Finora abbiamo segnato solo la presenza. Possiamo anche contare quante volte compare ogni parola. Come segnare una parola è una scelta di progetto, proprio come la scelta del vocabolario.

Con i conteggi un testo che parla molto di «drone» pesa di più su quella colonna. Per testi lunghi è quasi sempre la scelta migliore.

Parte 3 · Laboratorio 2:08

Laboratorio: il vostro bag-of-words

Una frase per riga (massimo 6):
0colonne0%celle a zero

Accendete «Togli stopword»: le colonne inutili spariscono, ma con loro anche «non».

Parte 3 2:13

Ora che sono vettori, possiamo confrontarli

Due frasi simili hanno molte colonne in comune. La similarità del coseno misura l'angolo tra i due vettori: 1 se puntano nella stessa direzione, 0 se non condividono nulla.

cos(A,B) = (A · B) / (|A| · |B|)
Confronta
con
Tabella di tutte le coppie:
Parte 3 2:18

Il grande limite: l'ordine non esiste

Vettori identici

Il BoW non dà informazioni sul significato delle parole né sulla loro posizione. Chi corregge chi? Per il modello è la stessa frase.

Succede anche con la negazione

l'appèutile,nonnoiosa
l'appènoiosa,nonutile

Stesse parole, giudizio opposto. Una recensione positiva e una negativa della stessa app diventano lo stesso vettore.

Parte 3 2:21

Un mare di zeri

Con 3 frasi avevamo 9 colonne. Con migliaia di documenti il vocabolario arriva a decine di migliaia di parole, ma ogni testo ne usa solo poche centinaia. Quasi tutte le celle valgono 0: la matrice si dice sparsa.

delle celle di questa riga è 0

Ogni quadratino rappresenta un gruppo di parole del vocabolario. In blu, i gruppi che contengono almeno una parola usata nel documento.

Per questo le librerie salvano solo le celle diverse da 0 (matrici sparse): fit_transform di scikit-learn restituisce proprio una matrice sparsa.

Parte 3 2:24

Due modi per migliorare il sacchetto

1 · Bigrammi: contare coppie di parole vicine

Al posto delle singole parole mettiamo nel vocabolario anche le coppie consecutive. Un po' di ordine ritorna.

2 · TF-IDF: pesare meno le parole ovunque presenti

Una parola presente in tutti i documenti non distingue nulla. TF-IDF moltiplica il conteggio per ln(N / df), dove df è il numero di documenti che la contengono.

Con N = 3 frasi: «il» compare in 3 su 3, ln(3/3) = 0. Scikit-learn usa una formula leggermente smussata, ma l'idea è la stessa.

Parte 3 2:27

Lo stesso, in Python

# tre frasi sulla VR a scuola
frasi = [
    "Il visore rende la lezione coinvolgente e divertente",
    "Il visore non rende la lezione divertente",
    "Il visore rende la lezione immersiva e coinvolgente",
]
# 1) minuscolo e divisione in parole
documenti = [f.lower().split() for f in frasi]

# 2) vocabolario in ordine di apparizione
vocabolario = []
for doc in documenti:
    for parola in doc:
        if parola not in vocabolario:
            vocabolario.append(parola)

# 3) un vettore 0/1 per ogni frase
for doc in documenti:
    print([1 if p in doc else 0 for p in vocabolario])

#p-out> [1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
#p-out> [1, 1, 1, 1, 1, 0, 0, 1, 1, 0]
#p-out> [1, 1, 1, 1, 1, 1, 1, 0, 0, 1]

Il risultato coincide con la tabella costruita a mano. La parte difficile non è il codice: è decidere cosa mettere nel vocabolario.

Per provare senza installare nulla: Google Colab o Jupyter. scikit-learn è già disponibile in Colab.

Parte 3 · Applicazione 2:30

Il filtro antispam, rifatto con il bag-of-words

Il modello vede 8 messaggi già etichettati, li trasforma in bag-of-words e conta quanto spesso ogni parola compare negli spam e nei messaggi normali. Per un nuovo messaggio somma gli indizi di ogni parola (classificatore Naive Bayes).

Contributo di ogni parola (verso destra = spam, verso sinistra = normale)
Parte 3 · Didattica

Portarlo in classe, nelle diverse materie

MATEMATICA

Vettori e coseno

Gli studenti costruiscono a mano i vettori di 3 frasi e calcolano prodotto scalare, norme e coseno. Ottimo esercizio su spazi a molte dimensioni.

ITALIANO · LATINO

Lemmi e morfologia

Confrontare stem e lemmi di un passo dei Promessi Sposi o di Cesare. Perché lo stemming funziona peggio in latino?

INFORMATICA

Il BoW in 12 righe

Scrivere da zero il codice della slide precedente, poi confrontarlo con CountVectorizer e spiegare le differenze.

SCIENZE · FISICA

Classificare abstract

Raccogliere 20 brevi testi di biologia e fisica e far indovinare la materia a un classificatore BoW.

FILOSOFIA

Contare è capire?

Il BoW «sa» di cosa parla un testo senza capirlo. Discussione su significato, uso e la stanza cinese di Searle.

SENZA COMPUTER

Il sacchetto di carta

Parole su cartoncini, una busta per frase, una tabella alla lavagna. In 20 minuti si arriva alla matrice.

Parte 4 2:30

Una colonna, due significati

lareteWi-Fidellascuolaèlenta
«rete»: informatica, la connessione
lapallahatoccatolarete
«rete»: pallavolo, in palestra
Nel bag-of-words entrambe finiscono nella stessa colonna:
…rete…
Frase 1…1…
Frase 2…1…

Il word embedding codifica anche la semantica: parole con significato simile diventano vettori simili. L'idea chiave è la rappresentazione distribuita: il significato di una parola si ricava dalle parole che le stanno intorno.

Due differenze dal BoW

1. Il vettore non è lungo quanto il vocabolario, ma ha un numero fisso di dimensioni (ad esempio 100 o 300).

2. I valori non sono 0 e 1 scelti da noi: sono numeri reali appresi da una rete neurale su molti testi.

Parte 4 2:32

Word embedding: la definizione formale

Dato un vocabolario V = {w1, …, w|V|}, un word embedding è una funzione

e : V → ℝd ,    con d ≪ |V|

che associa a ogni parola un vettore denso di numeri reali. I valori sono appresi da un corpus in modo che parole che compaiono in contesti simili abbiano vettori vicini, cioè con similarità del coseno alta.

denso

quasi tutti i valori sono diversi da zero, al contrario del BoW

compatto

d = 100–300 invece di |V| = decine di migliaia

appreso

nessuno sceglie i numeri: li trova l'addestramento

Alla base c'è un'idea della linguistica degli anni '50 (Harris, 1954; Firth, 1957): il significato di una parola dipende dalle parole che la accompagnano. «You shall know a word by the company it keeps.»

In pratica la funzione è una matrice E ∈ ℝd×|V|, con una colonna per ogni parola. Per trovare il vettore di una parola si moltiplica E per il suo one-hot xw: il risultato è proprio la colonna di quella parola.

e(w) = E · xw
Parola:
Parte 4 2:35

Come si impara un embedding: la finestra di contesto

Word2vec (2013) scorre il testo con una finestra di ampiezza m. Per ogni parola centrale wt raccoglie le coppie (parola centrale, parola di contesto) e allena una piccola rete a prevedere il contesto partendo dalla parola.

Finestra m =
0 coppie di addestramento raccolte
Obiettivo (modello skip-gram): rendere più probabili possibile le coppie osservate
max  Σt Σ−m≤j≤m, j≠0 log P(wt+j | wt)
P(o | c) = exp(uo · vc) / Σw∈V exp(uw · vc)

In parole: il prodotto scalare tra il vettore della parola centrale e quello del contesto deve essere alto per le coppie viste nel testo. I vettori v che ne escono sono l'embedding.

Perché parole diverse finiscono vicine

Due parole mai viste insieme, ma usate negli stessi contesti, ricevono gli stessi «compagni» durante l'addestramento. La rete le spinge quindi verso la stessa zona dello spazio.

Il BoW avrebbe messo «visore» e «caschetto» in due colonne indipendenti, con similarità 0. L'embedding le avvicina senza che nessuno gli abbia detto che sono sinonimi.

Parte 4 2:38

La matrice di embedding

Ogni colonna è una parola, ogni riga una «caratteristica». Nel nostro esempio, con valori inventati, usiamo 4 righe con un nome per capirci: Digitale, Immersivo, Scolastico, Tascabile.

Nella realtà le dimensioni non hanno un nome. All'inizio i valori sono casuali; una rete neurale li aggiusta leggendo milioni di frasi, finché le parole usate in contesti simili hanno colonne simili.

Cliccate una parola per vedere il suo vettore:
Parte 4 2:42

Le parole come punti nello spazio

Usiamo due dimensioni: digitale in orizzontale e tascabile in verticale. Le parole simili stanno vicine.

In 2D Tablet e Smartphone sono quasi sovrapposti: a separarli è la dimensione Scolastico, che qui non vediamo. È il motivo per cui gli embedding reali hanno centinaia di dimensioni.

Tutti i valori sono inventati a scopo didattico.

Parte 4 2:46

Bag-of-words e word embedding a confronto

Bag-of-wordsWord embedding
Lunghezza del vettorequante parole ha il vocabolarionumero fisso di dimensioni scelto da noi
Valori0/1 o conteggi, quasi tutti zeronumeri reali, tutti diversi da zero
Da dove vengonosi contano, anche a manosi imparano con una rete neurale e molti dati
Significatonessuno: «visore» e «caschetto» sono estraneeparole simili, vettori vicini
Trasparenzaogni numero si spiegale dimensioni non hanno un nome
Quando usarlopochi dati, classificazione, didatticaricerca semantica, traduzione, modelli linguistici

I grandi modelli linguistici di oggi partono proprio da qui: il primo strato trasforma ogni pezzo di testo in un vettore di embedding.

Chiusura 2:50

Sei domande per verificare

0 / 6
Chiusura 2:55

Tre idee da portare a casa

1 · Prima si pulisce

Rumore, minuscolo, token, stopword, stem o lemmi. Ogni passaggio è una scelta che dipende dal compito.

2 · Poi si conta

Vocabolario + presenza o conteggio = una matrice frasi × parole. Da lì possiamo misurare somiglianze e addestrare classificatori.

3 · Contare non è capire

Il BoW perde l'ordine e il significato. Gli embedding recuperano il significato imparandolo dal contesto.

Per approfondire

nltk.org · la libreria Python più usata per iniziare

scikit-learn · Text feature extraction · CountVectorizer e TF-IDF

Google Colab · Python nel browser, senza installare nulla

spaCy · lemmatizzazione e analisi dell'italiano

Grazie. Domande?