{{
Introduzione: Il limite della grammatica italiana automatica tra Tier 1 e Tier 2
La correzione grammaticale automatica in italiano richiede un approccio stratificato che vada ben oltre la semplice analisi sintattica: a differenza dell’inglese, la complessità morfologica e sintattica della Lingua Italiana – con genere, numero, tempo verbale, concordanze e registro linguistico – impone modelli linguistici specializzati. Molti strumenti generici falliscono nel cogliere sfumature come la distinzione tra “essere” e “stare”, o l’uso corretto degli aggettivi clitici. Tier 2 rappresenta il punto di transizione fondamentale, dove si integra il preprocessing linguistico, l’estrazione di feature precise e la validazione contestuale per superare i limiti della generazione automatica superficiale.
“La grammatica italiana automatica non può prescindere da un’analisi morfologica fine-grained e da un parsing contestuale: un soggetto “tutti” richiede un’analisi di accordo con il verbo “essere”, non di “stare”, e un aggettivo “grande” deve rispettare genere e numero, non solo contesto immediato.” – Esperto linguistica Computazionale, Università di Bologna
Metodologia di base per Tier 2: dalla normalizzazione al controllo contestuale
Fase 1: Preprocessing del testo italiano – normalizzazione e pulizia
Il primo passo è trasformare il testo grezzo in una forma strutturata idonea all’analisi linguistica. Questo include:
- Normalizzazione grafica: eliminazione di caratteri speciali (HTML, emoji, simboli), conversione di accenti (ad es. “ê” → “e”), correzione di errori ortografici comuni (es. “c’è” → “ce è”, “d’ora” → “d’ora”).
- Rimozione del rumore: eliminazione di tag HTML residui, caratteri non alfabetici (es. punteggiatura eccessiva), segmentazione precisa in frasi usando regole specifiche italiane (es. “.”, “?”, “!” come delimitatori primari, ma con attenzione a abbreviazioni come “a.mm.”).
- Standardizzazione dello spazio: unificazione di spazi multipli in singoli, gestione di tabulazioni e nuove righe con coerenza.
Strumenti consigliati: stanza per tokenizzazione avanzata con supporto morfologico italiano, re per espressioni regolari specifiche (es. rimozione di “‘” non standard), e unicodedata per normalizzare caratteri accentati. Esempio pratico:
import unicodedata
import re
from stanza import Pipe
def preprocess(text):
# Normalizzazione Unicode
text = unicodedata.normalize('NFKC', text)
# Rimozione HTML e caratteri speciali
text = re.sub(r'<[^>]+>', '', text)
text = re.sub(r'[^\p{L}\p{N}\s\.\,!?;:-]', '', text)
# Contrazione e normalizzazione spazi
text = re.sub(r'\s+', ' ', text).strip()
return text
Fase 2: Estrazione di feature linguistiche per Tier 2
L’estrazione di feature va oltre la semplice tokenizzazione: richiede analisi morfologiche e sintattiche profonde per cogliere concordanze, genere, numero, tempo verbale e struttura fraseologica.
- Part-of-Speech (POS) tagging con spaCy (adattato all’italiano):
Utilizzo diit_core_news_smcon estensioni per gestire clitici e pronomi ambigui.
Fase 2a: Tokenizzazione con spaCy + rimozione stopword italiane di base (es. “di”, “il”, “e”).
Fase 2b: POS tagging conspacy-it(modello multilingue con supporto italiano avanzato).
Esempio di output tag:
[('Tutti', 'PRON'), ('sono', 'VERB'), ('grandi', 'ADJ')] - Analisi morfologica con stanza:
pipe = Pipe(model="it_core_news_sm")
doc = pipe(text)
for token in doc:
print(f"{token.text:<20} {token.pos_:<8} {token.tag_:<10} {token.dep_:<12}")
Consente di verificare genere, numero, tempo verbale, e dipendenze sintattiche (es. soggetto-verbo coerenza). - Verifica concordanze e accordi:
Controllo automatico che aggettivi (es. “grande”) concordino in genere e numero con sostantivi (es. “grandi case”).
Utilizzo pattern regex o regole personalizzate per casi complessi (es. “è” vs “stanno”). - Segmentazione fraseologica:
Riconoscimento di frasi subordinabili (congiunzioni come “che”, “perché”) per evitare errori di parsing gerarchico.
Fase 3: Validazione sintattica con alberi di dipendenza
Il parsing strutturale con alberi di dipendenza consente di analizzare la gerarchia sintattica e verificare concordanze complesse, fondamentale per evitare errori di registro e accordo.
Utilizzando stanza o stanza-de (modello multilingue con supporto italiano), si generano alberi di dipendenza che evidenziano relazioni tra parole.
Esempio di validazione critica:
Fase 3a: Parsing dell’albero per verificare che il soggetto “tutti” concordi con “sono” (maschile plurale).
Fase 3b: Analisi delle dipendenze oblique per rilevare errori come “Il libro, che grande, è interessante” (dove “interessante” dovrebbe concordare con “libro”, maschile singolare).
Strumento chiave:
from stanza import DependencyGraph
def validate_concordance(tokens, dependencies):
for dep in dependencies:
if dep.rel_ == 'nsubj' and dep.head.lemma_ != tokens[dep.head.i].lemma_:
print(f"Errore concordanza: ‘{dep.head.lemma