Dalle cronache locali alla geografia del tono mediatico
Per capire come una città fosse stata raccontata nel corso del tempo, volevamo raccogliere molti anni di notiziari regionali. Prima degli algoritmi, delle mappe e dei modelli di linguaggio, il progetto è iniziato con un incontro sul campo: una visita alla sede di un notiziario regionale per esplorare le possibilità di accesso a dieci anni di edizioni locali.
"Per richiedere i materiali è necessario consultarli prima, uno per uno, e indicare quali sono quelli di interesse."
Una procedura del tutto comprensibile per chi entra in un archivio alla ricerca di un contenuto preciso. Ma noi volevamo analizzare dieci anni di informazione senza conoscere preventivamente ciò che avremmo trovato.
La soluzione è arrivata quando abbiamo scoperto, come fonte alternativa, le edizioni locali del network City News. Nel suo archivio convivono le ultime notizie, la cronaca, gli eventi, le zone, le segnalazioni e molto altro. È un flusso continuo nel quale la città compare attraverso fatti eccezionali e gesti ordinari, incidenti e concerti, cantieri e mostre, problemi di quartiere e occasioni di partecipazione.
Citynews definisce la propria forza attraverso il legame con il territorio e la capacità delle sue testate di prossimità (come FirenzeToday) di entrare nella vita delle comunità locali.
Dal flusso delle notizie a un archivio strutturato
Il primo passaggio è stato raccogliere in modo sistematico le notizie pubblicate dalle edizioni locali di CityNews. Per ciascuna città abbiamo sviluppato uno scraper in Python capace di percorrere le pagine dedicate alle notizie di zona, procedendo dagli articoli più recenti verso quelli più lontani nel tempo.
Per ogni notizia sono stati registrati la categoria (che può contenere informazioni territoriali, tipo di evento o macrocategoria dell'argomento trattato), il titolo, il link, il trafiletto e la data mostrata sul sito. Queste informazioni sono state organizzate in un archivio tabellare, che costituisce il punto di partenza per le successive operazioni.
Rimettere ogni notizia al suo posto nel tempo
La data raccolta dal sito non corrispondeva sempre a un giorno scritto nel formato tradizionale. Molte notizie erano accompagnate da espressioni relative come "ieri", "tre settimane fa", "aprile scorso".
Abbiamo quindi ricostruito ogni riferimento temporale a partire dal giorno in cui è stato eseguito lo scraping. La conversione ha prodotto una data standardizzata.
Dettagli tecnici · come abbiamo ricostruito le date
Riconoscere le diverse forme linguistiche
Abbiamo costruito un parser basato su espressioni regolari. Ogni regola riconosce una particolare struttura della data e ne estrae gli elementi necessari, come la quantità, l'unità temporale, il mese, il giorno della settimana o l'orario.
Abbiamo quindi utilizzato come riferimento la data dello scraping, fissata ad esempio all'8 luglio 2026, e abbiamo sottratto da essa l'intervallo temporale riconosciuto.
Alcuni esempi
| Espressione originale | Operazione | Risultato | Precisione |
|---|---|---|---|
| "L'altro ieri, 9:31" | Sottrazione di due giorni | 6 luglio 2026, 9:31 | Minuto |
| "3 settimane fa" | Sottrazione di tre settimane | 17 giugno 2026 | Giorno |
| "5 mesi fa" | Sottrazione di cinque mesi | Febbraio 2026 | Mese |
| "2 anni fa, a ottobre" | Sottrazione di due anni e selezione del mese | Ottobre 2024 | Mese |
| "Aprile scorso" | Ricerca dell'ultima occorrenza passata di aprile | Aprile 2026 | Mese |
Dal linguaggio delle notizie alle aree subcomunali
I luoghi citati nelle cronache locali non seguono sempre una classificazione territoriale uniforme. Una stessa zona può essere indicata attraverso una via, una forma abbreviata, un quartiere, un parco oppure un toponimo conosciuto dagli abitanti.
Per collegare questi riferimenti a una geografia comune, abbiamo cercato nelle categorie, nei titoli e nei trafiletti le denominazioni e le varianti linguistiche delle aree subcomunali ASC2.
Ogni corrispondenza è stata associata alla relativa area territoriale, conservando anche la parola trovata e il campo della notizia nel quale compariva. Una stessa notizia può quindi essere collegata a più zone quando descrive eventi che coinvolgono parti diverse della città.
Dettagli tecnici · riconoscimento delle aree ASC2
1. Normalizzazione del testo
Prima della ricerca, testi e denominazioni territoriali sono stati convertiti in minuscolo, privati degli accenti e della punteggiatura e uniformati negli spazi.
Notizie da NOVOLI-LIPPI diventa notizie da novoli lippi2. Costruzione del dizionario geografico
Per ogni ASC2 abbiamo costruito una lista di parole chiave a partire dalle varianti presenti nel file territoriale. Le denominazioni separate dal simbolo | sono state divise, normalizzate e raccolte senza duplicati.
novoli|lippi · parole ricercate: novoli, lippiAlcune parole, come novoli, compaiono nelle varianti di più ASC2: Novoli - Lippi, Novoli - Fiat, Novoli - Baracca Est e Novoli - Baracca Ovest.
3. Ricerca delle denominazioni
Le parole chiave sono state cercate nei campi normalizzati della categoria, del titolo e del trafiletto. Il confronto utilizza i confini di parola, così da riconoscere soltanto termini o espressioni complete.
\b + denominazione + \bNuovi lavori nel quartiere di Novoli · keyword riconosciuta: novoli4. Il caso dell'ASC2 Centro
A Firenze l'ASC2 49 si chiama Centro. Abbiamo escluso questa espressione perché troppo generica. Per recuperare le notizie del centro abbiamo sfruttato le descrizioni OMI, che contengono denominazioni più precise.
CENTRO STORICO (SIGNORIA - DUOMO - PITTI - SAN NICCOLO) · parole utilizzate: signoria, duomo, pitti, san niccolo5. Notizie associate a più aree
Una notizia può citare più zone oppure contenere una denominazione condivisa da più ASC2. Contarla interamente in ciascuna zona aumenterebbe artificialmente il numero totale delle notizie.
novoli è associata a quattro ASC2. La notizia viene distribuita tra le quattro aree: 0,25 per ciascuna. Il peso complessivo rimane pari a 1.6. Conversione dalle zone OMI alle ASC2
La conversione è stata applicata soltanto alle notizie che avevano un riferimento OMI ma nessun match ASC2 diretto. Il peso della notizia è stato distribuito tra le ASC2 in proporzione alla superficie condivisa con la zona OMI.
1. La zona OMI ricade per il 70% nell'ASC2 A e per il 30% nell'ASC2 B → peso A: 0,70, peso B: 0,30, totale 1.Dalle emozioni alla polarità territoriale
Con ItEM (lessico emotivo ad alta copertura per la lingua italiana, in cui a ciascun termine target viene assegnato un punteggio di associazione con le emozioni di base definite nella tassonomia di Plutchik, 1994) abbiamo analizzato titolo e trafiletto di ogni notizia, ottenendo uno score per otto emozioni: attese, disgusto, fiducia, gioia, paura, rabbia, sorpresa e tristezza.
Da questi valori abbiamo ricavato uno score di polarità compreso tra −1 e +1 per ogni notizia. Le polarità delle singole notizie sono state poi aggregate per area ASC2 e periodo elettorale, tenendo conto del peso territoriale di ciascun articolo.
Il risultato permette di distinguere la quantità di attenzione ricevuta da una zona dal tono, relativamente positivo o negativo, con cui viene raccontata rispetto alla propria città.
Dettagli tecnici · Dentro il calcolo della polarità
Dal testo alle chiavi lemma–POS di ItEM
ItEM non contiene soltanto parole isolate: le sue voci sono indicizzate come combinazioni di lemma e parte del discorso (POS). Questa informazione permette di distinguere termini che hanno la stessa forma ma una funzione grammaticale diversa e rende necessario trasformare nello stesso formato anche le parole dei titoli e dei trafiletti.
Abbiamo unito titolo e trafiletto, convertito il testo in minuscolo, rimosso URL, caratteri non alfabetici e spazi multipli, quindi lo abbiamo elaborato con il modello italiano it_core_news_sm di spaCy. Per ogni token sono stati ricavati il lemma con token.lemma_ e il POS con token.pos_; sono stati esclusi stopword, token non alfabetici, parole di due caratteri o meno e POS non presenti nella mappatura di ItEM. Per alleggerire l'elaborazione, parser sintattico e riconoscimento delle entità nominate sono stati disattivati, perché non necessari a questo confronto lessicale.
| POS riconosciuto da spaCy | Codice ItEM | Esempio di chiave confrontata |
|---|---|---|
NOUN, PROPN | s | casa-s |
ADJ | a | difficile-a |
VERB, AUX | v | aumentare-v |
Le chiavi lemma-POS estratte dalle notizie sono state confrontate esattamente con l'indice del lessico. Per ogni termine riconosciuto, ItEM restituisce un vettore di otto punteggi: uno per ciascuna emozione.
Da più termini a un solo profilo emotivo per notizia
Titolo e trafiletto sono stati trattati insieme come un unico testo. I risultati non sono stati conservati come score separati per ciascuna frase o parola: sono stati appiattiti a livello di notizia. Per ogni emozione abbiamo sommato i punteggi ItEM di tutti i termini riconosciuti e abbiamo diviso la somma per il numero totale di termini eleggibili estratti da spaCy.
Dove \(E_{i,e}\) è lo score della notizia \(i\) per l'emozione \(e\), \(M_i\) è l'insieme delle occorrenze lemma–POS della notizia riconosciute in ItEM, \(c(t,e)\) è il punteggio di associazione del termine \(t\) con l'emozione \(e\) e \(N_i\) è il numero complessivo dei termini eleggibili estratti da spaCy, compresi quelli senza corrispondenza nel lessico. In questo modo ogni notizia viene rappresentata da una sola riga con otto valori emotivi, indipendentemente dal numero di termini che contiene.
Dalle emozioni alla polarità
Abbiamo riunito gioia, fiducia, attese e sorpresa nella componente positiva e tristezza, rabbia, paura e disgusto nella componente negativa.
La polarità varia tra −1 e +1: valori positivi indicano una prevalenza delle emozioni positive, valori negativi una prevalenza di quelle negative. Le notizie senza termini riconosciuti da ItEM vengono escluse dal calcolo, perché l'assenza di uno score non equivale a neutralità.
Polarità media della zona
Per ogni ASC2 e periodo elettorale abbiamo calcolato la media delle polarità, pesando ogni notizia per la quota attribuita alla zona. Un articolo condiviso tra più aree influenza ciascuna di esse soltanto per la propria frazione.
Polarità z-normalizzata
Per confrontare territori con livelli medi differenti, la polarità della zona viene rapportata alla media e alla variabilità della propria città nello stesso periodo.
Z > 0: tono più positivo della media cittadina · Z < 0: tono più negativo · Z ≈ 0: tono vicino alla media.Lo z-score non descrive una qualità oggettiva del quartiere, ma la sua posizione relativa nella narrazione mediatica della città.
Leggere le polarità attraverso il TF-IDF
Per osservare quali parole caratterizzano maggiormente le notizie classificate come negative o positive, abbiamo affiancato alla polarità lessicale un bubble chart basato sul TF-IDF.
Negativa
57.620 notizieLe parole più distintive sono arrestato, ferito, polizia, auto, denunciato, paura, incendio, rapina, fuoco e fiamme.
Positiva
151.760 notizieLe parole più distintive sono evento, concerto, musica, edizione, teatro, progetto, appuntamento, mostra, festival e arte.
Dettagli tecnici · che cosa misura il TF-IDF
L'idea fondamentale
Il TF-IDF non risponde semplicemente alla domanda “quali parole compaiono più spesso?”. Cerca invece parole importanti nei singoli articoli ma non diffuse indistintamente in tutto il corpus. Nel nostro confronto serve quindi a far emergere il vocabolario che caratterizza maggiormente una polarità rispetto all'altra.
1. TF: quanto conta la parola nella notizia
Ogni documento è formato da titolo e trafiletto. Se \(f_{t,d}\) è il numero di volte in cui il termine \(t\) compare nella notizia \(d\), abbiamo usato una frequenza sublineare:
Il logaritmo evita che la ripetizione della stessa parola domini il risultato: passare da una a due occorrenze aumenta il peso, ma ripeterla dieci volte non la rende dieci volte più informativa.
2. IDF: quanto la parola è rara nel corpus
\(N\) è il numero totale di notizie positive e negative, mentre \(\operatorname{df}_{t}\) è il numero di notizie che contengono il termine. Una parola presente quasi ovunque riceve un IDF basso; una parola concentrata in un numero più limitato di articoli riceve un IDF più alto. Gli \(1\) della formula sono lo smoothing usato da scikit-learn e rendono il calcolo stabile.
3. Il peso TF-IDF
Dopo il prodotto, ciascun vettore-documento è normalizzato con norma L2. In questo modo un trafiletto più lungo non ottiene automaticamente valori maggiori soltanto perché contiene più parole. Sono stati mantenuti i termini presenti in almeno 40 notizie.
4. Dal TF-IDF alla dimensione della bolla
Il TF-IDF viene prima calcolato per ogni notizia. Poi, per ciascuna parola, ne calcoliamo la media nelle notizie di una polarità e la confrontiamo con la media nella polarità opposta:
La prima parte premia una parola importante nel gruppo; il rapporto logaritmico premia una parola molto più forte in quel gruppo che nell'altro. Se le due medie sono uguali, il logaritmo vale circa zero e la parola non produce una bolla grande, anche se è frequente. \(\varepsilon\) è un numero piccolissimo che evita divisioni per zero.
Come leggere il grafico
Una bolla grande identifica quindi una parola che è contemporaneamente rilevante nelle notizie di una polarità e distintiva rispetto all'altra. Per esempio, nel corpus termini di cronaca ed emergenza distinguono maggiormente il gruppo negativo, mentre eventi e cultura distinguono il gruppo positivo. Questo non significa che una parola sia positiva o negativa in assoluto: il grafico descrive il suo uso nel nostro corpus e nelle classi prodotte da ItEM.