Fork Lab di ahmeabd/italia-corpus. Corpus della legislazione italiana in Markdown da Normattiva, con tooling per estrazione metadati e ricerca full-text via MCP.
Il fork Lab mantiene solo le collezioni di attualità normativa (~25.000 file, ~1.2 GB):
DL e leggi di conversione · Decreti Legislativi · Leggi di ratifica · Regolamenti ministeriali · Regolamenti governativi · DPCM · Atti di recepimento direttive UE · Atti di attuazione Regolamenti UE · DL decaduti · DL proroghe · Decreti legislativi luogotenenziali · Leggi delega e relativi provvedimenti delegati · Leggi costituzionali · Leggi finanziarie e di bilancio · Leggi contenenti deleghe · Regolamenti di delegificazione · Regi decreti legislativi · Testi Unici · Codici
(Il full corpus upstream ha 288.000+ file, il 90% dei quali è legislazione storica: atti abrogati, regi decreti, DPR.)
Tre tool per agenti AI:
-
italia-corpus_legal_search(query, limit=10, offset=0, collezione="")— cerca nel corpus e restituisce lista strutturata di risultati (list[dict]contitle,collection,filename,path,snippet,match_count).- Query multi-parola fa AND documentale tra i termini (es.
"ambiente energia"trova atti che contengono entrambi). - Usa virgolette
"decreto legislativo"per frase esatta. offsetper paginazione,limitfino a 100.collezioneopzionale per limitare a una directory.
- Query multi-parola fa AND documentale tra i termini (es.
-
italia-corpus_legal_get_document(collezione, filename, max_chars=5000)— recupera il testo completo di un atto. Protegge da path traversal (solo basename.md, verifica risoluzione path). -
italia-corpus_list_collections()— elenca le 20 collezioni disponibili.
Parsa tutti i file Markdown delle 20 collezioni ed estrae: tipo atto, data, numero, oggetto, URN, codice redazionale, vigente, CELEX (costruito dal riferimento UE nell'oggetto), anno direttiva e ritardo di recepimento.
Output: data/derived/normativa.parquet (20.708 atti, 755 con CELEX).
pip install -e ".[dev]"
python -m lab_tools.extractCostruisce il grafo orientato dei riferimenti normativi: estrae tutti i link ../ dai body degli atti e produce archi "fonte → bersaglio" con metadati (anno, collezione, tipo). Richiede normativa.parquet per l'arricchimento.
Output: data/derived/riferimenti.parquet (108.490 archi, 10 colonne).
| Metrica | Valore |
|---|---|
| Archi totali | 108.490 |
| Risolvibili (file nel fork) | 70.589 (65,1%) |
| Atti citati unici | 9.095 |
| Più citato | Codice Penale (7.815x) |
python -m lab_tools.grafo_riferimenti| Workflow | Trigger | Cosa fa |
|---|---|---|
test.yml |
push / PR | pytest tests/ -v |
build-dataset.yml |
workflow_dispatch | test → extract + grafo riferimenti → commit parquet |
sync-upstream.yml |
daily 7:00 + manuale | sparse clone upstream → rsync collezioni → commit → trigger build-dataset |
| Colonna | Tipo | Descrizione |
|---|---|---|
collezione |
str | Collezione d'origine (separatore ; se multi-collezione) |
filename |
str | Nome file .md |
tipo |
str | DECRETO LEGISLATIVO, LEGGE, DECRETO-LEGGE, DPR, DPCM, ecc. |
data |
str | Data atto (ISO) |
numero |
str | Numero atto |
oggetto |
str | Oggetto / titolo |
celex |
str | CELEX costruito dal riferimento UE nell'oggetto (es. 32019L0944) |
anno_atto |
int | Anno di pubblicazione |
anno_dir |
int | Anno della direttiva/regolamento/decisione UE collegato (0 se assente) |
ritardo |
float | Gap anni tra atto e atto UE (solo se anno_dir > 0) |
vigente |
bool | True se l'atto risulta vigente secondo Normattiva |
urn |
str | URN Normattiva (es. urn:nir:stato:decreto.legislativo:2021-11-08;207) |
codice_redazionale |
str | Codice redazionale Normattiva (es. 21G00230) |
lunghezza_caratteri |
int | Numero di caratteri del body (dopo frontmatter YAML) |
lunghezza_parole |
int | Numero di parole del body |
riferimenti_interni |
int | Conteggio link ../ ad altri atti del corpus (proxy di connessione) |
| Colonna | Tipo | Descrizione |
|---|---|---|
fonte_filename |
str | Path relativo atto citante |
fonte_collezione |
str | Collezione atto citante |
fonte_anno |
int | Anno atto citante |
fonte_tipo |
str | Tipo atto citante (es. DECRETO LEGISLATIVO) |
bersaglio_filename |
str | Nome file atto citato |
bersaglio_path |
str | Path relativo atto citato (vuoto se non risolvibile) |
risolto |
bool | True se il bersaglio esiste nel corpus |
bersaglio_collezione |
str | Collezione atto citato |
bersaglio_anno |
int | Anno atto citato |
bersaglio_tipo |
str | Tipo atto citato |
peso |
int | Numero occorrenze dello stesso link nel body |
- Il sync upstream è automatico ogni giorno alle 7:00. Clona upstream con
--depth 1 --filter=blob:nonee solo le 20 collezioni vive (sparse checkout), poi rsync--deleteper specchiare le directory. Zero merge, zero conflitti. - Dopo ogni sync,
build-datasetrigenera automaticamente il parquet (solo se ci sono modifiche). - Il dataset è committato su
main(data/derived/normativa.parquet).
- Upstream: ahmeabd/italia-corpus — MIT license
- Dati: Pubblico dominio (Normattiva)
- Lab: DataCivicLab