Le analisi di sentiment con modelli linguistici di grandi dimensioni (LLM) in lingua italiana si confrontano con una sfida specifica: la temporalità espressa nei testi non è solo una questione di tempi verbali, ma un insieme complesso di marcatori temporali, contesto emotivo e ambiguità semantica. Mentre il Tier 2 ha evidenziato come la temporalità in italiano si esprima attraverso una ricca varietà di tempi verbali, avverbi di durata e locuzioni contestuali, il rischio di overfitting linguistico emerge quando i modelli imparano associazioni superficiali tra espressioni temporali e sentiment, trascurando la coerenza temporale reale. Questo articolo, in continuità con il quadro fornito da Tier 1 e la metodologia operativa di Tier 2, propone un approccio tecnico e granulare per costruire sistemi di sentiment analysis robusti, temporalmente consapevoli e culturalmente sensibili nel contesto italiano.
Il problema dell’overfitting temporale nei modelli LLM per il sentiment analysis italiano
L’overfitting temporale si verifica quando un LLM apprende associazioni meccaniche tra espressioni temporali e sentimenti specifici, senza comprendere la dinamica contestuale reale. In italiano, questa debolezza è amplificata da marcatori temporali ambigui come “ieri”, “la settimana scorsa” o “tra un mese”, la cui interpretazione dipende da contesto, frequenza d’uso e tonalità emotiva. Modelli addestrati su dataset non diversificati rischiano di sovradattarsi a pattern locali, attribuendo sentiment a parole fuori contesto o ignorando la progressione temporale reale del discorso. La soluzione richiede un’architettura che disaccoppi il riconoscimento temporale dalla valutazione emotiva, integrando disambiguazione contestuale e allineamento temporale esplicito.
Fase 1: Preprocessing avanzato delle espressioni temporali per normalizzazione e categorizzazione
La normalizzazione è il primo passo fondamentale: trasformare espressioni temporali libere in intervalli standardizzati per migliorare la coerenza del modello.
Fase 1a: **Mappatura semantica delle espressioni temporali**
Implementare un dizionario ontologico italiano che categorizzi marcatori temporali in base a granularità (giornaliera, settimanale, mensile, indefinita) e contesto emotivo:
– **Giornaliera**: “ieri”, “oggi”, “domani” → conversione in offset numerico rispetto alla data di riferimento (es. “ieri” = -1 giorno)
– **Settimanale**: “la settimana scorsa”, “tra la settimana passata e quella attuale” → calcolo come frazione di 7 giorni con soglia di soglia semantica (es. “tra 3 e 7 giorni fa”)
– **Mensile**: “tra un mese”, “da qualche mese”, “nei prossimi 30 giorni” → normalizzazione in intervalli di 30 giorni, con soglie dinamiche basate su frequenza d’uso storica
– **Indefinita**: “da sempre”, “spesso”, “abitualmente” → categorizzazione come “tempo improprio” con peso di sentiment neutro o neutro-positivo
Fase 1b: **Tokenizzazione contestuale con regex linguistiche**
Usare pattern regex in lingua italiana per identificare e arricchire marcatori temporali con categorie semantiche. Esempio:
import re
patterns = {
r’\bieri\b’: ‘TEMPORALE_JORNALIERA’,
r’\bla settimana scorsa\b’: ‘TEMPORALE_SETTEMANALE’,
r’\btra un mese\b’: ‘TEMPORALE_MESIALA’,
r’\bda qualche giorno\b’: ‘TEMPORALE_BREVE’,
r’\bda qualche mese\b’: ‘TEMPORALE_PROLONGATO’,
r’\bnon sempre\b’: ‘TEMPORALE_CONTESTUALIZZATO’,
r’\bda settimana passata\b’: ‘TEMPORALE_REFERENZIALE’
}
Questi marcatori vengono arricchiti con etichette semantiche e contesto circostante (ad esempio, avverbi di durata o locuzioni temporali consecutive) per formare un vettore contestuale dettagliato.
Fase 2: Disentanglement semantico-temporale e allineamento con time embeddings
Fase 2 mira a separare la componente emotiva dal contesto temporale esplicito, evitando sovrapposizioni errate.
Fase 2a: **Estrazione fine-grained dei marcatori temporali**
L’uso di un encoder dedicato (Transformer multilingue addestrato su corpus italiano con annotazione temporale, come il dataset TEMPO-IT) permette di riconoscere marcatori con sottigliezze semantiche:
– “prima di” → sottotempo relativo (es. “prima di Natale”)
– “dopo che” → consecutività temporale causale
– “sempre nel passato recente” → focalizzazione su durata e frequenza
Fase 2b: **Time embeddings per allineamento temporale**
Generare time embeddings per ogni espressione temporale, convertita in vettori continui che rappresentano la posizione temporale nel continuum rispetto alla reference date del testo. Questi vettori vengono usati per calibrare l’importanza temporale rispetto al sentimento dichiarato:
# Esempio pseudo-codice: calibrazione weight temporale
weight = base_weight + α * (distanza_numerica_in_giorni / soglia_max)
Dove α è un parametro di attenzione temporale che penalizza espressioni distanti dalla data di riferimento.
Fase 3: Fine-tuning selettivo con contrastive learning per temporalità robusta
Il fine-tuning tradizionale spesso rinforza pattern temporali superficiali; il Tier 3 propone un approccio contrastivo per migliorare la generalizzazione.
Fase 3a: **Corpus di training arricchito con annotazioni temporali contestuali**
Includere recensioni di prodotti, commenti social, e dialoghi con marcatori temporali etichettati per sentiment e contesto. Esempio:
> “Questo prodotto è fantastico da qualche mese: la qualità è costante, ma la consegna è lenta da 2 settimane.”
Annotare “da 2 settimane” come “TEMPORALE_BREVE” con valore di sentiment neutro-leggermente negativo.
Fase 3b: **Contrastive loss per distinzione temporale**
Definire un loss ibrido che penalizza:
– Sovra-adattamento a espressioni temporali isolate (es. “da sempre” senza contesto emotivo)
– Mancata coerenza tra contesto temporale e sentiment (es. “sempre” in un commento negativo)
loss_contrastive = -log(softmax(model(pos)) * softmax(model(neg) * disamb) + softmax(model(neg)) * softmax(model(pos) * disamb))
loss_temporal_coherence = β * (1 – similarity(embedding(temp1), embedding(temp2)))
total_loss = loss_contrastive + λ * loss_temporal_coherence
dove β e λ sono parametri di regolazione.
Fase 4: Gestione degli errori comuni e ottimizzazione pratica
“Il rischio più comune è attribuire sentiment a parole fuori contesto: un ‘sempre’ in un commento sarcastico può indicare frustrazione, non affermazione.”
- Errore di overfitting su espressioni isolate