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.
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
- 1Recorrido paralelo de los 2,3M XMLs en
documentos_raw/con 18 workers (multiprocessing). El corpus completo se procesa en unos 45 segundos. - 2Extraccion 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. - 3Reduccion 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.
- 4Render 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.
270210470426406407404401230245480303Hallazgos sobre el corpus
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.
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.