Analisi del linguaggio (NLP) e teoria dei chatbot – Prima parte
Il questa serie di articoli parlerò di alcuni metodi per l’analisi del linguaggio naturale in ambito informatico e studieremo alcuni formalismi/linguaggi/tecniche per applicazioni informatiche, come ad esempio i chatbot. Voglio precisare che l’analisi del linguaggio meglio conosciuto anche come NLP (Natural Language Processing) è uno dei settori in maggiore fermento in ambito AI, in quanto le applicazioni derivanti da tali tecnologie e le ricadute nelle nostre vite saranno numerose e pervasive. Da tenere, infatti, sotto osservazione le applicazioni e gli studi in ambito
- Text Generation: attraverso cui è possibile generare testi automatici di senso compiuto.
- Text Classification e Sentiment Analisys: settore della linguistica che sta diventando core in applicazioni quali l’indentificazione di contenuti per la profilazione dei comportamenti.
- Automatic Speech Recognition: (ASR) segmento molto interessante in ambito traduzione simultanea del parlato
- Caption Generation: per la generazione di testi a partire dall’analisi di immagini
- Machine Traslation: tecnica molta usata in ambito traduzione linguistica o creazione di sintesi/riassunti/rassegne stampa.
- Question Answering: settore molto interessante in ambito chatbot in quanto consente di rispondere dinamicamente in linguaggio naturale a domande poste in linguaggio naturale
- Digital Assistant: Assistente digitale con cui interagire in linguaggio naturale per avere supporto su attività di vita quotidiana.
Prima di infilarci in aspetti tecnici e pratici, dobbiamo iniziare ad imparare alcuni concetti e terminologie di base in ambito NLP anche attraverso definizioni formali che ci aiuteranno successivamente a capire meglio il contesto. Quindi non me ne vogliate se vi annoierò con definizioni e concetti astratti. Mi preme precisare che molte delle tecniche, di cui parleremo, sono state in parte sostituite/affiancate in ambito machine learning da metodi che sfruttano in sostanza le reti neurali quali ad esempio le RNN per costruire sistemi in grado di svolgere, ad esempio, attività automatiche di Text Generation, di Question Answering o di Text Classification. Molto interessanti ad esempio il modelli SEQ2SEQ proposti da google, di cui parleremo in altre occasioni.
Bene iniziamo.
Linguistica computazionale
La linguistica computazionale è la scienza che si concentra sullo sviluppo di formalismi descrittivi del funzionamento della lingua naturale, tali che questi si possano trasformare in programmi eseguibili dai computer. I problemi affrontati dalla linguistica computazionale, come si può intuire dal nome stesso della disciplina, consistono nel trovare una mediazione fra un oggetto di studio in costante evoluzione (nel nostro caso il linguaggio umano) e le capacità di comprensione della macchina. Per comprendere le difficoltà che esistono nell’implementare meccanismi di linguistica computazionale adeguati, bisogna comprendere i vari approcci della stessa e distinguere i tre livelli del linguaggio:
- Livello Sintattico
- Livello Semantico
- Livello Pragmatico
e, infine, conoscere le modalità in cui essi sono utilizzati nel formalismo di regole per la definizione di pattern linguistici.
Livello sintattico
Il livello sintattico ha a che vedere con la grammatica di una lingua specifica. Il fatto che la frase italiana: “Domenico è il primo della fila” sia corretta, mentre la frase: “Domenico è primo di fila” non lo sia, riguarda, infatti, la grammatica dell’italiano. Si noti che una frase può essere scorretta ed essere, al contempo, perfettamente comprensibile. D’altra parte, una frase del tutto priva di senso e incomprensibile, come ad esempio: “Il tavolo travalica la costituzionalità”, può essere corretta dal punto di vista grammaticale.
Livello semantico
Il livello semantico concerne il significato delle parole e delle frasi. Ad esempio, la frase “Domenico è il primo della fila” nel paragrafo precedente ha lo stesso significato della frase:”Domenico è in testa alla coda” pur essendo costituita da parole diverse. Ciò che le due frasi hanno in comune è l’idea espressa.
Livello Pragmatico
Quando due esseri umani si parlano, scambiano fra loro messaggi in una lingua di comune conoscenza. La comunicazione, però, va al di là del semplice significato delle frasi. Ad esempio, la frase: “ho caldo” può di volta in volta costituire una semplice affermazione, o una richiesta implicita che qualcuno apra la finestra, o altro ancora. Per capire compiutamente una frase non è quindi sufficiente tener conto del significato delle parole. Occorre anche considerare la situazione in cui la frase viene pronunciata, e la relazione fra chi parla e chi ascolta. Questi problemi investono il livello pragmatico del linguaggio.
Analisi del testo
Quando si vuole avviare un’analisi computazionale di un testo sarà necessario stabilire dei criteri d’identificazione per quella che è la sua unità di base: ovvvero la parola; Cerchiamo di capire, pertanto, un metodo per risolvere il problema dell’anailisi, che tenga in considerazione di tutti e 3 i livelli della linguistica computazionale enunciati, ma prima forniamo un nuovo concetto quello della tripla linguistica.
Notazione N-Triples
Il Resource Description Framwork (RDF) è un formato per la descrizione delle relazioni che intercorrono tra oggetti ed è un formalismo che imposta la definizione del linguaggio solo su relazioni binarie, nelle quali un soggetto ed un oggetto sono messi in relazione tra di loro. La relazione suddetta è chiamata predicato, in quanto dal punto di vista linguistico, spesso la relazione coinvolge un verbo e dal punto di vista logico la relazione si può vedere anche come una funzione f(x,y) a due argomenti. La sequenza: soggetto, predicato, oggetto, viene chiamata tripla. Un esempio potrebbe essere: “Domenico è un uomo”, dove il soggetto è Domenico, l’oggetto è uomo e la relazione tra i due elementi è un valore di tipizzazione. Spesso si utilizza una notazione grafica a grafo orientato per definire le relazioni ma sebbene più intuitiva a volte non semplifica la modellazione pertanto egli esempi a venire faremo un uso ridotto di questa notazione.
Come detto la rappresentazione grafica dell’RDF, anche se intuitiva non semplifica la modellazione pertanto utilizzeremo, in seguiti per i nostri esmepi, una rappresentazione testuale delle informazioni. Un esempio di rappresnetazion serializzazita è quella che descrive la relazione tra elementi in cui ogni frase è modellata esattamente come una tripla: “soggetto-predicato-oggetto”.
Analisi sintattica
Dal punto di vista dell’elaborazione automatica a livello sintattico è possibile analizzare frasi anche complesse, riconoscere la loro correttezza grammaticale, e ricostruire la loro struttura sintattica. Per comprenderne il metodo possiamo far riferimento alla grammatica Chomskiana. Per comprendere in modo semplice il modello usato, possiamo utilizzare come esempio la frase “il poliziotto scorge il ladro”.
1) <frase> → <frase nominale> <frase verbale> 2) <frase nominale> → <articolo> <sostantivo> 3) <frase verbale> → <verbo> <frase nominale> 4) <articolo> → il 5) <sostantivo> → poliziotto 6) <sostantivo> → ladro 7) <verbo> → scorge
I simboli racchiusi fra < > rappresentano categorie sintattiche, ovvero componenti della frase. Gli altri simboli sono simboli terminali, e rappresentano le parole della frase. Una regola del tipo: <x> → <y> <z> asserisce che la categoria sintattica <x> è costituita dalla semplice successione delle categorie <y> e <z> nella frase. Una regola del tipo <x> → y asserisce che la parola y corrisponde alla categoria sintattica <x>. Mediante le 7 regole precedenti si può attribuire, facilemente ad una frase, una struttura sintattica, come si può evincere anche dalla figura successiva. Il metodo è semplice partendo dalla frase principale, essa si scompone in frasi nominali più semplici da cui poi si possono definiree, in definitiva, le attribuzioni specifiche : sostantivo, verbo, articolo.
Analisi semantica
L’implementazione del livello semantico è stato molto più arduo e per la risoluzione del problema potremmo usare un approccio semplificato e ridotto a 2 step di processo, sintetizzato nel seguente modo:
- il significato di una frase si ottiene dal significato delle singole parole, una volta che sia nota la struttura sintattica della frase;
- il significato delle singole parole è definito in un dizionario accessibile automaticamente.
Sebbene lo schema precedente sia semplice dobbiamo affrontare alcuni problemi:
- la stessa parola può avere diversi significati in contesti diversi
- la struttura sintattica di una frase può essere ambigua. In altri termini, alla stessa successione di parole possono a volte essere attribuite diverse strutture.
- ll significato di certe frasi idiomatiche è diverso dal significato letterale che si ottiene componendo i significati delle singole parole.
Si pensi ad esempio ad espressioni come “fare l’indiano” o “gettare la spugna”.
L’IA in genre etenta di risolvere questi problemi utilizzando un’opportuna base di conoscenza a cui il programma di elaborazione del linguaggio è in grado di accedere.
Analisi Pragmatica
La contestualizzazione del significato, nel caso del livello pragmatico, è un meccanismo molto complesso e molto probabilmente oggi resta il problema principale dei sistemi di IA, in quanto la comprensione del significato è strettamente legato al contesto di rappresentazione di certi stati mentali dei nostri interlocutori.
Ad esempio, alla domanda: “sai che ora è?” non rispondiamo “sì” ma ad esempio “sono le dieci e un quarto”; e questo perché riusciamo a capire che chi parla desidera conoscere l’ora, e non informarsi se possediamo un orologio. In altre parole, per dialogare correttamente è necessario rappresentare le intenzioni degli interlocutori, che sono solo parzialmente rispecchiate nelle loro parole.
Tokenizzazione
La tokenizzazione, è l’operazione mediante la quale si suddivide il testo in tokens (elementi singoli), definibile semplicemente come una qualunque sequenza di caratteri delimitata da spazi; tuttavia, tale definizione lascia adito a numerose eccezioni. Pensiamo ad esempio ai segni di punteggiatura, che compaiono attaccati alle parole: l’apostrofo compare di norma in mezzo a due parole diverse che, in virtù della definizione, sarebbero erroneamente identificate come una parola unica. L’ambiguità della punteggiatura costituisce, di fatto, un problema quando dobbiamo identificare l’unità linguistica superiore alla parola, ovvero la frase. Nel caso in cui, ad esempio, si definisca la frase come sequenza di parole separate da spazi, che inizia con una lettera maiuscola e finisce con un punto, la generalizzazione di tale regola non risolve il problema delle eccezioni, come ad esempio l’abbreviazione: “Mr. Tizio” che, in tal caso dividerebbe in frasi distinte.
La tokenizzazione è uno strumento importante in ambito NLP perchè ci consente di analizzare la frase in modo semplificato ad esempio consentendoci di eliminare ad esempio parole inutili, in gergo chiamate stop words, parole che, data la loro elevata frequenza in una lingua, sono di solito ritenute poco significative.
Stringhe ed espressioni regolari
La tokenizzazione si basa su criteri a volte complessi e bisogna tenere conto delle possibili eccezioni. La ricerca di stringhe, cioè sequenze di caratteri che soddisfino certi criteri, è effettuata, all’interno del sistema, per mezzo delle espressioni regolari, notazioni algebriche che descrivono formalmente dei pattern di stringhe. Tramite le ER, è possibile formulare euristiche a struttura condizionale cioè basate sulla verifica di una serie di condizioni.L’esempio che segue mostra un’euristica per individuare il punto come confine di frase.
/\b[a-z]+\.\s+[A-Z]/
Sebbene le espressioni regolari siano un potente strumento per definire euristiche, risultano altresì molto complesse da usare anche per gli addetti ai lavori. In ogn i caso esistono tool che ci concentono di ottener delle tokenizzazioni delle frasi ottimali. In python ad esmepio possiamo usare la libreria nltk ( Natural Language Toolkit )
Embedding
Nella studio del linguaggio dobbiam introduure anche il concettto di similitudine ( sinonimi ad esempio). Per individuare parole simili possono essere introdotti meccanismi di identificazione dei tokens in modo da classificarli ed a raggrupparli in classi secondo un principio di somiglianza reciproca. Un metodo interessante è quello del word embedding, conosciuto anche come rappresentazione distribuita delle parole. Esso permette di memorizzare le informazioni sia semantiche che sintattiche delle parole partendo da un corpus non annotato e costruendo uno spazio vettoriale in cui i vettori delle parole sono più vicini se le parole occorrono negli stessi contesti linguistici, cioè se sono riconosciute come semanticamente più simili.
Vocabolario
La complessità di una frase è legata all’insieme delle parole che la costituiscono, pertanto nell’analisi del testo è stato introdotto un parametro che ne definisce la sua complessità; in tal senso biogna ricordare il concetto di vocabolario di un testo, definito come l’insieme delle parole tipo che ricorrono al suo interno; in tal modo si può dare un’idea della ricchezza lessicale. Nel modello implementativo dovremmo tenere in considerazione delle diverse lunghezze possibili calcolando il rapporto fra i tipi di token raggruppati in base alla loro forma normalizzata e le unità di token (Type token ratio o TTR), sempre comprese fra 0 e 1; pertanto più vicino a 1 è il valore ottenuto, più variato e ricco sarà il testo analizzato. Un altro indice, utilizzato, è il rapporto fra il numero di hapax in esso presenti e la lunghezza del testo, dove per “hapax” s’intendono le parole che ricorrono una volta sola. Studiando, in un testo, questi parametri sarà possibile conosce in che percentuale il testo sia composto da parole “uniche” o da testi molto ripetitivi.
Andamento del vocabolario
Al fine di costruire un modello attendibile del testo è necessario ottenere una distribuzione delle parole nello stesso, al fine di studiare la variazione nel tempo della composizione del lessico, per individuare qualche regolarità statistica che consenta di prevedere la distribuzione finale delle parole, sulla base di osservazioni anche parziali dei dati. Le parole corte sono generalmente più difficili da classificare rispetto alle parole lunghe, pertanto è stato utile indagare come le parole di un testo si distribuiscono se vengono suddivise in base al parametro della lunghezza.
I corpora
Per poter approcciare a quanto introdotto fin ora anche in modo un pò più pratico, posso suggerivi di lavoare su collezioni linguistiche pubbliche di testi, i cosidetti Corpora, strumenti importanti nello sviluppo di tecnologie linguistiche quali la traduzione automatica e il riconoscimento automatico del parlato. Di seguito alcuni link:
I corpora costituiscono oggi la principale fonte di dati per la disciplina e sono classificati in varie tipologie, a seconda dei criteri usati per selezionare i testi che lo compongono. Esistono:
- corpora specialistici, ideati per studiare uno specifico settore della lingua (quello della medicina, della burocrazia ecc.) ecorpora generali, i cui testi vengono selezionati trasversalmente rispetto alle diverse varietà di una lingua, per poterla poi esplorare nel suo insieme;
- corpora di lingua scritta, di lingua parlata o misti;
- corpora monolingue o multilingue;
- corpora sincronici, i cui testi appartengono tutti a uno stesso momento nel tempo, e “corpora diacronici”, comprendenti testi appartenenti a periodi differenti;
- corpora annotati e non.
I corpora annotati, oggi sempre più diffusi e sono quelli in cui vengono codificate informazioni sulla struttura linguistica del testo a vari livelli (sintattico, semantico ecc.), di fatto quelli usati nel test.
Metalinguaggio per la costruzione di Euristiche
Uno dei punti fondamentali nella linguistica computazionale è ovviamente la ricaduta pratica e la sua applicabilità in contesti di produzione. Nei prossimi articoli parleremo di varie metodolgie per implementare e trattare il linguaggio naturale. In prima istanza parlermo dell’AIML e successivamente di metodi di analisi del linguaggio basati su Deep Learning.
Per il momento vi lascio in compagnia di un mio alter ego digitale.
prossimo articolo >>
Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .
Attualmente ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.
Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.
Comments