Guida pratica alla correzione di lemmatizzazione e POS-tagging del KIParla
1. Contesto del lavoro
Il tuo compito non è annotare da zero, ma:
-
partire da un file già lemmatizzato e POS-taggato automaticamente;
-
verificare e correggere manualmente lemma e POS quando necessario;
-
seguire in modo coerente le linee guida di Universal Dependencies (UD).
L’obiettivo è migliorare la qualità dell’annotazione, soprattutto nei casi tipici dell’italiano parlato.
2. Riferimenti fondamentali (da consultare spesso)
Framework generale - Universal Dependencies:
Ci basiamo sul framework Universal Dependencies (UD), che fornisce:
-
un insieme standard di parts of speech (POS);
-
regole di annotazione morfosintattica;
-
linee guida per la lemmatizzazione.
Universal Dependencies è un progetto per creare treebank annotati comparabili tra lingue. I principali concetti:
-
Lemma: forma di base di una parola (es. andare per andavo);
-
POS tag: categoria grammaticale (es. VERB, NOUN, ADJ, …);
-
Morfologia: attributi aggiuntivi (numero, genere, tempo, modo, …). NB. per ora non la annotiamo!
Risorse utili:
3. Dal file EAF al formato verticale
I file sorgente del KIParla sono in formato .eaf, il formato nativo di ELAN.
Internamente un EAF è un file XML: ogni blocco di trascrizione corrisponde a un tag <ALIGNABLE_ANNOTATION> con timestamp di inizio/fine e il testo trascritto.
<ALIGNABLE_ANNOTATION ANNOTATION_ID="a42" TIME_SLOT_REF1="ts83" TIME_SLOT_REF2="ts84">
<ANNOTATION_VALUE>mi chiamo rossi, anna: giulia</ANNOTATION_VALUE>
</ALIGNABLE_ANNOTATION>
Questo formato è comodo per lavorare in ELAN, ma non è adatto all’analisi linguistica: il testo è una stringa continua, i simboli Jefferson (prolungamenti, sovrapposizioni, intonazione…) sono mescolati alle parole, e non c’è modo di cercare per lemma o parte del discorso.
La verticalizzazione
Per rendere il corpus interrogabile, i file EAF vengono convertiti in un formato verticale (.vert.tsv): ogni parola occupa una riga, e le informazioni che in Jefferson erano simboli inline diventano colonne separate.
| Colonna | Contenuto |
|---|---|
|
Identificatore unico del token (unità-posizione, es. |
|
Codice del parlante (es. |
|
Indice dell’unità di trascrizione (turno) |
|
La trascrizione originale, con notazione Jefferson intatta (es. |
|
La forma ortografica ripulita dai simboli prosodici (es. |
|
Forma citazionale — da completare/correggere |
|
Parte del discorso UD — da completare/correggere |
|
Feature prosodiche estratte (es. |
Per esempio, il blocco EAF sopra diventa:
| token_id | speaker | tu_id | span | form | lemma | upos | jefferson_feats |
|---|---|---|---|---|---|---|---|
4-0 |
BO020 |
4 |
|
mi |
mi |
PRON |
_ |
4-1 |
BO020 |
4 |
|
chiamo |
chiamare |
VERB |
_ |
4-2 |
BO020 |
4 |
|
rossi |
Rossi |
PROPN |
Intonation=WeaklyRising |
4-3 |
BO020 |
4 |
|
anna |
Anna |
PROPN |
_ |
4-4 |
BO020 |
4 |
|
giulia |
Giulia |
PROPN |
_ |
Il ruolo della lemmatizzazione in questo processo
Il formato verticale viene prodotto automaticamente. Le colonne lemma e upos vengono pre-compilate da un parser statistico, ma il parser fa errori — in particolare sull’italiano parlato (prima persona dei verbi, nomi propri, interiezioni, parole troncate).
Il tuo compito è correggere queste due colonne. Una volta corrette, le informazioni vengono integrate nel corpus e rendono possibile cercare per lemma o per parte del discorso in NoSketchEngine.
4. File di lavoro (Excel / CSV)
Il lavoro principale si svolge su un file excel ma alla fine della correzione l’informazione verrà trasportata nel formato standard delle UD, ovvero CoNLL-U
I file sono in formato tabulare (TSV) e contengono almeno:
-
forma (token così come appare nel parlato);
-
lemma;
-
POS tag UD.
Del nostro file di lavoro ci interessano principalmente le colonne:
-
token_id: identificatore unico del token -
span: la trascrizione originale (notazione Jefferson) -
form: la trascrizione in versione ortografica (senza simboli prosodici) -
lemma -
upos -
jefferson_feats: attributi prosodici aggiuntivi (di solito non va toccata, tranne per code switching — vedi Code switching e dialetto)
Il sistema degli ID token
Ogni token ha un token_id unico che codifica l’unità di trascrizione e la posizione all’interno di essa.
Gli ID devono rimanere unici all’interno del file: lo script di integrazione li usa per collegare lemma/POS ai file sorgente
-
Token divisi (preposizioni articolate, clitici): usa il formato
5-7a/5-7bper i sotto-token. -
Token aggiunto (parola saltata in trascrizione): usa il primo ID numerico non ancora assegnato nell’unità (es. se l’unità
8ha token8-0–8-4, aggiungi8-5). L’importante è che l’ID non esista già nel file. -
Token rimosso (parola di troppo in trascrizione): elimina semplicemente la riga.
Esempio: aggiungere un token mancante
Riascoltando l’audio, ti accorgi che nell’unità 8 manca la parola moderne. L’unità ha già i token 8-0 … 8-4. Aggiungi una riga con il primo ID libero:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
8-3 |
BO026 |
8 |
|
lingue |
lingua |
NOUN |
8-4 |
BO026 |
8 |
|
moderne |
moderno |
ADJ |
8-5 |
BO026 |
8 |
|
straniere |
straniero |
ADJ ← riga aggiunta |
5. Cosa correggere
Approccio del progetto KIParla Forest
La lemmatizzazione ed annotazione del KIParla è stata brevemente descritta nel progetto "KIParla Forest", la treebank sintattica del KIParla: articolo
Lemmatizzazione
Il lemma è la forma citazionale del token (quella che cercheresti nel dizionario).
Controlla che il lemma sia una forma canonica (infinito per i verbi, singolare maschile per nomi/aggettivi, quando appropriato).
Cose da tenere a mente:
-
I nomi propri vanno lemmatizzati con la lettera maiuscola
-
sigle (es. RSA o CGIL): nella trascrizione a volte vengono trascritte con uno spazio tra le lettere (
erre esse a), altre volte univerbate (cigielle). Vanno riportate alla forma univerbata e lemmatizzate come da standard italiano (es.R.S.A.,CGIL)
POS tagging
-
Usa sempre solo i POS UD ufficiali.
-
Verifica in particolare:
-
VERB vs AUX
-
NOUN vs PROPN
-
ADV
-
INTJ per segnali discorsivi (eh, mh, boh, sì, no)
-
Criterio morfologico per il POS
In caso di dubbio, basati su indizi morfologici, non su come la parola si comporta nel contesto. Esempi:
-
dai — anche se usato come segnale discorsivo ("dai, basta"), morfologicamente è la seconda persona singolare del verbo dare. POS:
VERB, lemma:dare. -
madonna — anche se usato come esclamazione, conserva proprietà nominali (una madonna, due madonne). POS:
NOUN, lemma:Madonna.
Consulta sempre il dizionario De Mauro per verificare la categoria grammaticale originaria.
Esempi di correzione: lemma e POS errati prodotti dal parser
Il file BOA1001 contiene questi errori tipici. La parlante si presenta dicendo "io mi chiamo rossi anna giulia":
| token_id | form | lemma (parser) | upos (parser) | Correzione | Note |
|---|---|---|---|---|---|
0-1 |
|
mh |
NOUN |
lemma invariato, upos → |
segnale discorsivo |
0-2 |
|
eh |
NOUN |
lemma invariato, upos → |
segnale discorsivo |
4-3 |
|
chare |
VERB |
lemma → |
il parser ha inventato un lemma |
4-4 |
|
rosso |
ADJ |
|
nome proprio: maiuscola, non aggettivo |
4-6 |
|
anno |
ADJ |
|
nome proprio: maiuscola, non nome comune |
4-7 |
|
giulia |
NOUN |
|
nome proprio: maiuscola |
Token speciali
Parole troncate / interruzioni
Il parlante può interrompere una parola a metà. In questi casi:
-
Completa il lemma solo se la stessa base lessicale appare in un contesto vicino (es. il parlante riprende e ripete la stessa parola).
-
Non completare se il parlante cambia lessema (es.
qui a Bologna conosco molte per~ famiglie del sudinizia a dire persone ma si corregge con famiglie): in quel caso non sappiamo cosa volesse dire, e non facciamo ipotesi semantiche. -
Se non è possibile determinare il lemma, usa
xcome lemma eXcome POS.
Esempio: parola troncata con ripetizione vicina → lemma completabile
Il token 7-5 contiene abili~ (troncato con ~). Poco dopo, nell’unità 10, lo stesso parlante dice abilitato. La base lessicale è la stessa: si può completare.
| token_id | speaker | tu_id | span | form | lemma | upos | jefferson_feats |
|---|---|---|---|---|---|---|---|
7-1 |
BO020 |
7 |
lei |
lei |
lei |
PRON |
_ |
7-2 |
BO020 |
7 |
non |
non |
non |
ADV |
|
_ |
7-3 |
BO020 |
7 |
ha |
ha |
avere |
|
VERB |
_ |
7-4 |
BO020 |
7 |
ancora |
ancora |
|
ancora |
ADV |
_ |
7-5 |
BO020 |
7 |
abili~] |
|
abili~ |
abili~ |
PROPN |
Interrupted=Yes |
8-0 |
BO026 |
8 |
|
[di |
di |
di |
ADP |
_ |
8-1 |
BO026 |
|
8 |
didattica |
didattica |
didattica |
NOUN |
_ |
8-2 |
|
BO026 |
8 |
delle |
delle |
_ |
_ |
_ |
|
8-2a |
_ |
_ |
_ |
di |
di |
ADP |
_ |
8-2b |
_ |
_ |
_ |
le |
il |
DET |
|
_ |
8-3 |
BO026 |
8 |
lingue |
lingue |
lingua |
|
NOUN |
_ |
8-4 |
BO026 |
8 |
modern]e? |
moderne |
|
moderno |
ADJ |
Intonation=Rising |
9-0 |
BO020 |
9 |
sì. |
|
sì |
sì |
ADV |
Intonation=Falling |
10-0 |
BO020 |
10 |
|
non |
non |
non |
ADV |
_ |
10-1 |
BO020 |
|
10 |
ha |
ha |
avere |
AUX |
_ |
10-2 |
|
BO020 |
10 |
ancora |
ancora |
ancora |
ADV |
_ |
|
10-3 |
BO020 |
10 |
abilitato |
abilitato |
abilitare |
VERB |
_ |
10-4 |
BO020 |
10 |
per |
per |
per |
ADP |
|
ProsodicLink=Yes |
10-5 |
BO020 |
10 |
eh, |
eh |
eh |
|
NOUN |
Intonation=WeaklyRising |
11-0 |
BO020 |
11 |
per |
per |
Correggi 7-5:
| token_id | speaker | tu_id | span | form | lemma | upos | jefferson_feats |
|---|---|---|---|---|---|---|---|
7-5 |
BO020 |
7 |
|
abili~ |
abilitare |
VERB |
Interrupted=Yes |
Parole incomprensibili (XXX)
I token trascritti come XXX (o con grafia simile) indicano parole non comprensibili.
-
Lemma:
x -
POS:
X
|
Durante la lemmatizzazione puoi riascoltare l’audio. Se riesci a trascrivere parole che erano state marcate come incomprensibili, puoi correggerle nella colonna |
Token divisi: preposizioni articolate e verbi con clitici
Il parser divide automaticamente alcune forme in più token:
-
Preposizioni articolate: sulla →
su(ADP) +la(DET) -
Verbi con clitici: averlo →
avere(AUX) +lo(PRON)
Quando avviene la divisione, la riga originale (es. sulla) rimane con lemma e POS vuoti, e vengono aggiunte due righe con ID del tipo 5-7a e 5-7b.
Esempio: divisione già fatta correttamente dal parser
Il token sulla nell’unità 5 è stato diviso correttamente:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
5-7 |
BO020 |
5 |
|
sulla |
_ |
_ |
5-7a |
_ |
_ |
_ |
su |
su |
ADP |
5-7b |
_ |
_ |
_ |
la |
la |
DET |
La riga 5-7 conserva span e form originali; lemma e upos restano vuoti (_). Le righe 5-7a e 5-7b portano lemma e POS dei sotto-token.
Esempio: divisione mancante — aggiungere sotto-token a mano
Il parser non ha diviso averlo. La situazione nel file è:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
12-3 |
BO020 |
12 |
|
averlo |
avere |
VERB |
Va corretta così:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
12-3 |
BO020 |
12 |
|
averlo |
_ |
_ |
12-3a |
_ |
_ |
_ |
aver |
avere |
AUX |
12-3b |
_ |
_ |
_ |
lo |
lo |
PRON |
Esempio: divisione errata — rimuovere sotto-token
Il parser ha diviso del (ho comprato del pane) come preposizione articolata, ma è un articolo partitivo. La situazione nel file:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
15-2 |
BO020 |
15 |
|
del |
_ |
_ |
15-2a |
_ |
_ |
_ |
di |
di |
ADP |
15-2b |
_ |
_ |
_ |
il |
il |
DET |
Elimina le righe 15-2a e 15-2b e completa la riga originale:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
15-2 |
BO020 |
15 |
|
del |
del |
DET |
Errori nella trascrizione originale
Le colonne span e form in linea di principio non andrebbero toccate, perché rispecchiano la trascrizione originale.
Tuttavia, se riascoltando l’audio individui un errore di battitura o una tokenizzazione sbagliata, puoi intervenire anche su queste colonne.
|
Ogni modifica a |
Esempio: errore di battitura (bibliotreche → biblioteche)
Il trascrittore ha scritto una parola in modo errato. Nel file trovi:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
22-3 |
BO020 |
22 |
|
bibliotreche |
biblioteca |
NOUN |
Correggi span e form:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
22-3 |
BO020 |
22 |
|
biblioteche |
biblioteca |
NOUN |
Esempio: tokenizzazione errata — parole unite (casamia → casa + mia)
Il trascrittore ha unito due parole in un unico token. Nel file trovi:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
14-1 |
BO020 |
14 |
|
casamia |
casa |
NOUN |
Sostituisci la riga con due righe. Per la seconda, usa il primo ID libero nell’unità:
| token_id | speaker | tu_id | span | form | lemma | upos |
|---|---|---|---|---|---|---|
14-1 |
BO020 |
14 |
|
casa |
casa |
NOUN |
14-2 |
BO020 |
14 |
|
mia |
mio |
DET |
|
Se nell’unità esistono già token con ID |
Code switching e dialetto
Se nella conversazione compaiono parole in un’altra lingua (inglese, francese, spagnolo…) o in dialetto:
-
Lemmatizza secondo la lingua di quella parola (es. un verbo inglese va lemmatizzato all’infinito inglese).
-
Nella colonna
jefferson_feats, aggiungi la stringaLang=XXXcon il codice lingua ISO:-
Lang=engper l’inglese -
Lang=spaper lo spagnolo -
Lang=freper il francese -
Lang=diaper il dialetto italiano
-
-
Se la parola è in dialetto e non è lemmatizzabile con certezza, usa il corrispondente italiano come lemma.
6. Uso di GREW per i dubbi
GREW serve per:
-
cercare come casi simili sono annotati in altri corpora UD;
-
confrontare lemma e POS in contesti simili.
Link utili:
-
Tutorial, molto più ampio ed esteso di quanto sia utile per il task di lemmatizzazione
Per ora è sufficiente: