Percorso: "Rappresentazione e analisi del testo e dei documenti" UNITA' 4 - Operazioni di base centrate sul lessico SINTESI ... 1. Frequenza delle parole e ricchezza del vocabolario Una prima cosa che possiamo fare, è contare i caratteri, cioè misurare la lunghezza di un testo. Un testo di caratteri Unicode memorizzato su un file in formato UTF-8 occuperà sul disco un mumero di byte di solito superiore al numero dei caratteri, dato che ogni carattere Unicode potrà occupare su disco 1, 2 o 3 byte. Dopo aver "tokenizzato" il testo, cioè dopo averlo segmentato in frasi e in token, possiamo contare i token; il rapporto tra il numero dei token e la lunghezza di un testo ci dà un'informazione non molto interessante, un po' più della lunghezza media delle parole, che di solito è più una caratteristica della lingua che del singolo autore. Un passo ancora consiste nel contare, per ogni token, quanti sono i token uguali ad esso nel testo, cioè il numero delle occorenze (frequenza) della parola che ne rappresenta l'astrazione; ordinando poi questi conteggi per valore crescente o decrescente, otteniamo quella che si chiama una "distribuzione" delle parole nel testo. Ma qui sorge un problema: "Italiano" e "italiano" sono token diversi? Se la distinzione non ci interessa, potremmo "normalizzare" il testo, per esempio trasformando tutte le maiuscole in minuscole e poi ripetere il conteggio. Ma quando si normalizza, si rischia sempre di perdere qualcosa, per esempio di confondere "brindisi" con "Brindisi". Mentre contiamo la frequenza di ciascuna parola, possiamo calcolare il numero di parole diverse; il rapporto tra questo numero e la lunghezza del testo in parole ci dà un'idea della varietà del testo, intesa come ricchezza lessicale. [1] 2. Cooccorrenza di parole Oltre a calcolare la frequenza delle singole parole in un testo o in un corpus, può interessare conoscere la frequenza delle parole in un certo contesto, o la frequenza di certi contesti (associazioni) di parole. Un tipo di analisi classico è lo studio delle "collocazioni", cioè delle combinazioni di 2 o più parole che occorrono nel testo con una frequenza superiore a quella che si potrebbe ipotizzare, a partire dalla frequenza di ciascuna parola, se le parole stesse fossero distribuite nel testo a caso e non tendessero ad associarsi in qualche modo. Per esempio, prescindendo dal genere e dall'autore, è probabile che il digramma (sequenza di due parole) "con il" occorra in Italiano con una frequenza superiore a quella casuale. Similmente, è probabile che l'espressione "efferato delitto" occorra nella cronaca nera di un giornale italiano altrettanto o più spesso che "feroce delitto", anche se l'uso dell'aggettivo "feroce", che in assoluto (= prescindendo dal contesto) è più frequente, non ne cambierebbe sensibilmente il significato; in questo caso la cooccorrenza tra "efferato" e "delitto" è di tipo idiomatico, cioè dovuta ad un uso che si è affermato in parte per imitazione. [1] 3. Lemmatizzazione: il vocabolario Abbiamo già visto un esempio banale di normalizzazione: convertire tutte le maiuscole in minuscole. Un'operazione di normalizzazione un po' più spinta consiste nell'eliminare la "flessione"; cioè nel sostituire ogni token del testo che rappresenta una "declinazione", cioè le forme maschili e femminili, singolari e plurali, di nomi, aggettivi e pronomi, con la voce corrispondente nel vocabolario, detta "lemma": cani -> cane, belle -> bello, ecc. Allo stesso modo possiamo sostituire ogni token che rappresenta la "coniugazione" di un verbo, con la sua forma all'infinito: fu -> essere. Questo tipo di normalizzazione si chiama "lemmatizzazione"; dopo averlo applicato, potremmo ripetere tutti i conteggi del punto precedente: frequenza dei lemmi, distribuzione dei lemmi, ricchezza lessicale come rapporto tra il numero dei lemmi diversi e la lunghezza del testo. Per effettuare la lemmatizzazione si potrebbe pensare di applicare, all'incontrario, un insieme di regole di declinazione e coniugazione, quelle che ogni parlante nativo di una lingua apprende nei primi anni di vita. Ma un computer farebbe un grande numero di errori, non conoscendo le irregolarità e non sapendo tener conto del contesto quanto un bambino; esempio: "cammino" -> "camminare" (in "ti mostro il cammino"), oppure "uomini" -> ? Un modo più efficace di lemmatizzare è utilizzare un "lessico morfologico" (morfologico = delle forme), cioè un vocabolario digitale dove, per ogni lemma, sono enumerate esplicitamente tutte le eventuali forme flesse (declinate o coniugate). Resta un problema di omonimia: lo stesso token potrebbe concidere con più lemmi e/o figurare tra le forme flesse di più lemmi. In tal caso per disambiguare si dovrebbe usare il contesto. E, in effetti, in alcune "catene" di elaborazione del testo, l'operazione di lemmatizzazione può fornire come risultato un insieme di alternative, lasciando agli elementi successivi della catena il compito di scegliere (disambiguare). [4] 4. Categorizzazione delle parole: il lessico morfologico Ma, una volta che facciamo la fatica di costruire a mano (o quasi) un lessico morfologico, conviene approfittarne per associare ad ogni lemma, e ad ogni sua eventuale forma flessa, un codice di classificazione grammaticale, più eventuali numero, genere, tempo, modo, ecc. In inglese il codice viene indicato con il termine POS-TAG, dove "POS" sta per "part of speech" ("parte del discorso") e TAG-SET è l'insieme dei diversi codici a disposizione. Il TAG-SET può comprendere codici che corrispondono a "nome comune", "nome proprio", "preposizione", "articolo determinativo", "preposizione articolata", "verbo ausiliare", "verbo non ausiliare", ecc.; la dimensione del TAG-SET e la finezza della categorizzazione risultante possono essere scelti in modi diversi a seconda dell'obbiettivo che ci si pone e delle risorse di calcolo di cui si dispone: di solito si cerca un compromesso. Inoltre, per costruire un lessico, in generale, e un lessico morfologico in particolare, si parte dall'analisi di un ampio corpus di documenti. A questo punto, conviene calcolare le frequenze delle parole (ovviamente, prima della lemmatizzazione) e arricchire il lessico morfologico con il valore della frequenza di ciascuna parola associata a ciascun lemma. Questa informazione potrà essere molto utile all'elemento che, nella catena di elaborazione del testo, avrà il compito di disambiguare i casi di omonimia. [2][4] 5. Esempi di TAG-SET I tag più comuni usati in un interessante progetto [6] sono i seguenti: ADJ aggettivo ADV avverbio ART articolo ARTPRE preposizione articolata AUX verbo ausiliare CON congiunzione DET determiner (aggettivo determinativo?) NOUN nome comune NPR nome proprio PRE preposizione PRO pronome VER verbo non ausiliare Ogni tag nell'elenco è seguito da una breve descrizione; i tag stessi sono abbreviazioni di categorie lessicali inglesi. Da notare inoltre che: - il tag DET si riferisce ad un ampia classe di aggettivi non qualificativi che precedono (a volte seguono, in Italiano) il nome e che possono essere chiamati quantificatori (dei, alcuni, tutte), dimostrativi (questa, quelle), numerali (una, tre), possessivi, ecc. - i tag sopra elencati rappresentano un primo livello di classificazione, a grana grossa; in un lessico morfologico molti lemmi sono annotati con tag a grana più fine, che includono un secondo livello; per esempio "NOUN-M" e "NOUN-F" distinguono tra nomi maschili e femminili "DET" può essere qualificato come "DET-POSS" (es: altrui), "DET-INDEF" (es: alcune), ecc. "PRO" può essere qualificato come "PRO-NUM" (pronome numerale), "PRO-PERS" (pronome personale), ecc. "CON" può essere qualificato come "CON-coo" o "CON-sub" per distinguere congiunzioni coordinanti e subordinanti - a volte si possono avere ulteriori livelli, come in "DET-NUM-CARD" per numerale cardinale - il TAG-SET completo preso ad esempio include circa 50 tag - infine, oltre che con un tag, articolato in 1, 2 o 3 livelli, un lemma di solito è annotato con un insieme di "feature" (attributi, sfaccettature) che possono riferirsi a numero e genere di un nome o aggettivo, tempo e modo e numero di un verbo, ecc. 6. Il POS-tagging di un testo Abbiamo già visto che un'operazione preliminare all'analisi di un testo è la sua suddivisione in unità di analisi chiamate token. Il passo successivo è quello di annotare ogni token con un POS-TAG. [2] Si tratta di un'operazione più complessa. Anche se disponiamo di un lessico morfologico, in cui ogni forma è già annotata con un POS-TAG, il generico token del testo che stiamo analizzando può essere identico a più forme del lessico, aventi POS-TAG diversi. La frase stessa che precede questa include il trigramma (= sequenza di 3 token) "ogni forma è"; in esso il token "forma" sicuramente sarà presente almeno due volte in un lessico morfologico dell'Italiano: una volta, per esempio, come "lemma: forma; nome comune femminile singolare" e un'altra come "lemma: formare; verbo non ausiliare indicativo presente terza persona singolare". E' allora necessario disambiguare il token; cioè scegliere l'unica forma del lessico che lo descrive correttamente nel suo contesto. Chi conosce bene la lingua in oggetto di solito è in grado di effettuare tale disambiguazione, cioè di riconoscere il ruolo che quel token riveste nella frase. Anzi, uno dei tanti lavori che dei linguisti o degli aspiranti linguisti si possono trovare a svolgere è proprio quello di taggare manualmente un ampio insieme di testi appartenenti ad un corpus. Si comprenderà l'utilità di tale lavoro, ai fini della costruzione di un programma automatico di POS-tagging (POS-tagger) se si tiene conto di alcuni fatti: - sarebbe molto difficile equipaggiare un algoritmo con un insieme di regole che gli consentano di disambiguare tra più forme del lessico morfologico applicando una competenza di tipo sintattico, dato e non concesso che questa possa sempre bastare (...) - in molti compiti di analisi del testo (e non solo), da decenni si applicano con successo crescente tecniche di apprendimento automatico, cioè algoritmi la cui principale competenza è quella di apprendere dagli esempi. Nel nostro caso, gli esempi potrebbero essere forniti da un ampi corpuora di testi che siano stati taggati manualmente da personale esperto, come il corpus WaCKy, sviluppato in parallelo per diverse lingue europee, [5] e La Repubblica Corpus [6]. Quest'ultimo, che comprende numerose annate del quotidiano, fu annotato a mano con l'inserimento dei POS-TAG corretti e di altri attributi per ognuno dei suoi circa 380 milioni di token! In realtà, in entrambi i casi la cosa ha richiesto uno sforzo sensibilmente inferiore grazie ad una strategia di "bootstrapping": si è cominciato con l'annotare solo una porzione minoritaria del corpus; con essa si è addestrato un POS-tagger automatico; con questo si è annotata automaticamente una porzione più ampia del corpus: il primo risultato automatico conteneva una discreta percentuale di errori. Con iterazioni successive si è proceduto a fare delle revisioni manuali delle porzioni del corpus taggate automaticamente, a riaddestrare quindi il POS-tagger con "training set" via via più ampi e affidabili, a rieseguirlo fino a che non si sono ottenuti risultati soddisfacenti, corrispondenti a incrementi di qualità ormai marginali. 7. La densità lessicale Dopo aver fatto il POS-tagging di un testo, calcolarne la cosiddetta densità lessicale potrà sembrare un gioco da ragazzi. La densità lessicale, da non confondere con la ricchezza del vocabolario citata più sopra, viene definita a partire dalla distinzione tra parole lessicali, dette anche parole piene, e parole grammaticali (o funzionali), dette anche parole vuote. Si definiscono parole piene le parole che hanno un significato autonomo in quanto corrispondono a qualcosa o a qualcuno o a un'azione o a una qualità; sono quindi parole piene in Italiano, salvo eccezioni, i nomi, gli aggettivi, gli avverbi e i verbi. Si definiscono parole vuote le parole che non hanno significato autonomo, bensì la funzione di collegare, stabilire relazioni, richiamare, ecc.; sono quindi parole vuote in Italiano i pronomi, gli articoli, le preposizioni semplici e articolate, le congiunzioni e le interiezioni. La densità lessicale di un testo (un documento, un corpus) si definisce come rapporto tra il numero di tokens che costituiscono parole piene ed il numero totale dei token; è quindi un numero sempre maggiore di 0 e minore di 1. E' chiaro che il suo calcolo è facile per un testo POS-tagged, dato che, quale che sia il TAG-SET utilizzato, il tag associato ad ogni token ci dirà se si tratta di un nome, di un aggettivo, di un avverbio o di un verbo. Perché è interessante la densità lessicale? Perché essa è fortemente correlata al tipo di linguaggio. Per esempio, è stato notato che nella lingua parlata "il significato è espresso più dalla grammatica che dal vocabolario": a causa della sua immediatezza il discorso è spesso frammentato, presenta interruzioni e riprese, con ripetizione di parole vuote e una rarefazione di parole lessicali; ha cioè mediamente una bassa densità lessicale. Nella lingua scritta, di solito costruita in modo più ponderato, le parole lessicali occorrono con maggiore frequenza. Studi statistici approfonditi hanno mostrato che i testi scientifici sono mediamente i più densi; secondo qualcuno, spesso lo sono anche troppo e questo li rende ostici al lettore. I testi letterari, mediamente meno densi, presentano significative differenze da autore a autore. Un'ultima osservazione: la nozione di densità lessicale potrebbe essere raffinata superando la netta dicotomia tra parole piene e parole vuote; per esempio considerando il fatto che alcune parole lessicali di uso molto frequente, come "fare" o "cosa", danno alla frase un contenuto informativo piuttosto basso, esse dovrebbero essere considerate meno piene di altre parole (come nel celebre "faccio cose, vedo gente, .." di Nanni Moretti nel film "Ecce bombo" ). E' stato anche proposto di attribuire alle singole parole un indice di densità lessicale inversamente proporzionale alla loro frequenza. [7][8][9] 8. Tool, esempi ed esercizi di analisi a livello lessicale NLTK ... NLTK con Jupyter ... Voyant Tools online ... ACRONIMI NLP - Natural Language Processing RIFERIMENTI (webography) [1] Steven Bird, Ewan Klein, and Edward LoperNatural Language Processing with Python, Chapter 3 - Processing Raw Text, https://www.nltk.org/book/ch03.html [2] Steven Bird, Ewan Klein, and Edward LoperNatural Language Processing with Python, Chapter 5 - Categorizing and Tagging Words,http://www.nltk.org/book/ch05.html [4] Eros Zanchetta and Marco Baroni, Morph-it! A free corpus-based morphological resource for the Italian language, Università di Bologna, http://godzilla.sslmit.unibo.it/~eros/downloads/Morph-it.pdf, 2009 [5] WaCKy Corpora, http://wacky.sslmit.unibo.it/doku.php?id=corpora [6] Introducing the La Repubblica Corpus: A Large, Annotated, TEI(XML)-Compliant Corpus of Newspaper Italian [7] Scuola Primaria Statale “Don Milani”,Percorso di riflessione linguistica,http://www.istitutocomprensivocarpi3.gov.it/wp-content/uploads/2015/04/Il-significato-Parole-piene-e-parole-vuote_-pdf.pdf [8] Domenico Valenza, Densità indicale e lessicale in linguistica, https://www.tesionline.it/appunto/168/60/Densit%C3%A0_indicale_e_lessicale_in_linguistica [9] Dodman M., La densità lessicale: un possibile ostacolo nell'apprendimento del linguaggio scientifico, in Sapere linguistico e sapere matematico. Atti del Convegno Castel San Pietro Terme 2006, http://naturamatematica.blogspot.com/2012/02/la-densita-lessicale-un-possibile.html VOYANT - see through your text (online service), https://voyant-tools.org/ Alyssa Anderson , Digital History Methods, Using Voyant for Text Analysis, http://ricedh.github.io/02-voyant.html Marco Baroni and Stefan Evert, Chapter 39 - Counting Words: An Introduction to Lexical Statistics, The 18th European Summer School in Logic, Language and Information, Málaga, Spain, August 2006, http://sslmit.unibo.it/~baroni/publications/hsk_39_dist_rev2.pdf Stefan Th. Gries, Useful statistics for corpus linguistics, 2010, http://www.linguistics.ucsb.edu/faculty/stgries/research/2010_STG_UsefulStats4CorpLing_MosaicCorpLing.pdf DA WIKIPEDIA Collocation, https://en.wikipedia.org/wiki/Collocation Collocazione, https://it.wikipedia.org/wiki/Collocazione (Cooccorrenza)