Archıvum

Om projektet

Archivum: semantisk søgning i Folketingets Åbne Data

Hvad er Archivum?

Archivum er et søgeværktøj til Folketingets dokumenter: lovforslag, betænkninger, spørgsmål og svar, samrådsmateriale og meget mere. Du kan søge i 674.006 dokumenter, i hele teksten og ned på den enkelte side.

Ud over almindelig søgning efter ord kan Archivum søge på betydning: du beskriver et emne med dine egne ord, og Archivum finder dokumenter om det, også når de bruger andre ord. Har du brug for den nøjagtige formulering, finder ordret søgning den.

Archivum er bygget til politologer, jurister, journalister og forskere, der har brug for hurtig og gennemsigtig adgang til parlamentariske dokumenter. Hvordan søgningen virker, står i den tekniske dokumentation nederst på siden.

Om udvikleren

Anders Kozuch
Anders KozuchAros Tech · Aarhus Universitet

Anders Kozuch er udvikleren bag Archivum og er kandidatstuderende på Institut for Statskundskab ved Aarhus Universitet samt ejer af software-firmaet Aros Tech. Anders er 27 år og selvlært programmør med en stærk profil inden for AI, data science og mobil app-udvikling. Han har arbejdet med parlamentariske og retlige dokumenter ad forskellige omgange undervejs i studiet, senest med sin bacheloropgave om regelvækst og vækst i embedsværket, som er udgivet i Djøfbladet og Administrativ Debat.

Kontakt

Anders Kozuchanders@arostech.dk

Har du spørgsmål til projektet, ønsker du adgang til rådata, eller vil du samarbejde, så skriv endelig.

Teknisk dokumentation

Her er detaljerne bag søgningen, for dig der vil vide præcis, hvad resultaterne betyder, eller skal beskrive metoden i en publikation.

1. Datakilde og dækning

Alle dokumenter kommer fra Folketingets Åbne Data (ODA), Folketingets offentlige database over sager, dokumenter, aktører og afstemninger. Archivum henter nye og ændrede dokumenter hver nat og gør dem søgbare, når deres tekst er udtrukket og indekseret. Tælleren "nye dokumenter siden i går" er netop det, nattens opdatering har tilføjet.

Søgningen dækker de dokumenter, der har en fil, typisk en PDF. Et dokument uden fil kan ikke findes i søgningen, men vises stadig i sagens forløb, når du åbner et andet dokument fra samme sag.

Tabellen over politikområder år for år, som forsidens graf bygger på, kan hentes som CSV: https://api.archivum.arostech.dk/api/stats/policy-areas-by-year?format=csv. Et dokument tæller én gang, under sit første politikområde, og tallet for det igangværende år vokser stadig.

2. Tekstudtræk (OCR)

Mange af Folketingets PDF-filer er scannede billeder uden tekstlag. Archivum læser dem med OCR (optisk tegngenkendelse) via Tesseract og dens danske sprogmodel, side for side. Hver side får en kvalitetsvurdering, så sider med dårlig genkendelse kan spores.

OCR er ikke fejlfri. Den mest mærkbare fejl er, at den danske model aldrig genkender paragraftegnet: § bliver til &, $ eller 8. Ordret søgning efter "§ 20" leder derfor også efter "& 20" og "$ 20". Den leder ikke efter "8 20", fordi den form ikke kan skelnes fra almindelige tal, fx "28 20". En § som tekstgenkendelsen har læst som 8, bliver derfor ikke fundet.

Nogle sider har slet ingen genkendt tekst, fx rene diagrammer eller blanke sider. De vises som "Ingen tekst udtrukket fra denne side".

3. Semantisk søgning: embeddings og cosinus-lighed

Hver side er omsat til en embedding: en liste med 1.536 tal, der beskriver sidens betydning. Embeddings laves med OpenAI-modellen text-embedding-3-small. Din søgning omsættes på samme måde, og Archivum sammenligner så din søgnings embedding med sidernes.

Sammenligningen er cosinus-lighed, et mål fra 0 til 1 for hvor meget to embeddings peger i samme retning. Tekster om det samme emne ligger tæt, også når de ikke deler et eneste ord. Et dokuments score er cosinus-ligheden for dets bedst matchende side, så et langt dokument med én relevant side findes lige så godt som et kort.

For at kunne søge i millioner af sider på få sekunder sker første gennemløb på en komprimeret udgave af embeddings (binær kvantisering), som finder kandidaterne hurtigt. De bedste kandidater beregnes derefter igen med fuld præcision, og det er den score, du ser i tabellen.

4. Relevans, antal resultater og "ca."

En semantisk søgning skærer ikke resultater fra. Den viser sine bedst placerede dokumenter i rækkefølge og mærker hvert med, hvor tæt dets bedste side ligger på søgningen: Stærk fra en cosinus-lighed på 0,60, Middel fra 0,47 og ellers Svag. Grænserne er faste, fordi OpenAIs embeddings sjældent scorer meget over 0,5 mod en kort søgning: "abort" når 0,39, et langt spørgsmål 0,73. En kort søgning kan derfor have lutter svage resultater og stadig give den rigtige liste. Tallet står, når du holder musen over mærket, og i eksporten.

Under "Flere filtre" kan du slå en fast grænse for relevans til. Så vises kun dokumenter over grænsen. Links delt før denne ændring har grænsen 0,50 med og beholder den.

"Antal resultater" er længden af listen: du får så mange af de bedst placerede dokumenter. Uden en fast grænse er totalen derfor listens længde og ikke et antal matches, og der står "mest relevante" i stedet for "ca.". Med en fast grænse kan totalen kun anslås, fordi første gennemløb er tilnærmet, og så står der "ca." foran. Fordelingerne i sidepanelet tæller over den samme liste.

5. Ordret søgning

Ordret søgning finder den nøjagtige tekststreng i sidernes udtrukne tekst. Som standard skelnes der ikke mellem store og små bogstaver. Dokumenterne rangeres efter, hvor mange gange teksten forekommer, og kolonnen "Hits" viser antallet.

Fordi søgningen sker i den udtrukne tekst, findes et ord kun, hvis OCR har genkendt det korrekt. Se afsnittet om tekstudtræk ovenfor.

6. Politikområder (CAP)

Politikområderne følger Comparative Agendas Project (CAP), en international standard for at kode politisk indhold i godt 20 hovedområder og omkring 200 underområder. Hvert underområde er beskrevet i tekst, og beskrivelserne er omsat til embeddings på samme måde som siderne.

Et dokument får de underområder, hvis embeddings ligger tættest på dokumentets egne, rangeret efter cosinus-lighed. Det er en automatisk klassifikation, ikke en manuel kodning. Sikkerheden vises som Lav (under 0,45), Middel (0,45 til 0,60) eller Høj (fra 0,60), og holder du markøren over, ser du tallet.

7. Sager og forløb

Sagsoplysningerne kommer også fra ODA: hvilken sag et dokument hører til, sagens trin (fx 1. behandling, betænkning og vedtagelse) og sagens øvrige dokumenter. Spørgsmål og svar parres via Folketingets egen henvisning fra svaret til spørgsmålet.

Sagsstatus vises ikke, fordi den i ODA ofte ikke bliver opdateret: sager, der tydeligvis er afsluttet, står stadig som igangværende. Hurtigsøgningerne "Vedtagne finanslove" og "Dokumenter om finanslove" bruger Folketingets eget flag for statsbudgetsager.

8. Hastighed og caching

Resultatet af hver søgning gemmes. Gentager du en søgning, eller har en anden søgt på det samme, kommer svaret med det samme. En helt ny semantisk søgning skal først omsætte din tekst til en embedding og gennemsøge indekset, hvilket typisk tager få sekunder og længere, jo flere resultater du beder om.