Il file Lemmi_forme_atliteg.csv è il dataset principale del progetto ATLITEG (Atlante Lessicale dell'Italiano Tardo-antico e Medievale della Gastronomia). Contiene dati strutturati sulla terminologia gastronomica italiana storica, tracciando l'evoluzione lessicale nel tempo e nello spazio geografico.
Il dataset documenta la relazione tra LEMMA (forma base normalizzata) e FORMA (variante attestata) in funzione della GEOGRAFIA. Questa relazione rivela pattern di variazione dialettale e diffusione lessicale attraverso l'Italia storica:
- Forme locali (72,2%): varianti attestate solo in città specifiche (es.
aggiadasolo a Genova) - Forme regionali (6,3%): varianti attestate solo in regioni (es.
brasolein Lazio e Toscana) - Forme macro-areali (5,4%): varianti in ambiti sovra-regionali (es.
brasciolain Italia meridionale intermedia) - Forme trasversali (4,1%): varianti panitaliane attestate a tutti i livelli geografici (es.
agliata)
Questa struttura permette di analizzare isoglosse storiche, diffusione di forme di prestigio, e persistenza di varianti dialettali.
- Totale record: 6.236 righe (escludendo l'intestazione)
- Lemmi unici: 365
- Forme uniche: 1.871 (media 5,1 forme per lemma)
- Distribuzione geografica forme:
- 1.411 forme solo locali (città)
- 154 forme locale+regionale
- 123 forme solo regionali
- 81 forme trasversali (tutti i livelli)
- Lemmi con alta variabilità geografica: 165 (45,2%) hanno forme su più livelli geografici
- Periodo temporale: 1314 - 1899 (circa 585 anni)
- Separatore: punto e virgola (
;) - Codifica: UTF-8 (con problemi di encoding su caratteri accentati)
Descrizione: Identificatore numerico univoco del lemma (headword lessicale)
Caratteristiche:
- Tipo: Intero
- Range: 32 - 8603
- Non sequenziale
- Utilizzato per raggruppare forme varianti dello stesso lemma
- Chiave per il collegamento al sito web ATLITEG
Esempi:
2105→ aarìso4133→ acciugata2106→ agliata
Uso nel frontend: Identificatore per aggregare dati e creare gerarchie lemma → forme
Descrizione: Forma normalizzata/lemmatizzata del termine gastronomico
Caratteristiche:
- Tipo: Stringa
- Lunghezza variabile
- Può contenere spazi e caratteri speciali
- Forma di riferimento per raggruppamento varianti
- Alcune forme contengono underscore per disambiguazione (es.
agresta_1)
Esempi:
aarìsoacciugataagliataagnolottoagresta_1(variante disambiguata)
Note speciali:
- Presenza di caratteri accentati mal codificati (es.
aar�soinvece diaarìso) - Alcuni lemmi terminano con spazio (es.
agnolotto)
Uso nel frontend:
- Etichetta principale nei componenti
- Filtro di ricerca
- Chiave per navigazione
Descrizione: Variante grafica/fonetica attestata del lemma nelle fonti storiche
Caratteristiche:
- Tipo: Stringa
- 1.871 forme uniche per 365 lemmi (media ~5 forme per lemma)
- Include varianti dialettali, grafiche e morfologiche
- Riflette l'evoluzione ortografica storica e la variazione diatopica (geografica)
Esempi per il lemma agliata:
alleata(Napoli, 1314)alleatam(forma latina)aggiada(Genova, 1893)agliata(forma standard)alliataaggiadda
Relazioni:
- Un lemma può avere molte forme (1:N)
- La stessa forma può apparire in contesti diversi (spazio-temporali)
Relazione Forma-Geografia (vedi sezione 3.4):
- 72,2% delle forme sono attestate solo a livello locale (città specifiche)
- 7,9% sono forme condivise tra città e regioni
- 4,1% sono forme trasversali (attestate a tutti i livelli geografici: città, regioni, macro-aree)
Uso nel frontend:
- Visualizzazione dettagli varianti
- Analisi evoluzione ortografica
- Filtri di ricerca avanzata
- Mappa distribuzione geografica delle forme dialettali
Descrizione: Località o area geografica dove il termine è attestato
Caratteristiche:
- Tipo: Stringa
- Località più frequenti (top 10):
- Roma (1.155 attestazioni)
- Napoli (850)
- Firenze (547)
- Torino (402)
- Milano (363)
- Bologna (362)
- Genova (314)
- Ferrara (268)
- Toscana (200 - regione)
- Lazio (181 - regione)
Granularità variabile: può essere città, regione o ambito geografico
Problemi di encoding: caratteri accentati corrotti (es. Citt� invece di Città)
Uso nel frontend:
- Componente mappa geografica (GeographicalDistributionMap.vue)
- Filtri geografici
- Analisi distribuzione spaziale
- Necessità di geocoding per coordinate
Descrizione: Classificazione della granularità geografica
Valori possibili (4 categorie):
Città→ località urbana specifica (es. Roma, Napoli)Regione→ regione italiana (es. Toscana, Lazio)Ambito geografico sub regionale→ area sub-regionale (es. Toscana sud-orientale)Ambito geografico sovra regionale→ area sovra-regionale (es. Italia mediana, Italia meridionale intermedia)
Distribuzione: La maggior parte dei record si riferisce a città specifiche
Problemi: Encoding corrotto Citt� invece di Città
Uso nel frontend:
- Filtro gerarchico per livello geografico
- Visualizzazione mappa con diversi livelli di zoom
- Aggregazione dati per granularità
Descrizione: Anno di attestazione del termine nelle fonti
Caratteristiche:
- Tipo: Intero
- Range: 1314 - 1899 (585 anni)
- Distribuzione non uniforme
- Anni più rappresentati: periodi di maggiore produzione letteraria gastronomica
Esempi:
1314→ attestazioni medievali precoci1609,1627→ periodo barocco (Roma)1820,1852→ epoca ottocentesca
Uso nel frontend:
- Timeline temporale
- Filtri per periodo storico
- Analisi evoluzione diacronica
- Componente GlobalFilterBar per range temporale
Descrizione: Classificazione del periodo storico in quarti di secolo
Caratteristiche:
- Tipo: Stringa
- Formato standardizzato:
[I|II|III|IV] quarto del [XIV-XIX] secolo - 23 valori distinti
Valori completi:
- Secolo XIV: I, III, IV quarto
- Secolo XV: I, II, III, IV quarto
- Secolo XVI: I, II, III, IV quarto
- Secolo XVII: I, II, III, IV quarto
- Secolo XVIII: II, III, IV quarto
- Secolo XIX: I, II, III, IV quarto
- Eccezione:
I quarto dell'XI secolo(probabilmente errore: 1526 → XVI secolo)
Uso nel frontend:
- Filtri temporali predefiniti
- Visualizzazioni aggregate per periodo
- Etichette human-readable per timeline
Descrizione: Identificatore numerico sequenziale del periodo
Caratteristiche:
- Tipo: Intero
- Range: 1 - 36
- Sequenza ordinata cronologicamente
- Facilita ordinamento e confronti
Mappatura esempio:
1→ I quarto dell'XI secolo (anomalia)13→ I quarto del XIV secolo20→ IV quarto del XV secolo36→ IV quarto del XIX secolo
Uso nel frontend:
- Ordinamento cronologico
- Filtri numerici
- Aggregazioni per periodo
Descrizione: Datazione precisa o range temporale dell'attestazione
Caratteristiche:
- Tipo: Stringa
- Formato variabile e non standardizzato
- Include:
- Date precise:
1609,1893, 8ª ed. - Range di secoli:
Sec. XIV primo quarto - Range di anni:
1308-1314,1461-1465 - Date specifiche:
3 agosto 1524,16/02/1476 - Riferimenti editoriali:
1820, 6ª ed.,1852, 7ª ed. - Periodi generici:
fine XV sec.-inizio XVI sec.,Sec. XIV secondo terzo
- Date precise:
Esempi:
1308-13141820, 6ª ed.Sec. XV ultimo quarto7 gennaio 1554 - 23 ottobre 1556
Uso nel frontend:
- Visualizzazione dettagliata tooltip
- Informazioni contestuali
- Non adatta per filtri automatici (formato non strutturato)
Descrizione: Classificazione tematico-semantica del termine gastronomico
Caratteristiche:
- Tipo: Stringa (spesso multi-valore)
- Separatore multi-categoria: virgola (
,) - 1.714 record (27,5%) hanno categorie multiple
- Totale categorie uniche: ~90
Categorie principali (top 15):
- Carni derivati e preparazioni a base di carne (792 occorrenze)
- Paste e pastelli anche con ripieno (531)
- Farina e derivati (495)
- Brodi brodetti minestre zuppe (474)
- Latte latticini e formaggi (387)
- Condimenti vari (360)
- Dolci e dessert (303)
- Salse (161)
- Frutta frutta secca e preparazioni (139)
- Conserve e confetture (124)
- Insalate e verdure (111)
- Pesci e preparazioni a base di pesce
- Volatili e preparazioni a base di volatili
- Uova e preparazioni
- Vini e bevande
Combinazioni frequenti:
Brodi brodetti minestre zuppe,Carni derivati e preparazioni a base di carne(168)Carni derivati e preparazioni a base di carne,Condimenti vari(110)Brodi brodetti minestre zuppe,Dolci e dessert(101)Arredi per la tavola,Utensili di cucinaOperazioni di cucina
Categorie specialistiche:
Spezie e sostanze aromaticheFunghi e tartufiRiso e risottiTorte salateLegumi e preparazioniOrtaggi e preparazioni
Uso nel frontend:
- LemmaCategoriesTreemap.vue per visualizzazione gerarchica
- GlobalFilterBar per filtri multi-selezione
- Analisi categorie dominanti per periodo/località
- Necessità di parsing per gestire multi-categoria
Nota critica: Alcune categorie contengono spazi irregolari e potrebbero richiedere normalizzazione
Descrizione: Numero di occorrenze del termine nel corpus della specifica fonte
Caratteristiche:
- Tipo: Intero
- Range: 0 - 2.120
- Media: 15,6 occorrenze per record
- Distribuzione fortemente asimmetrica (long tail)
Statistiche:
- Minimo: 0 (presenza senza occorrenze numerabili)
- Massimo: 2.120 (termine molto frequente)
- Mediana: molto più bassa della media (distribuzione skewed)
Interpretazione:
- Valori bassi (1-5): termini rari/specialistici
- Valori medi (6-50): termini comuni
- Valori alti (>100): termini fondamentali/frequentissimi
Esempi estremi:
2120→ massima frequenza1705,1549,1361→ termini molto frequenti- Molti termini con frequenza 1-3 (hapax o rari)
Uso nel frontend:
- Dimensionamento visuale (bubble size, word cloud)
- LemmaCategoriesTreemap: dimensione nodi
- Filtri per importanza/rilevanza
- Heatmap di distribuzione
Descrizione: Link alla scheda dettagliata del lemma sul sito ATLITEG
Caratteristiche:
- Tipo: URL (String)
- Pattern:
https://www.atliteg.org/lemmi/{lemma}/{IdLemma} - Sempre valorizzato (non null)
Formato esempio:
https://www.atliteg.org/lemmi/aarso/2105
https://www.atliteg.org/lemmi/agliata/2106
https://www.atliteg.org/lemmi/zuppiera/7551
Struttura URL:
- Base:
https://www.atliteg.org/lemmi/ - Slug lemma: versione URL-friendly del lemma
- ID numerico:
IdLemma
Uso nel frontend:
- Link esterni per approfondimenti
- LemmaDetailsTable: colonna link
- Call-to-action per maggiori dettagli
- Potenziale integrazione API
LEMMA (1) ─────┬───── (N) ATTESTAZIONI
│
└─ IdLemma (chiave)
└─ Lemma (etichetta)
└─ URL (riferimento)
ATTESTAZIONE
├─ IdLemma (FK)
├─ Forma (variante)
├─ Localizzazione
│ ├─ Coll.Geografica
│ └─ Tipo coll.Geografica
├─ Temporalizzazione
│ ├─ Anno
│ ├─ Periodo
│ ├─ IDPeriodo
│ └─ Datazione
├─ Classificazione
│ ├─ Categoria (multi-value)
│ └─ Frequenza
└─ URL (riferimento)
- 1 Lemma → N Attestazioni (1:N)
- 1 Lemma → N Forme (1:N, mediamente 5 forme per lemma)
- 1 Forma → N Attestazioni (può essere attestata in più contesti)
- 1 Localizzazione → N Attestazioni (N:N)
- 1 Categoria → N Attestazioni (N:N)
Il dataset ha granularità a livello di attestazione singola:
- Ogni riga = 1 attestazione di 1 forma di 1 lemma in 1 contesto spazio-temporale
Concetto chiave: Il dataset documenta la variazione diatopica (geografica) del lessico gastronomico italiano storico. La relazione tra Lemma (termine base normalizzato) e Forma (variante attestata) è strettamente correlata alla granularità geografica dell'attestazione.
Analisi statistica delle 1.954 coppie forma-geografia uniche:
| Pattern di distribuzione | N. forme | % | Descrizione |
|---|---|---|---|
| Solo locale (città) | 1.411 | 72,2% | Forme attestate esclusivamente in contesti urbani specifici |
| Locale + Regionale | 154 | 7,9% | Forme condivise tra città e regioni |
| Solo regionale | 123 | 6,3% | Forme attestate solo a livello regionale |
| Solo macro-area | 105 | 5,4% | Forme attestate solo in ambiti sub/sovra-regionali |
| Trasversali (tutti i livelli) | 81 | 4,1% | Forme attestate in città, regioni E macro-aree |
| Locale + Macro | 54 | 2,8% | Forme in città e macro-aree (ma non regioni) |
| Regionale + Macro | 26 | 1,3% | Forme in regioni e macro-aree (ma non città) |
Forme locali (72,2%):
- Rappresentano varianti dialettali strettamente legate a un centro urbano
- Riflettono particolarità grafiche/fonetiche di scriptae locali
- Esempi:
aggiada(Genova),aggiadda(Genova) per il lemmaagliata
Forme regionali:
- Indicano koinè regionali o forme standardizzate a livello di regione storica
- Possono rappresentare forme di prestigio regionale
- Esempi:
brasole(Lazio, Toscana) per il lemmabraciola
Forme macro-areali:
- Documentano isoglosse sovra-regionali
- Riflettono aree linguistiche omogenee (es. Italia mediana, Italia meridionale intermedia)
- Esempi:
brasciola(Italia meridionale intermedia) per il lemmabraciola
Forme trasversali (4,1%):
- Rappresentano forme panitaliane o standardizzate
- Attestate a tutti i livelli geografici, spesso la forma più conservativa
- Esempi:
agliata,agresta,agresto,amido
Analisi di 365 lemmi:
- 189 lemmi (51,8%) hanno forme attestate solo a livello città
- 165 lemmi (45,2%) hanno forme su più livelli geografici
- 142 lemmi (38,9%) hanno forme sia in città che in regioni
- 6 lemmi (1,6%) hanno forme attestate solo a livello regionale
Lemmi con alta variazione geografica (esempi):
-
pane: 50 forme distinte- 49 forme a livello città:
pain,pains,pambollito,pan azimo,pan bagnato, ecc. - 6 forme a livello regione:
pan,panata,pane, ecc. - 4 forme macro-areali:
pane,panello, ecc.
- 49 forme a livello città:
-
cacio: 30 forme distinte- 24 forme a livello città:
caccio,cacio,caciola,cascetto, ecc. - 11 forme a livello regione:
cacio,cascio,caseo, ecc. - 7 forme macro-areali:
casci,casciata, ecc.
- 24 forme a livello città:
-
braciola: 28 forme distinte- 27 forme a livello città:
braciola,bracioletta,braciolettine, ecc. - 4 forme a livello regione:
braciole,brasciole,brasole,braxolle - 1 forma macro-areale:
brasciola(Italia meridionale intermedia)
- 27 forme a livello città:
-
frittella: 30 forme distinte- 23 forme città, 8 forme regione, 8 forme macro-areali
- Forte variazione grafica:
affrittellano,afrittellate,frictella, ecc.
Il dataset permette di ricostruire una gerarchia di diffusione:
LEMMA (concetto astratto)
│
├─── FORMA STANDARD/TRASVERSALE (panitaliana)
│ ├─ Attestata in macro-aree
│ ├─ Attestata in regioni
│ └─ Attestata in città
│
├─── FORMA REGIONALE (koinè)
│ ├─ Attestata in regioni specifiche
│ └─ A volte estesa a città della regione
│
└─── FORMA LOCALE (dialettale)
└─ Attestata solo in città specifica
Esempio pratico - Lemma agliata:
agliata (lemma base - salsa all'aglio)
│
├─ "agliata" [TRASVERSALE]
│ ├─ Toscana sud-orientale (ambito sub-regionale)
│ ├─ Italia mediana (ambito sovra-regionale)
│ ├─ Lazio, Toscana, Lombardia (regioni)
│ └─ Venezia, Napoli, Roma, Firenze, Ferrara (città)
│
├─ "alleata" [LOCALE - variante napoletana medievale]
│ └─ Napoli (1314, 1366)
│
├─ "alleatam" [LOCALE - forma latina]
│ └─ Napoli, Bolzano (XIV-XV sec.)
│
├─ "aggiada" [LOCALE - variante genovese]
│ └─ Genova (1893)
│
└─ "aggiadda" [LOCALE - ulteriore variante genovese]
└─ Genova (1893)
Visualizzazioni consigliate:
-
Mappa coropletica stratificata:
- Livello 1 (zoom out): macro-aree con forme sovra-regionali
- Livello 2 (zoom medio): regioni con forme regionali
- Livello 3 (zoom in): città con forme locali specifiche
-
Grafo relazionale Lemma-Forme:
- Nodo centrale: lemma
- Nodi satelliti: forme
- Colore nodi: tipo geografico (città=blu, regione=verde, macro=arancione)
- Dimensione nodi: frequenza
-
Timeline evoluzione forme per area:
- Asse X: tempo (Anno)
- Asse Y: livello geografico (città, regione, macro-area)
- Punti: attestazioni di forme specifiche
- Colori: forme diverse
-
Heatmap variazione dialettale:
- Righe: lemmi
- Colonne: aree geografiche
- Calore: numero forme distinte
- Identifica lemmi con alta variabilità geografica
Filtri avanzati:
- Per pattern geografico: "Mostra solo forme locali", "Mostra solo forme trasversali"
- Per variabilità: "Lemmi con >10 forme", "Lemmi con forme in tutte le regioni"
- Per conservatività: "Forme attestate solo nel periodo X ma in geografia Y"
Metriche derivate:
// Indice di variabilità geografica di un lemma
function calcolaIndiceVariabilitaGeografica(lemma) {
const forme = getFormeLemma(lemma);
const tipiGeo = new Set(forme.map(f => f.tipoGeografico));
const localitaUniche = new Set(forme.map(f => f.localita));
return {
numeroForme: forme.length,
livellGeografici: tipiGeo.size,
localitaCoperte: localitaUniche.size,
indice: (forme.length * tipiGeo.size) / localitaUniche.size
};
}
// Identifica forme "marker" di un'area
function identificaFormeMarker(area) {
return forme.filter(f =>
f.localita === area &&
!f.attestataAltrove
);
}Problema: Caratteri accentati corrotti
Esempi:
Citt�invece diCittàaar�soinvece diaarìsosuppa→s�pp�a
Impatto:
- Visualizzazione corrotta nel frontend
- Necessità di correzione o mapping
Soluzione proposta:
- Correzione batch del file sorgente
- Mapping dictionary per conversione
- Gestione fallback nel frontend
Problema: Record con periodo errato
Esempio:
Anno: 1526
Periodo: "I quarto dell'XI secolo"
IDPeriodo: 1
Causa: Probabile errore di data entry (XI secolo vs XVI secolo)
Impatto: Filtri temporali incoerenti
Soluzione: Validazione e correzione basata su colonna Anno
Problema: Lemmi con trailing/leading spaces
Esempio: agnolotto (con spazio finale)
Impatto:
- Confronti stringa falliti
- Duplicati apparenti
Soluzione: Trim automatico in fase di parsing
Problema: Campo testuale senza formato standard
Esempi:
16091820, 6ª ed.fine XV sec.-inizio XVI sec.7 gennaio 1554 - 23 ottobre 1556
Impatto: Difficile parsing automatico per filtri
Soluzione: Utilizzare colonne Anno e IDPeriodo per filtri programmatici
Problema: Campo testuale con separatore virgola
Esempio: Carni derivati e preparazioni a base di carne,Condimenti vari
Impatto:
- Necessità di splitting per analisi
- Complessità filtri
Soluzione:
- Parsing lato frontend
- Normalizzazione categorie
- UI multi-select
Priorità alta:
- Correzione encoding UTF-8: fix caratteri accentati all'import
- Trim stringhe: rimuovere spazi irregolari
- Parsing categorie: split multi-valore in array
- Normalizzazione località: mapping per geocoding
- Aggregazione forme per livello geografico: calcolare metriche di variazione diatopica
Esempio codice parsing:
function parseCSVRow(row) {
return {
idLemma: parseInt(row.IdLemma),
lemma: row.Lemma.trim(),
forma: row.Forma.trim(),
localita: fixEncoding(row['Coll.Geografica']),
tipoLocalita: fixEncoding(row['Tipo coll.Geografica']),
anno: parseInt(row.Anno),
periodo: row.Periodo,
idPeriodo: parseInt(row.IDPeriodo),
datazione: row.Datazione,
categorie: row.Categoria.split(',').map(c => c.trim()),
frequenza: parseInt(row.Frequenza),
url: row.URL
};
}
// Funzione per classificare livello geografico
function classificaLivelloGeografico(tipoLocalita) {
if (tipoLocalita.includes('Citt')) return 'locale';
if (tipoLocalita === 'Regione') return 'regionale';
if (tipoLocalita.includes('sub')) return 'sub-regionale';
if (tipoLocalita.includes('sovra')) return 'sovra-regionale';
return 'altro';
}
// Funzione per aggregare forme per lemma e geografia
function aggregaFormePerGeografia(attestazioni) {
const lemmi = {};
attestazioni.forEach(att => {
if (!lemmi[att.idLemma]) {
lemmi[att.idLemma] = {
lemma: att.lemma,
formeLocali: new Set(),
formeRegionali: new Set(),
formeSubRegionali: new Set(),
formeSovraRegionali: new Set(),
formeTrasversali: new Set()
};
}
const livello = classificaLivelloGeografico(att.tipoLocalita);
switch(livello) {
case 'locale':
lemmi[att.idLemma].formeLocali.add(att.forma);
break;
case 'regionale':
lemmi[att.idLemma].formeRegionali.add(att.forma);
break;
case 'sub-regionale':
lemmi[att.idLemma].formeSubRegionali.add(att.forma);
break;
case 'sovra-regionale':
lemmi[att.idLemma].formeSovraRegionali.add(att.forma);
break;
}
});
// Identifica forme trasversali
Object.values(lemmi).forEach(lemma => {
const alleForme = new Set([
...lemma.formeLocali,
...lemma.formeRegionali,
...lemma.formeSubRegionali,
...lemma.formeSovraRegionali
]);
alleForme.forEach(forma => {
let presenzeLivelli = 0;
if (lemma.formeLocali.has(forma)) presenzeLivelli++;
if (lemma.formeRegionali.has(forma)) presenzeLivelli++;
if (lemma.formeSubRegionali.has(forma) || lemma.formeSovraRegionali.has(forma)) presenzeLivelli++;
if (presenzeLivelli >= 3) {
lemma.formeTrasversali.add(forma);
}
});
});
return lemmi;
}Indici consigliati per performance:
- IdLemma: raggruppamento forme
- Anno: filtri temporali
- IDPeriodo: ordinamento cronologico
- Coll.Geografica: filtri geografici
- Categorie: filtri tematici (array index)
Dashboard metrics:
- Lemmi per periodo:
GROUP BY IDPeriodo, COUNT DISTINCT IdLemma - Distribuzione geografica:
GROUP BY Coll.Geografica, SUM(Frequenza) - Categorie dominanti:
GROUP BY Categoria, COUNT(*) - Evoluzione forme:
GROUP BY IdLemma, Anno, COUNT DISTINCT Forma
- Dati: località, tipo località, frequenza aggregata
- Necessità: coordinate geografiche (geocoding)
- Interattività: click → dettagli attestazioni, filtri temporali
- Dati: categorie (split multi-valore), frequenza aggregata
- Gerarchia: categoria principale → sottocategorie
- Dimensione nodi: somma frequenze
- Dati: tutte le colonne per lemma selezionato
- Ordinamento: Anno, Frequenza, Localita
- Paginazione: se >50 attestazioni
- Filtri:
- Range temporale (Anno: 1314-1899)
- Periodo (dropdown 23 valori)
- Località (autocomplete)
- Tipo località (4 checkbox)
- Categorie (multi-select)
- Range frequenza (min-max)
Ottimizzazioni:
- Lazy loading: carica dati paginati
- Virtual scrolling: per liste lunghe
- Memoization: cache aggregazioni
- Web Workers: parsing CSV in background
- IndexedDB: cache locale dataset
Stima dimensioni:
- File CSV: ~1-2 MB
- Parsed JSON: ~3-5 MB
- Gestibile in memoria browser
Località da mappare (coordinate lat/lng):
Città principali:
- Roma, Napoli, Firenze, Torino, Milano, Bologna, Genova, Ferrara, Venezia, Mantova, Siena, Padova, Como, Macerata, Bolzano, Fermo
Regioni:
- Toscana, Lazio, Lombardia, Sicilia, Friuli-Venezia Giulia
Ambiti sub-regionali:
- Toscana sud-orientale, Toscana occidentale
Ambiti sovra-regionali:
- Italia mediana, Italia meridionale intermedia (coordinate centroidi approssimate)
Soluzione proposta: file JSON di mapping località → coordinate
{
"Roma": { "lat": 41.9028, "lng": 12.4964, "type": "Città" },
"Napoli": { "lat": 40.8518, "lng": 14.2681, "type": "Città" },
"Toscana": { "lat": 43.7711, "lng": 11.2486, "type": "Regione" }
}Struttura ottimale post-parsing:
interface Attestazione {
idLemma: number;
lemma: string;
forma: string;
localita: {
nome: string;
tipo: 'Città' | 'Regione' | 'Ambito geografico sub regionale' | 'Ambito geografico sovra regionale';
coordinate?: { lat: number; lng: number };
};
temporalita: {
anno: number;
periodo: string;
idPeriodo: number;
datazione: string;
};
categorie: string[];
frequenza: number;
url: string;
}
interface Lemma {
id: number;
lemma: string;
forme: string[];
attestazioni: Attestazione[];
statistiche: {
totaleAttestazioni: number;
frequenzaTotale: number;
periodoInizio: number;
periodoFine: number;
localitaUniche: number;
categorieUniche: string[];
};
url: string;
}| Metrica | Valore |
|---|---|
| Totale attestazioni | 6.236 |
| Lemmi unici | 365 |
| Forme uniche | 1.871 |
| Ratio forme/lemma | ~5,1 |
| Range temporale | 585 anni (1314-1899) |
| Località uniche | ~100+ |
| Categorie uniche | ~90 |
| Record multi-categoria | 1.714 (27,5%) |
| Frequenza media | 15,6 |
| Frequenza max | 2.120 |
Visualizzazioni consigliate:
- Timeline distribuzione attestazioni (anno x count)
- Mappa coropletica Italia (località x frequenza)
- Treemap categorie (categoria x frequenza)
- Top 10 lemmi (lemma x frequenza totale)
- Evoluzione forme (anno x count forme distinte)
- Heatmap spazio-temporale (località x periodo x frequenza)
const topLemmi = attestazioni
.reduce((acc, a) => {
acc[a.idLemma] = acc[a.idLemma] || { lemma: a.lemma, frequenza: 0 };
acc[a.idLemma].frequenza += a.frequenza;
return acc;
}, {});const evoluzioneCarni = attestazioni
.filter(a => a.categorie.includes('Carni derivati e preparazioni a base di carne'))
.reduce((acc, a) => {
acc[a.anno] = (acc[a.anno] || 0) + 1;
return acc;
}, {});function distribuzioneGeografica(idLemma) {
return attestazioni
.filter(a => a.idLemma === idLemma)
.reduce((acc, a) => {
acc[a.localita.nome] = (acc[a.localita.nome] || 0) + a.frequenza;
return acc;
}, {});
}const categoriePeriodo = attestazioni
.reduce((acc, a) => {
const key = a.temporalita.periodo;
acc[key] = acc[key] || {};
a.categorie.forEach(cat => {
acc[key][cat] = (acc[key][cat] || 0) + 1;
});
return acc;
}, {});// Calcola indice di variabilità geografica
function analizzaVariazioneGeografica(idLemma) {
const attestazioni = getAttestazioniLemma(idLemma);
const formePerLivello = {
locale: new Set(),
regionale: new Set(),
subRegionale: new Set(),
sovraRegionale: new Set()
};
const formePerLocalita = {};
attestazioni.forEach(att => {
const livello = classificaLivelloGeografico(att.tipoLocalita);
if (livello === 'locale') formePerLivello.locale.add(att.forma);
if (livello === 'regionale') formePerLivello.regionale.add(att.forma);
if (livello.includes('sub')) formePerLivello.subRegionale.add(att.forma);
if (livello.includes('sovra')) formePerLivello.sovraRegionale.add(att.forma);
if (!formePerLocalita[att.localita]) {
formePerLocalita[att.localita] = new Set();
}
formePerLocalita[att.localita].add(att.forma);
});
return {
totaleFormeUniche: new Set(attestazioni.map(a => a.forma)).size,
formeLocali: formePerLivello.locale.size,
formeRegionali: formePerLivello.regionale.size,
formeSubRegionali: formePerLivello.subRegionale.size,
formeSovraRegionali: formePerLivello.sovraRegionale.size,
localitaConFormeUniche: Object.entries(formePerLocalita)
.filter(([_, forme]) => forme.size === 1)
.map(([loc, _]) => loc),
indiceVariabilita: (
formePerLivello.locale.size +
formePerLivello.regionale.size +
formePerLivello.subRegionale.size +
formePerLivello.sovraRegionale.size
) / Object.keys(formePerLocalita).length
};
}// Trova forme attestate esclusivamente in una specifica area geografica
function identificaFormeMarker(areaGeografica, tipoArea = 'Città') {
const formeArea = attestazioni
.filter(a => a.localita === areaGeografica && a.tipoLocalita === tipoArea)
.map(a => ({ forma: a.forma, lemma: a.lemma, idLemma: a.idLemma }));
const formeMarker = [];
formeArea.forEach(({ forma, lemma, idLemma }) => {
const attestazioniForma = attestazioni.filter(a =>
a.idLemma === idLemma && a.forma === forma
);
const soloInQuestArea = attestazioniForma.every(a =>
a.localita === areaGeografica
);
if (soloInQuestArea) {
formeMarker.push({
lemma,
forma,
frequenzaTotale: attestazioniForma.reduce((sum, a) => sum + a.frequenza, 0),
periodoInizio: Math.min(...attestazioniForma.map(a => a.anno)),
periodoFine: Math.max(...attestazioniForma.map(a => a.anno))
});
}
});
return formeMarker.sort((a, b) => b.frequenzaTotale - a.frequenzaTotale);
}
// Esempio di utilizzo
const formeGenovesi = identificaFormeMarker('Genova', 'Città');
// Risultato: forme come "aggiada", "aggiadda" per il lemma "agliata"// Traccia la diffusione geografica di una forma nel tempo
function tracciaEvoluzioneForma(idLemma, forma) {
const attestazioniForma = attestazioni
.filter(a => a.idLemma === idLemma && a.forma === forma)
.sort((a, b) => a.anno - b.anno);
const timeline = attestazioniForma.map(att => ({
anno: att.anno,
localita: att.localita,
tipoLocalita: att.tipoLocalita,
livelloGeografico: classificaLivelloGeografico(att.tipoLocalita),
frequenza: att.frequenza
}));
// Analizza pattern di espansione geografica
const livelli = [...new Set(timeline.map(t => t.livelloGeografico))];
const espansioneGeografica = livelli.length > 1;
const direzioneDiffusione = espansioneGeografica
? (livelli.includes('locale') && livelli.includes('regionale')
? 'dal_locale_al_regionale'
: 'pattern_complesso')
: 'stabile';
return {
forma,
timeline,
primaAttestazione: timeline[0],
ultimaAttestazione: timeline[timeline.length - 1],
durataDiffusione: timeline[timeline.length - 1].anno - timeline[0].anno,
livelliGeografici: livelli,
direzioneDiffusione,
localitaRaggiunta: [...new Set(timeline.map(t => t.localita))]
};
}- Fix encoding UTF-8 caratteri accentati
- Trim spazi superflui
- Parse categorie multi-valore
- Validazione anomalie temporali
- Creazione mapping geocoding
- Definizione interfacce TypeScript
- Normalizzazione struttura dati
- Indicizzazione chiavi
- Aggregazioni pre-calcolate
- GlobalFilterBar con tutti i filtri
- GeographicalDistributionMap con mappa Italia
- LemmaCategoriesTreemap con gerarchia
- LemmaDetailsTable con sorting/paging
- Dashboard metriche riepilogative
- Implementazione lazy loading
- Cache IndexedDB
- Web Workers parsing
- Ottimizzazione rendering liste
- Test parsing dataset completo
- Test filtri combinati
- Test performance con 6K record
- Test edge cases (encoding, nulls)
- Lemma: Forma normalizzata/dizionariale di una parola (headword), rappresenta il concetto lessicale astratto
- Forma: Variante grafica, fonetica o morfologica attestata nelle fonti storiche
- Attestazione: Occorrenza documentata di un termine in un contesto specifico spazio-temporale
- Corpus: Insieme dei testi analizzati
- Frequenza: Numero di occorrenze di una forma nel corpus
- Variazione diatopica: Variazione linguistica nello spazio geografico (dialettale)
- Isoglossa: Linea geografica che delimita l'estensione di un fenomeno linguistico
- Koinè: Varietà linguistica sovraregionale, forma di compromesso tra dialetti
- Scripta: Tradizione scrittoria locale con convenzioni ortografiche proprie
- Forma locale: Variante attestata esclusivamente in una o più città specifiche (es.
aggiada→ solo Genova) - Forma regionale: Variante attestata solo a livello di regione/i (es.
brasole→ Lazio e Toscana) - Forma macro-areale: Variante attestata in ambiti sub-regionali o sovra-regionali (es.
brasciola→ Italia meridionale intermedia) - Forma trasversale: Variante attestata a tutti i livelli geografici - città, regioni e macro-aree (es.
agliata) - Forma marker: Variante esclusiva di un'area geografica, indicatore di specificità dialettale
- Forma panitaliana: Forma standardizzata o di grande diffusione attestata in molteplici aree geografiche
- Forma di prestigio: Variante che si diffonde da un centro culturale importante ad aree limitrofe
- Variante conservativa: Forma arcaica mantenuta in area geografica limitata
- Espansione geografica: Processo di diffusione di una forma da un livello locale a uno regionale/macro
- Treemap: Visualizzazione gerarchica con aree proporzionali ai valori
- Geocoding: Conversione nome località → coordinate geografiche (latitudine, longitudine)
- Long tail distribution: Distribuzione statistica con molti valori bassi e pochi molto alti
- Granularità geografica: Livello di dettaglio della localizzazione (città < regione < macro-area)
- Indice di variabilità: Metrica che quantifica la diversità delle forme di un lemma su più livelli geografici
Questo dataset rappresenta una risorsa linguistica preziosa per:
- Ricerca storico-linguistica: evoluzione del lessico gastronomico
- Digital humanities: analisi diacroniche e geocentriche
- Didattica: insegnamento storia della lingua italiana
- Divulgazione: accessibilità patrimonio linguistico-culturale
Il frontend deve bilanciare:
- Rigore scientifico: preservare complessità e sfumature dei dati
- Accessibilità: rendere fruibili pattern e insight a utenti non specialisti
- Performance: gestire efficacemente volume dati e interattività