Una introduzione
Codificare, Analizzare, Diffondere: Le Digital Humanities nei progetti di ricerca
Scuola estiva · Università di Verona
18 luglio 2019
Twitter: #cadottorato19
Greta H. Franzini
Natural Language Processing
(NLP)
Processo di elaborazione automatica di informazioni scritte o parlate in una lingua naturale
Moderne
Antiche
TAL + umanista
meccanica | + | interpretazione |
innovazione | + | tradizione |
Informazioni scritte
Il TAL si avvale di risorse linguistiche = raccolte di dati che documentano atti comunicativi umani
l'analisi testuale è complessa
dividere il task di analisi in piccoli subtask risolvibili in modo indipendente da diversi specialisti
Pipeline : modo di progettare un software per cui i risultati di un subtask o modulo alimentano il modulo successivo
One size does not fit all : diverse pipeline per diverse esigenze
Garbage in, garbage out
It is often said that 80% of data analysis is spent on the process of cleaning and preparing the data [...]. Data preparation is not just a first step, but must be repeated many times over the course of analysis as new problems come to light or new data is collected.Hadley Wickham, 2014
Formato richiesto:
Suddivisione del testo in token , i.e. unità di analisi:
caratteri, parole, frasi, etc.
Solitamente tokenizzazione per parola
Token ≠ parola
"mangiarmelo"
=
1 token, 3 parole morfologiche
"Se oggi seren non è doman seren sarà se non sarà seren si rasserenerà"
Token: 14 Type: 9
Hmmm...
"La Spezia"
1 o 2 token?
U.S.A. · ad hoc · Milano-Verona · l’onda · 18.07.2019
Normalizzazione
PoS-tagging : etichettatura linguistica (PoS = Part of Speech)
Lemmatizzazione : riduzione di una forma flessa di una parola alla sua forma canonica, detta lemma (previo PoS-tagging)
Tagset : insieme chiuso (set) di etichette (tag) delle parti del discorso usato per annotare il testo (in alcuni casi fino a 200!)
Diversi tagset
=Standard : Universal Dependencies
Metodi
Diversi modelli e tagset
"I sensali schioccavan le fruste;"
(Adolfo Albertazzi, Il camiciotto rosso, 1918)
TreeTagger Stein - 38 tag
I DET:def il
sensali NOM sensale
schioccavan VER:impf schioccare
le DET:def il
fruste NOM frusta
; PON ;
TreeTagger Baroni - 52 tag
I ART il
sensali NOUN sensale
schioccavan VER:fin schioccare
le ART la
fruste NOUN frusta
; PUN ;
Ambiguità
TreeTagger (Stein)
alcuni PRO:indef alcun|alcuni
TreeTagger (Baroni)
alcuni DET:indef alcun
Unknown
Possibili motivi : token non riconosciuto, tokenizzazione problematica, sporcizia nel testo (e.g., OCR), ...
TreeTagger (Stein)
"l' ombra del giqante"
l VER:impe <unknown>
' PON '
ombra NOM ombra
del PRE:det del
giqante NOM <unknown>
"l'ombra del gigante"
l' DET:def il
ombra NOM ombra
del PRE:det del
gigante NOM gigante
Omografia
Un lemma può avere più PoS
TreeTagger (Stein). Fuori contesto:
"faccia"
faccia NOM faccia
Omografia
TreeTagger (Stein). In contesto:
"Ha una brutta faccia "
Ha VER:pres avere
una DET:indef una
brutta ADJ brutto
faccia NOM faccia
"Non so come lei faccia "
Non ADV non
so VER:pres sapere
come CON come
lei PRO:pers lei
faccia VER:cpre fare
Omografia
TreeTagger (Stein). Attenzione però! Sempre in contesto:
"Non so come faccia "
Non ADV non
so VER:pres sapere
come PRE come
faccia NOM faccia
Omografia
TreeTagger (Stein). E ancora in contesto:
"non so con che faccia faccia questa domanda"
non ADV non
so VER:pres sapere
con PRE con
che PRO:rela che
faccia VER:cpre fare
faccia VER:cpre fare
questa PRO:demo questo
domanda VER:pres domandare
Performance
Alcuni strumenti e modelli più performanti di altri
TreeTagger (Stein)
finché CON finché
finchè CON finchè
TreeTagger (Baroni)
finché CON finché
finchè VER:fin <unknown>
Un tagger addestrato su Petrarca non è adatto all'analisi di italiano contemporaneo e viceversa
PoS-tagging può estendersi ai tratti morfologici
L'analisi morfologica assegna tratti morfologici alle forme:
Processo di identificazione o estrazione di entità volto a trovare e classificare ogni elemento presente in un testo in categorie predefinite, e.g., persone, organizzazioni, luoghi, eventi, quantità, valute monetarie, percentuali, etc.
Si avvale di tokenizzazione, POS tagging, regole per l’uso delle maiuscole e altre funzioni TAL.
Analisi delle dipendenze fra parole e della struttura della frase
Il parsing viene effettuato da un parser
Parser sintattico si avvale di dati annotati o treebank = corpus annotato a livello sintattico. Solitamente include:
Treebank di due tipi
A costituenti A dipendenze
Processo di assegnazione di un significato, un senso, alla struttura sintattica corretta e, di conseguenza, all'espressione linguistica.
Parsing semantico comincia con l'analisi delle relazioni fra parole. Questo richiede una conoscenza di:
Esempi di parsing semantico:
Come siamo messi?
...non benissimo... perché?
Perché i dati (annotati) non sono accessibili = non si possono addestrare altri modelli o strumenti di analisi!
Nota anche come "terminale" in sistemi Unix.
Una console o interfaccia utente per impartire comandi di elaborazione alla macchina
Perché usarla?
Ai fini di TAL, e.g.:
Quanti Windows e quanti Mac/Linux?
Controllo installazioni
File di testo forniti per esercitazioni (2 e 3):
D'ora in poi ci si riferirà alla linea di comando come CLI
Apri la CLI
Present working directory: pwd
greta$ pwd
Mostra la mia posizione attuale
greta$ pwd
/Users/greta
greta$ ls -l
Mostra la lista dei contenuti della directory attuale
$ total 352
drwx------@ 6 greta staff 204 22 Dic 2018 Applications
drwx------+ 17 greta staff 578 23 Giu 15:03 Desktop
drwx------+ 5 greta staff 170 13 Gen 15:27 Documents
drwx------+ 19 greta staff 646 23 Giu 13:55 Downloads
...
Cambia directory: cd <directory>
greta$ cd Desktop
Mi sposto sul Desktop
Desktop greta$
Cambia alla directory precedente: cd ..
Desktop greta$ cd ..
Mi riporta a greta
greta$
Cambia directory, azzera: cd
Sono qui
/Users/greta/Desktop/cad/corpus-italian-shortstories
Voglio tornare alla directory greta
corpus-italian-shortstories$ cd
greta$
Crea un file: touch <file.txt>
$ cd Desktop
Desktop greta$ touch ciao.txt
Mi crea un file di testo intitolato ciao.txt
Desktop greta$ ls -l
-rw-r--r-- 1 greta staff 0 23 Giu 21:24 ciao.txt
...
Crea una cartella: mkdir <cartella>
$ cd Desktop
Desktop greta$ mkdir poesie
Mi crea una cartella intitolata poesie
Desktop greta$ ls -l
drwxr-xr-x 2 greta staff 68 23 Giu 21:37 poesie
...
Rinomina un file: mv oldname.txt newname.txt
greta$ mv ciao.txt CIAO.txt
o una cartella: mv oldname newname
greta$ mv poesie PROSA
Elimina un file: rm file.txt
greta$ rm ciao.txt
o una cartella: rmdir foldername
greta$ rmdir poesie
Fai una copia di un file in un'altra directory:
cp filename.txt foldername
greta$ cp ciao.txt poesie
Per ripulire lo schermo:
clear
greta$ clear
Nota come Type/Token Ratio (TTR)
Qualche idea su come si faccia?
(Types/Tokens) * 100 = N%
Più alta la ratio, più ricco il lessico
Nella CLI, spostati nella directory dove sono stati scaricati i due file di testo e apri il file:
cat cantu_due-alchimisti-italiani_1878.txt
greta$ cat cantu_due-alchimisti-italiani_1878.txt
Minuscolizza tutto il testo:
tr '[:upper:]' '[:lower:]'
greta$ cat cantu_due-alchimisti-italiani_1878.txt | tr '[:upper:]' '[:lower:]'
Trasforma la punteggiatura in un ritorno a capo:
tr '[:punct:]' '\n'
greta$ cat cantu_due-alchimisti-italiani_1878.txt | tr '[:upper:]' '[:lower:]' | tr '[:punct:]' '\n'
Trasforma gli spazi in un ritorno a capo:
tr '[:space:]' '\n'
greta$ cat cantu_due-alchimisti-italiani_1878.txt | tr '[:upper:]' '[:lower:]' | tr '[:punct:]' '\n' | tr '[:space:]' '\n'
Rimuovi tutte le righe vuote:
sed '/^\s*$/d'
greta$ cat cantu_due-alchimisti-italiani_1878.txt | tr '[:upper:]' '[:lower:]' | tr '[:punct:]' '\n' | tr '[:space:]' '\n' | sed '/^\s*$/d'
Salva i risultati in un nuovo file:
> cantu_due-alchemisti-italiani_1878.txt.tokens
greta$ cat cantu_due-alchimisti-italiani_1878.txt | tr '[:upper:]' '[:lower:]' | tr '[:punct:]' '\n' | tr '[:space:]' '\n' | sed '/^\s*$/d' > cantu_due-alchemisti-italiani_1878.txt.tokens
Calcola il numero totale di token:
wc -l cantu_due-alchemisti-italiani_1878.txt.tokens
greta$ wc -l cantu_due-alchemisti-italiani_1878.txt.tokens
Apri il file dei tokens:
cat cantu_due-alchimisti-italiani_1878.txt.tokens
cat cantu_due-alchimisti-italiani_1878.txt.tokens
Ordina i token alfabeticamente:
sort
cat cantu_due-alchimisti-italiani_1878.txt.tokens | sort
Rimuovi i duplicati:
uniq -c
cat cantu_due-alchimisti-italiani_1878.txt.tokens | sort | uniq -c
Salva i risultati in un nuovo file:
> cantu_due-alchimisti-italiani_1878.txt.types
cat cantu_due-alchimisti-italiani_1878.txt.tokens | sort | uniq -c > cantu_due-alchimisti-italiani_1878.txt.types
Calcola il numero totale di type:
wc -l cantu_due-alchemisti-italiani_1878.txt.types
greta$ wc -l cantu_due-alchemisti-italiani_1878.txt.types
Calcola la TTR:
(Types/Tokens) * 100 = N%
Ripeti l'esercizio per
albertazzi_il-mondo_1940.txt
MAC, Linux e Windows:
Posizionarsi in Desktop/treetagger .
Poi, in MAC e Linux:
Per taggare un testo con parametro Stein:
treetagger greta$ cat testo.txt | cmd/tree-tagger-italian > testo.tagged
Per taggare un testo con parametro Baroni:
treetagger greta$ cat testo.txt | cmd/tree-tagger-italian2 > testo.tagged
Per taggare un testo con parametro Dhante:
treetagger greta$ cat testo.txt | cmd/tree-tagger-italian-dhante > testo.tagged
In Windows (Command Prompt):
Sostituire cat con type :
treetagger greta$ type testo.txt | cmd/tree-tagger-italian > testo.tagged
Sull' output di TreeTagger:
Iniziativa dell'Associazione Italiana di Linguistica Computazionale (AILC) volta alla valutazione di strumenti NLP per l'italiano
Italiano delle origini
Windows | Descrizione | Mac/Linux |
dir |
Mostra contenuti | ls |
cd |
Mostra posizione attuale | pwd |
cd path/to/directory |
Cambio directory | cd path/to/directory |
cd.. |
Indietro di una directory | cd .. |
cd |
Torna alla root directory | cd / |
mkdir nuovaCartella |
Crea una nuova cartella | mkdir nuovaCartella |
echo some-text > fileName(.txt) |
Crea un nuovo file | touch fileName(.txt) |
rmdir myFolder |
Rimuovi una cartella* | rmdir myFolder |
ren oldFolderName newFolderName |
Rinomina una cartella | mv oldFolderName newFolderName |
robocopy myFolder path/to/destination/directory |
Copia una cartella | cp -r myFolder path/to/destination/directory |
move myFolder path/to/destination/directory |
Sposta una cartella | mv myFolder path/to/destination/directory |
del myFile |
Rimuovi un file* | rm myFile |
ren oldFileName newFileName |
Rinomina un file | mv oldFileName newFileName |
copy myFile path/to/destination/directory |
Copia un file | cp myFile path/to/destination/directory |
move myFile path/to/destination/directory |
Sposta un file | mv myFile path/to/destination/directory |
cls |
Pulisci la schermata | clear |
type |
Apri un file | cat |
type C:/../myFile.txt| find "" /v /c |
Conta righe di un file | wc -l myFile(.txt) |
*ATTENZIONE: il comando di rimozione NON chiede conferma all'utente.