Nell’articolo precedente NLP: una guida completa [parte 1], abbiamo introdotto cos’è l’elaborazione del linguaggio naturale (NLP) e in quali campi applicativi i modelli generati vengono utilizzati. Molti utenti, comprese alcune aziende, li usano senza conoscere a pieno il loro funzionamento poiché i risultati ottenuti sono più che soddisfacenti in molti casi. Per sfruttarli al meglio, però, è necessario conoscere le basi di come il linguaggio naturale viene processato da questi sistemi.
In questo articolo analizzeremo proprio questi aspetti, partendo dall’elaborazione del testo fino ad esplorare le principali tecniche utilizzate in questo contesto.
Come funziona l’elaborazione del linguaggio naturale (NLP)?
I modelli NLP funzionano trovando relazioni tra le parti costitutive del linguaggio, ossia le lettere, le parole e le frasi presenti in un insieme di dati testuali. Le architetture NLP utilizzano vari metodi per la preelaborazione dei dati, l’estrazione delle caratteristiche e la modellazione. Di seguito vi introdurremo le principali tecniche utilizzate.
Preelaborazione dei dati
Prima che un modello elabori un testo per un compito specifico, spesso il testo deve essere preprocessato per migliorare le prestazioni del modello o per trasformare parole e caratteri in un formato comprensibile al modello stesso. L’IA incentrata sui dati è un movimento in crescita che dà priorità alla preelaborazione dei dati. Per la preelaborazione dei dati si possono utilizzare varie tecniche illustrate di seguito.
Stemming e lemmatization
Lo stemming è un processo informale di conversione delle parole nelle loro forme base utilizzando regole euristiche. Ad esempio, ” university”, ” universities” e “university’s” possono essere mappati sulla forma base “univers”. La lemmatizzazione è un modo più formale di trovare le radici analizzando la morfologia di una parola utilizzando il vocabolario di un dizionario. Lo stemming e la lemmatizzazione sono fornite da librerie come spaCy e NLTK.
Segmentazione delle frasi
Questa tecnica suddivide un testo di grandi dimensioni in unità di frase linguisticamente significative. Questo è ovvio in lingue come l’inglese, dove la fine di una frase è segnata da un punto, ma non sempre è così scontato. Un punto può essere usato sia per contrassegnare un’abbreviazione sia per terminare una frase e, in questo caso, il punto dovrebbe far parte del token dell’abbreviazione stessa. Il processo diventa ancora più complesso nelle lingue, come il cinese antico, che non hanno un delimitatore che segna la fine di una frase.
Rimozione delle stop word
In questa fase si rimuovono le parole più frequenti che non aggiungono molte informazioni al testo. Ad esempio, gli articoli, le congiunzioni e le preposizioni.
Tokenization
La tokenizzazione divide il testo in singole parole e frammenti di parole. Il risultato consiste generalmente in un indice di parole e in un testo tokenizzato in cui le parole possono essere rappresentate come token numerici da utilizzare in vari metodi di deep learning. Un metodo che indica ai modelli linguistici di ignorare i token non importanti può migliorare l’efficienza.
Estrazione delle caratteristiche
La maggior parte delle tecniche convenzionali di apprendimento automatico lavora sulle caratteristiche (generalmente numeri che descrivono un documento in relazione al corpus che lo contiene) create da Bag-of-Words, TF-IDF, o da caratteristiche generiche come la lunghezza del documento, la polarità delle parole e i metadati (ad esempio, se il testo ha tag o punteggi associati). Tecniche più recenti includono Word2Vec, GLoVE e l’apprendimento delle caratteristiche durante il processo di formazione di una rete neurale.
Bag-of-Words
Questa tecnica conta il numero di volte in cui ogni parola o n-gramma (combinazione di n parole) appare in un documento. Ad esempio, il modello Bag-of-Words crea una rappresentazione numerica del set di dati in base al numero di parole presenti nel documento.
TF-IDF
Mentre nel Bag-of-Words, contiamo le occorrenze di ogni parola o n-gramma in un documento, con il TF-IDF pesiamo ogni parola in base alla sua importanza. Per valutare l’importanza di una parola, si considerano due elementi:
- Frequenza dei termini: Quanto è importante la parola nel documento?
TF(parola in un documento)= Numero di occorrenze di quella parola nel documento / Numero di parole nel documento
- Frequenza inversa del documento: Quanto è importante il termine nell’intero corpus?
IDF(parola nel corpus)=log(numero di documenti nel corpus / numero di documenti che includono la parola)
Una parola risulta importante se ricorre molte volte in un documento. Ma questo crea un problema. Parole come “a” e “il” compaiono spesso. Per questo motivo, il loro punteggio TF sarà sempre alto. Per risolvere questo problema si possono eliminare dal documento mediante la rimozione delle stop words e anche utilizzando l’Inverse Document Frequency. Questa misura sarà alta se la parola è rara, mentre assumerà valori bassi se la parola è comune nel corpus. Il punteggio TF-IDF di un termine è il prodotto di TF e IDF.
Word2Vec
Introdotto nel 2013, utilizza una rete neurale di tipo vanilla per apprendere gli embedding di parole ad alta dimensionalità dal testo grezzo. È disponibile in due varianti:
- Skip-Gram: si cerca di prevedere le parole circostanti in base a una parola target
- Continuous Bag-of-Words (CBOW): cerca di prevedere la parola target dalle parole circostanti.
Dopo aver scartato l’ultimo strato dopo l’addestramento, questi modelli prendono in input una parola e producono un embedding di parola che può essere utilizzato come input per molti compiti di NLP. Gli embedding di Word2Vec catturano il contesto. Se determinate parole appaiono in contesti simili, i loro embedding saranno simili.
GLoVE
Come Word2Vec apprende gli embedding di parole, ma lo fa utilizzando tecniche di fattorizzazione matriciale piuttosto che di apprendimento neurale. Il modello GLoVE costruisce una matrice basata sul conteggio globale delle co-occorrenze tra parole.
Modellazione
Dopo aver preelaborato i dati, questi vengono inseriti in un’architettura NLP che li modella per svolgere una serie di compiti. Le caratteristiche numeriche estratte dalle tecniche descritte in precedenza possono essere inserite in vari modelli, a seconda del compito da svolgere. Ad esempio, per la classificazione, l’output del vettorizzatore TF-IDF può essere fornito alla regressione logistica, a naive Bayes, agli alberi decisionali o agli alberi gradient boosted. Diversamente, per il riconoscimento dell’entità, si possono usare modelli di Markov insieme agli n-grammi.
Le Deep neural networks in genere funzionano senza l’utilizzo di caratteristiche estratte, anche se è possibile utilizzare caratteristiche TF-IDF o Bag-of-Words come input.
Nei modelli linguistici l’obiettivo di un modello linguistico è quello di prevedere la parola successiva quando viene dato un flusso di parole in ingresso. I modelli probabilistici che utilizzano l’ipotesi di Markov ne sono un esempio:
P(Wn)=P(Wn|Wn-1)
Per creare questi modelli linguistici si utilizza anche il deep learning. Questi modelli prendono in input un embedding di parole e, a ogni stato temporale, restituiscono la distribuzione di probabilità della parola successiva come probabilità per ogni parola del dizionario. I modelli linguistici pre-addestrati imparano la struttura di una particolare lingua elaborando un corpus di grandi dimensioni, come Wikipedia. Possono poi essere messi a punto per un compito particolare. Ad esempio, BERT è stato messo a punto per compiti che vanno dal fact-checking alla scrittura di titoli di giornale.
Le principali tecniche di elaborazione del linguaggio naturale
La maggior parte dei compiti di NLP discussi in precedenza può essere modellata mediante alcune tecniche generali. Queste tecniche possono essere classificate in due categorie:
- Metodi tradizionali di apprendimento automatico
- Metodi di deep learning
Tecniche tradizionali di apprendimento automatico
In questa categoria troviamo le seguenti tecniche:
- Regressione logistica
- Naive Bayes
- Alberi decisionali
- Latent Dirichlet Allocation (LDA)
- Hidden Markov models
Di seguito introduciamo le loro caratteristiche principali.
Regressione logistica
La regressione logistica è un algoritmo di classificazione supervisionato che mira a prevedere la probabilità che un evento si verifichi in base ad alcuni input. In NLP, i modelli di regressione logistica possono essere applicati per risolvere problemi come la sentiment analysis, il rilevamento dello spam e la classificazione della tossicità.
Naive Bayes
È anch’esso un algoritmo di classificazione supervisionato che calcola la distribuzione di probabilità condizionale P(etichetta | testo) utilizzando la seguente formula di Bayes:
P(etichetta | testo) = P(etichetta) x P(testo|etichetta) / P(testo)
e predice in base a quale distribuzione congiunta si ha la probabilità più alta. L’ipotesi del modello Naive Bayes è che le singole parole siano indipendenti. Quindi:
P(testo|etichetta) = P(parola_1|etichetta)*P(parola_2|etichetta)*...P(parola_n|etichetta)
In NLP, questi metodi statistici possono essere applicati per risolvere problemi come il rilevamento di spam o la ricerca di bug nel codice del software.
Alberi decisionali
Gli alberi decisionali sono una classe di modelli di classificazione supervisionati che suddividono il set di dati in base a diverse caratteristiche per massimizzare il guadagno di informazioni in tali suddivisioni. Nella figura seguente vi riportiamo un esempio di albero decisionale. La loro struttura è molto semplice e altamente interpretabile in quanto i nodi impongono delle condizioni sulle caratteristiche dei dati per determinare la classe di appartenenza.
Latent Dirichlet Allocation (LDA)
LDA modella un documento come una collezione di argomenti e un argomento come una collezione di parole. È un approccio statistico utilizzato principalmente per la modellazione degli argomenti trattati in un documento. L’intuizione alla base è che possiamo descrivere qualsiasi argomento utilizzando solo un piccolo insieme di parole del corpus.
Hidden Markov models
I modelli di Markov sono modelli probabilistici che decidono lo stato successivo di un sistema in base allo stato attuale. Ad esempio, in NLP, potremmo suggerire la parola successiva in base alla parola precedente. Possiamo modellare questo come un modello di Markov in cui possiamo trovare le probabilità di transizione da parola1 a parola2, cioè P(parola1|parola2). Poi possiamo usare il prodotto di queste probabilità di transizione per trovare la probabilità di una frase.
L’Hidden Markov Model (HMM) è una tecnica di modellazione probabilistica che introduce uno stato nascosto nel modello di Markov. Uno stato nascosto è una proprietà dei dati che non viene osservata direttamente. Gli HMM sono utilizzati per il part-of-speech (POS) tagging, dove le parole di una frase sono gli stati osservati e i tag POS sono gli stati nascosti. L’HMM aggiunge un concetto chiamato probabilità di emissione: la probabilità di un’osservazione data da uno stato nascosto. Nell’esempio precedente, si tratta della probabilità di una parola, dato il suo tag POS. Gli HMM presuppongono che questa probabilità possa essere invertita: data una frase, possiamo calcolare il tag part-of-speech di ogni parola basandoci sia sulla probabilità che una parola abbia un certo tag part-of-speech, sia sulla probabilità che un particolare tag part-of-speech segua il tag part-of-speech assegnato alla parola precedente. In pratica, questo problema viene risolto utilizzando l’algoritmo di Viterbi. Nella figura successiva mostriamo un possibile Hidden Markov Model.
Tecniche di deep learning
A questa categoria appartengono, invece, le seguenti tecniche:
- Rete neurale convoluzionale (CNN)
- Rete neurale ricorrente (RNN)
- Autoencoder
- Encoder-decoder sequence-to-sequence
- Transformers
Di seguito illustriamo le loro caratteristiche.
Rete neurale convoluzionale (CNN)
L’idea di utilizzare una CNN per classificare il testo è stata presentata per la prima volta nell’articolo “Convolutional Neural Networks for Sentence Classification” di Yoon Kim. L’intuizione centrale è quella di vedere un documento come un’immagine. Tuttavia, invece di pixel, l’input è costituito da frasi o documenti rappresentati come una matrice di parole. In figura una rappresentazione grafica dell’intuizione delle CNN.
Rete neurale ricorrente (RNN)
Molte tecniche di classificazione del testo che utilizzano il deep learning elaborano le parole in stretta prossimità utilizzando n-grammi o una finestra (CNN). Sono in grado di vedere “New York” come una singola istanza. Tuttavia, non riescono a cogliere il contesto fornito da una particolare sequenza di testo. Non imparano la struttura sequenziale dei dati, in cui ogni parola dipende dalla parola precedente o da una parola della frase precedente. Le RNN, invece, ricordano le informazioni precedenti utilizzando gli stati nascosti e le collegano al compito corrente. Le architetture note come Gated Recurrent Unit (GRU) e long short-term memory (LSTM) sono tipi di RNN progettati per ricordare le informazioni per un periodo prolungato. Inoltre, la LSTM/GRU bidirezionale conserva le informazioni contestuali in entrambe le direzioni, il che è utile nella classificazione dei testi. Le RNN sono state utilizzate anche per generare prove matematiche e tradurre i pensieri umani in parole. In figura una loro rappresentazione.
Autoencoder
Gli autoencoder sono encoder-decoder di deep learning che approssimano una mappatura da X a Y, cioè input=output. Prima comprimono le caratteristiche dell’input in una rappresentazione a bassa dimensione (talvolta chiamata codice latente, vettore latente o rappresentazione latente) e imparano a ricostruire l’input. Il vettore di rappresentazione può essere usato come input per un modello separato, quindi questa tecnica può essere usata per ridurre la dimensionalità. In Figura vi riportiamo la logica alla base di questa tecnica.
Tra gli specialisti di molti altri campi, i genetisti hanno applicato gli autoencoder per individuare mutazioni associate a malattie nelle sequenze di aminoacidi.
Encoder-decoder sequence-to-sequence
L’architettura encoder-decoder seq2seq è un adattamento agli autoencoder specializzati per la traduzione, il riassunto e compiti simili. L’encoder incapsula le informazioni di un testo in un vettore codificato. A differenza di un autoencoder, invece di ricostruire l’input dal vettore codificato, il compito del decoder è quello di generare un diverso output desiderato, come una traduzione o un riassunto. In Figura una rappresentazione di un modello per la traduzione di testi.
Transformers
Questa architettura è stata descritta per la prima volta nell’articolo del 2017 “Attention Is All You Need” (Vaswani, Shazeer, Parmar, et al.). Il trasfromer rinuncia alla ricorrenza e si affida interamente a un meccanismo di autoattenzione per tracciare le dipendenze globali tra input e output. Poiché questo meccanismo elabora tutte le parole contemporaneamente (anziché una alla volta), riduce la velocità di addestramento e il costo di inferenza rispetto alle RNN, soprattutto perché è parallelizzabile. Nella Figura seguente vi mostriamo l’architettura di un trasformer.
L’architettura transformer ha rivoluzionato l’NLP negli ultimi anni, portando a modelli come BLOOM, Jurassic-X e Turing-NLG. È stata inoltre applicata con successo a una serie di compiti di visione diversi, tra cui la creazione di immagini 3D.