Skip to content

se-lex/sfs-processor

Repository files navigation

sfs-processor - Verktyg för konvertering av Svensk författningssamling

🇬🇧 Switch to English


Detta repository innehÄller Python-script för att konvertera SFS-författningar (Svensk författningssamling) frÄn JSON-format till Markdown med temporala taggar, HTML, Git och andra format.

Note

Detta Àr en del av SE-Lex, lÀs mer om projektet hÀr.

SFS-författningar exporteras till https://github.com/se-lex/sfs och publiceras ocksÄ som HTML pÄ https://selex.se med stöd för EU:s juridiska identifieringsstandard (ELI).

Installation

  1. Se till att du har Python 3.11 eller senare installerat
  2. Installera nödvÀndiga beroenden:
pip install -r requirements.txt

Snabbstart

Konvertera JSON-filer med författningar till Markdown:

python sfs_processor.py --input sfs_json --output output/md --formats md-markers

Output-format

Verktyget kan generera författningar i flera olika format, beroende pÄ anvÀndningsomrÄde:

Markdown-format

  • md-markers (förvalt): Markdown med semantiska <section>-taggar och selex-attribut för juridisk status och temporal hantering
  • md: Rena Markdown-filer med normaliserade rubriknivĂ„er, lĂ€mpliga för visning och lĂ€sning. UtgĂ„r frĂ„n ett target-date (förvalt: dagens datum) för att visa hur lagen ser ut vid den tidpunkten

Git-format

  • git: Exporterar författningar som Git-commits med historiska datum, vilket skapar en versionshistorik av lagstiftningen

HTML-format

  • html: Genererar HTML-filer i ELI-struktur (/eli/sfs/{Ă„r}/{nummer}/index.html) för webbpublicering
  • htmldiff: Som HTML men inkluderar Ă€ven separata versioner för varje Ă€ndringsförfattning

HTML-filer kan publiceras via:

  • Cloudflare R2: Med html-export-workflow.yml (krĂ€ver R2-credentials)
  • GitHub Pages: Med github-pages-workflow.yml (enklare setup, krĂ€ver aktiverad GitHub Pages)

Vektor-format (för semantisk sökning)

  • vector: Konverterar författningar till vektorembeddings för semantisk sökning och RAG-applikationer. AnvĂ€nder OpenAI:s text-embedding-3-large modell (3072 dimensioner) och stödjer lagring i PostgreSQL (pgvector), Elasticsearch eller JSON-fil.

Exempel pÄ att kombinera flera format:

python sfs_processor.py --input sfs_json --output output --formats md,html,git

HÀmta kÀlldata

För att konvertera författningar behöver du först ladda ner JSON-data:

Ladda ner alla författningar frÄn Regeringskansliet

python downloaders/download_sfs_docs.py --ids all --source rkrattsbaser

Ladda ner specifika författningar

python downloaders/download_sfs_docs.py --ids "2024:675,2024:700" --source rkrattsbaser

Nedladdade filer sparas som standard i katalogen sfs_docs. Du kan ange annan katalog med --out parametern.

AnvÀndning

GrundlÀggande konvertering

Konvertera alla JSON-filer i en katalog till Markdown:

python sfs_processor.py --input sfs_json --output output/md --formats md-markers

Struktur av genererade Markdown-filer

Beroende pÄ vilket format du vÀljer fÄr du olika strukturer:

Format: md-markers (förvalt)

Markdown-filer med bevarad semantisk struktur genom <article> och <section>-taggar:

  • <article>: Omsluter hela författningen och kan innehĂ„lla temporala attribut (ikraft_datum, upphor_datum, etc.)
  • <section class="avdelning">: Omsluter avdelningar (divisions) som överordnad strukturell enhet
  • <section class="kapitel">: Omsluter kapitel som strukturell enhet med underliggande paragrafer
  • <section class="paragraf">: Omsluter varje paragraf (§) som en avgrĂ€nsad juridisk bestĂ€mmelse
<article selex:status="ikraft" selex:ikraft_datum="2025-01-01">

  # Lag (2024:123) om exempel

  <section class="avdelning" id="avd1">
  ## AVDELNING I. ALLMÄNNA BESTÄMMELSER

    <section class="kapitel" id="inledande-bestammelser">
    ### Inledande bestÀmmelser

      <section class="paragraf" id="inledande-bestammelser.1">
      #### 1 §
      InnehÄllet i paragrafen...
      </section>

    </section>

  </section>

</article>

Denna semantiska struktur bevarar dokumentets logiska uppbyggnad och möjliggör automatisk bearbetning, analys, och navigation av författningstexten. ID-attributen gör det möjligt att lÀnka direkt till specifika rubriker och paragrafer (t.ex. #inledande-bestammelser.1). Taggarna kan Àven anvÀndas för CSS-styling och JavaScript-funktionalitet.

OBS! Trots HTML-taggarna Àr filerna fortfarande fullt lÀsbara som Markdown :)

Format: md

Rena Markdown-filer med normaliserade rubriknivÄer, utan section-taggar:

# Lag (2024:123) om exempel

## Inledande bestÀmmelser

### 1 §

InnehÄllet i paragrafen...

### 2 §

Mer innehÄll...

Detta format Àr lÀmpligt för enkel visning och lÀsning, utan metadata eller temporal hantering.

Selex-attribut för juridisk status och datum

Förutom CSS-klasser anvÀnder <section>-taggarna Àven selex:-attribut för att hantera juridisk status och datum. Dessa attribut möjliggör filtrering av innehÄll baserat pÄ ikrafttrÀdande- och upphörandedatum:

  • selex:status: Anger sektionens juridiska status

    • ikraft: Sektionen innehĂ„ller ikrafttrĂ€danderegler (konverterat frĂ„n t.ex. "/TrĂ€der i kraft I:2025-01-01")
    • upphavd: Sektionen Ă€r upphĂ€vd (konverterad frĂ„n ifall rubrik innehĂ„ller "upphĂ€vd" eller "/Upphör att gĂ€lla")
  • selex:ikraft_datum: Datum dĂ„ sektionen trĂ€der ikraft (format: YYYY-MM-DD)

  • selex:upphor_datum: Datum dĂ„ sektionen upphör att gĂ€lla (format: YYYY-MM-DD)

  • selex:ikraft_villkor: Villkor för ikrafttrĂ€dande (nĂ€r inget specifikt datum anges)

Exempel pÄ selex-attribut:

<section class="kapitel" selex:status="ikraft" selex:ikraft_datum="2025-01-01">
### 1 § En paragraf
...
</section>

<section class="paragraf" selex:status="upphavd" selex:upphor_datum="2023-12-31">
#### 2 § En paragraf 
...
</section>

<section class="kapitel" selex:status="ikraft" selex:ikraft_villkor="den dag regeringen bestÀmmer">
### 3 § Rubrik pÄ villkorad ikrafttrÀdande
...
</section>

Dessa attribut anvÀnds automatiskt av systemets datumfiltrering för att skapa versioner av författningar som gÀller vid specifika tidpunkter. Sektioner med selex:upphor_datum som har passerat tas bort, och sektioner med selex:ikraft_datum som Ànnu inte har kommit tas bort frÄn den aktuella versionen.

Temporal processing för olika format

Systemet hanterar temporal processing (tidsbaserad filtrering) olika beroende pÄ vilket format som anvÀnds:

  • md-markers (förvalt): Bevarar selex-taggar och hoppar över temporal processing. Detta gör att alla temporal attribut behĂ„lls för senare bearbetning. Rekommenderas för att bevara all juridisk metadata.

  • md: TillĂ€mpar temporal processing med dagens datum som mĂ„lpunkt. Detta Ă€r viktigt att förstĂ„:

    • UpphĂ€vda bestĂ€mmelser (med selex:upphor_datum före dagens datum) tas bort
    • BestĂ€mmelser som Ă€nnu inte trĂ€tt i kraft (med selex:ikraft_datum efter dagens datum) tas bort
    • Selex-taggar tas bort efter filtrering
    • Resultatet blir en "ren" Markdown-vy av hur lagen ser ut idag
    • Obs: Eftersom temporal filtrering anvĂ€nds automatiskt, kan innehĂ„ll försvinna om det Ă€r upphĂ€vt eller ej ikrafttrĂ€tt
  • git: Hoppar över temporal processing i huvudbearbetningen. Temporal hantering sköts separat i git-arbetsflödet för att skapa historiska commits.

  • html och htmldiff: TillĂ€mpar temporal processing med dagens datum innan HTML-generering, liknande md-format.

  • vector: TillĂ€mpar temporal processing med dagens datum (eller angivet --target-date) innan vektorgenerering. Detta sĂ€kerstĂ€ller att endast gĂ€llande regelverk inkluderas i vektordatabasen.

Exempel med target-date

För att se hur en lag sÄg ut vid ett specifikt datum:

# Se hur lagen sÄg ut 2023-01-01
python sfs_processor.py --input sfs_json --output output/md --formats md --target-date 2023-01-01

Detta Àr anvÀndbart för att skapa historiska versioner eller för att förstÄ hur lagen sÄg ut vid en viss tidpunkt.

Kommandoradsalternativ

python sfs_processor.py [--input INPUT] [--output OUTPUT] [--formats FORMATS] [--filter FILTER] [--target-date DATE] [--no-year-folder] [--verbose]

Parametrar

  • --input: Input-katalog med JSON-filer (default: "sfs_json")
  • --output: Output-katalog för konverterade filer (default: "SFS")
  • --formats: Utdataformat att generera, kommaseparerat. Stödjer: md-markers, md, git, html, htmldiff, vector (default: "md-markers")
    • md-markers: Generera markdown-filer med section-taggar bevarade
    • md: Generera rena markdown-filer utan section-taggar
    • git: Aktivera Git-commits med historiska datum
    • html: Generera HTML-filer i ELI-struktur (endast grunddokument)
    • htmldiff: Generera HTML-filer i ELI-struktur med Ă€ndringsversioner
    • vector: Generera vektorembeddings för semantisk sökning
  • --filter: Filtrera filer efter Ă„r (YYYY) eller specifik beteckning (YYYY:NNN). Kan vara kommaseparerad lista.
  • --target-date: Datum (YYYY-MM-DD) för temporal filtrering, baserat pĂ„ selex-taggar. AnvĂ€nds med md, html, htmldiff och vector format för att filtrera innehĂ„ll baserat pĂ„ giltighetsdatum. Om inte angivet anvĂ€nds dagens datum. Exempel: --target-date 2023-01-01
  • --no-year-folder: Skapa inte Ă„rbaserade undermappar för dokument
  • --verbose: Visa detaljerad information om bearbetningen

Vektor-specifika parametrar

  • --vector-backend: Backend för vektorlagring (default: "json")
    • json: Spara till JSON-fil (för test/utveckling)
    • postgresql: PostgreSQL med pgvector-extension
    • elasticsearch: Elasticsearch med dense_vector
  • --vector-chunking: Strategi för att dela upp dokument (default: "paragraph")
    • paragraph: Dela per paragraf (§) - bevarar juridisk struktur
    • chapter: Dela per kapitel - större kontext
    • section: Dela per selex-sektion
    • semantic: Semantiska grĂ€nser med överlapp
    • fixed_size: Fast tokenantal med överlapp
  • --embedding-model: Embedding-modell (default: "text-embedding-3-large")
  • --vector-mock: AnvĂ€nd mock-embeddings för test utan OpenAI API-nyckel

Vektorexport för semantisk sökning

Vektorformatet (--formats vector) konverterar författningar till vektorembeddings som kan anvÀndas för semantisk sökning, RAG-applikationer (Retrieval-Augmented Generation) och AI-assistenter.

Hur det fungerar

  1. Temporal filtrering: Endast gÀllande regelverk inkluderas (samma som md/html mode)
  2. Intelligent chunking: Dokument delas upp pÄ ett sÀtt som bevarar juridisk struktur
  3. Embedding-generering: Text konverteras till vektorer med OpenAI text-embedding-3-large
  4. Lagring: Vektorer sparas till vald backend med fullstÀndig metadata

Exempel

# Test med mock-embeddings (utan API-nyckel)
python sfs_processor.py --formats vector --vector-mock --filter 2024:100

# Produktion med OpenAI (krÀver OPENAI_API_KEY miljövariabel)
python sfs_processor.py --formats vector --filter 2024

# Med PostgreSQL/pgvector backend
python sfs_processor.py --formats vector --vector-backend postgresql

# Med kapitel-chunking för större kontext
python sfs_processor.py --formats vector --vector-chunking chapter

Backends

Backend AnvÀndning Krav
json Test/utveckling Inga
postgresql Produktion PostgreSQL 12+ med pgvector
elasticsearch Produktion Elasticsearch 8.0+

Metadata som sparas

Varje vektor-chunk innehÄller:

  • document_id: Beteckning (t.ex. "2024:100")
  • chapter: Kapitelreferens (t.ex. "1 kap.")
  • paragraph: Paragrafreferens (t.ex. "1 §")
  • departement: Ansvarigt departement
  • effective_date: IkrafttrĂ€dande-datum

Bidra

Vi vĂ€lkomnar bidrag frĂ„n communityn! 🙌

About

Retrieves and transforms Swedish legislation published in the Swedish Code of Statutes (SFS), into multiple output formats such as Markdown (with temporal Selex tags), Git version history, and HTML.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Contributors

Languages