DiarioBOE
Laboratorio DiarioBOE

El BOE como un grafo de vigencia

La legislacion espanola se modifica, deroga y sustituye constantemente. Pero esa red de relaciones no esta publicada en ningun sitio: vive sepultada dentro del XML de cada documento del BOE. La hemos extraido del corpus completo, la hemos rendereado con WebGL y la hemos conectado al chat RAG para que las respuestas sepan distinguir una norma vigente de una derogada hace anos.

2.329.691
documentos BOE analizados
corpus completo desde 1960
69.659
normas en el grafo
el 3% del corpus tiene relaciones de vigencia
80.364
aristas de vigencia
derogaciones, modificaciones, sustituciones, prorrogas
33.021
nodos en el componente gigante
47% del grafo conectado en una sola maraña

Por que un grafo de vigencia

Cuando alguien pregunta a un buscador o a un chat legal por una norma, el sistema casi nunca sabe si esa norma sigue en vigor. La derogacion no se publica como un campo limpio: se anuncia dentro del texto de la norma posterior, en una etiqueta XML <referencias> con un codigo numerico (270 = modifica, 210 = deroga, 470 = sentencia que anula...). Esa informacion existe, pero esta enterrada en 2,3 millones de ficheros.

Hemos recorrido ese corpus, hemos extraido todas las aristas de vigencia fuerte y las hemos montado en un grafo dirigido donde cada flecha A → B significa A modifica / deroga / sustituye a B. El resultado es una cartografia que permite, dada cualquier norma, responder a tres preguntas que ahora mismo cuestan horas de busqueda manual: esta vigente, que la modifico ultimo, que afecta este articulo concreto.

Como se construye

  1. 1
    Recorrido paralelo de los 2,3M XMLs en documentos_raw/ con 18 workers (multiprocessing). El corpus completo se procesa en unos 45 segundos.
  2. 2
    Extraccion de aristas fuertes: solo los 12 codigos de la tabla siguiente, y solo desde la seccion <anteriores> (los <posteriores> se calculan al reves para evitar duplicar). Se descartan IDs malformados con regex.
  3. 3
    Reduccion a componentes conexos con union-find. Salen 12.176 componentes, uno gigante de 33.021 nodos y una cola larga de pares y triadas aisladas.
  4. 4
    Render por escala: los componentes pequenos (< 200 nodos) se rinden con Pyvis / vis.js como HTML interactivo. El componente gigante se precomputa con graphviz sfdp (~37 s) y se entrega con sigma.js sobre WebGL para que aguante decenas de miles de nodos sin congelar el navegador.

Taxonomia de aristas

El BOE codifica cada relacion entre normas con un numero de tres cifras. Estas son las 12 que cuentan para vigencia, ordenadas por frecuencia en el corpus.

codigo
tipo
aristas
semantica
270
MODIFICA
36.101
redaccion nueva en articulos concretos
210
DEROGA
25.997
derogacion total o parcial - el destino deja de aplicar
470
DECLARA
5.454
sentencia de nulidad o inconstitucionalidad
426
TRANSPONE
3.049
implementa directiva UE (destino DOUE)
406
AMPLIA
2.820
amplia alcance del destino
407
ANADE
1.572
introduce articulos nuevos en destino
404
ACTUALIZA
1.457
actualizacion de cuantias o anexos
401
PRORROGA
1.422
extiende vigencia temporal
230
DEJA SIN EFECTO
1.040
derogacion administrativa
245
SUSTITUYE
896
reemplazo de elemento (anexo, modelo)
480
DECLARA VIGENCIA
344
confirma vigencia del destino
303
PUBLICA TEXTO REVISADO
212
refundido o consolidacion

Hallazgos sobre el corpus

3%
Solo el 3% del corpus BOE entra en el grafo. La mayoria de los documentos publicados son anuncios, convocatorias, edictos y subastas que no modifican normas previas.
9.136
Nodos huerfanos: normas referenciadas que no tienen XML en el corpus local. 6.292 son BOE-A antiguos (40s a 90s), 2.515 son directivas UE (DOUE-L), el resto boletines autonomicos.
BOE-A-2017-7353
La norma con mas aristas salientes (273): la Ley 5/2017 de medidas fiscales, administrativas, financieras. Una sola ley reorganizo o modifico 273 normas distintas.
BOE-A-1994-14960
La norma mas referenciada del corpus (126 entradas): el Reglamento de planes y fondos de pensiones, modificado una y otra vez durante 30 anos.

Aplicacion al chat legislativo

El grafo no es un fin en si mismo. Su utilidad real esta en el chat RAG de DiarioBOE: cuando el sistema recupera fragmentos de normas para responder a una pregunta, cruza cada chunk contra el grafo y aplica una penalizacion multiplicativa sobre el rank del fragmento, segun lo afectado que este por modificaciones posteriores.

x0.40
norma derogada total o dejada sin efecto
x0.45
afectada por sentencia (nulidad o inconstitucionalidad)
x0.55
otro articulo del mismo documento fue derogado parcialmente
x0.85
el articulo concreto del chunk fue modificado, anadido o sustituido
x0.95
la norma tuvo modificaciones pero no alcanzan a este chunk

Ademas, el chat anade avisos estructurados al prompt del LLM con la lista deduplicada de modificaciones que afectan a los chunks usados, incluyendo fecha ISO y la cita literal del texto que aparece en el XML del BOE. El LLM ya no responde "el articulo 5 dice X" sin saber que ese articulo fue reescrito en 2021: ahora sabe que existe la modificacion y la cita.

Explora el grafo

El visor lista los 30 componentes mas grandes del grafo, ordenados por tamano. Cada uno abre en una pagina aparte con drag, zoom y hover sobre nodos y aristas. El componente gigante (33.021 nodos) usa WebGL y trae filtros vivos por tipo de relacion, rango de anos y grado minimo del nodo.

Notas tecnicas

  • Datos de origen: corpus XML del BOE en formato oficial, con su tag <referencias> sin alterar. La extraccion es deterministica y reproducible.
  • El grafo se reconstruye ente desde cero en menos de un minuto sobre los 2,3M de XMLs, asi que se puede regenerar cada vez que entra material nuevo al archivo.
  • La visualizacion del componente gigante pesa unos 13 MB de HTML autocontenido. Se recomienda conexion estable; abre bien en cualquier navegador moderno con WebGL.
  • Los XMLs huerfanos (sentencias del TS, directivas UE, boletines autonomicos) aparecen en el grafo como diamantes grises: tenemos el enlace pero no el documento de origen.