Nu har det varit obegripligt tyst här på bloggen ett bra tag, trots att det hänt massor som är värt att berätta om. Eller så är det just för att det hänt massor som det varit tyst på bloggen.
I vart fall så har sommaren ägnats åt lagen.nu-projektet, som nu går in i sin tredje månad. Jag har delat min tid ungefär lika mellan systemutveckling av själva teknikplattformen och projektledning av de som skriver. Den senare delen av arbetet är förstås den mest spännande, men den kan med fördel följas på lagen.nu-utveckling-listan, som jag tycker du ska gå med på. Eller så kan du bli ett fan av lagen.nu på facebook!
Men teknikutvecklingen har jag inte skrivit så mycket om varken här
eller där, så nu är det dags. Den ombyggnad som jag beskrev här, som
rör hur data från olika källor pusslas ihop med hjälp av SPARQL, har
driftssatts och funkar hyfsat bra. Jag har en del problem med Sesame,
där vissa saker tar omotiverat mycket tid, särskilt på
linuxplattformen, men det funkar iaf, sort of. Jag har också fått en
del tips på hur man kan undvika de långa kedjor av som
jag idag använder. Lösningen går ut på att tala om för Sesame att
dct:isPartOf är en TransitiveProperty och sedan be
Sesame använda inference — på det viset kan Sesame själv förstå att
. Exakt hur man faktiskt
gör det har jag dock inte läst mig till än.
Den nya versionen finns i betatest på ferenda.lagen.nu, och vana lagen.nu-besökare kommer se ett antal förändringar redan i den grafiska designen. Sidorna är uppbyggda med en smal högerkolumn som oftast visar någon innehållsförteckning eller liknande, samt två lika breda kolumner som visar själva dokumenttexten, samt metadata kring dokumentet, exempelvis en kommentar till en paragraf, eller en lista av rättsfall som hänvisar till paragrafen. Varje kategori av metadata visas i en box som kan expanderas eller kollapsas. Det finns även en ny kategori av rättsinformation vid sidan av “Lagar” och “Domar”, nämligen “Begrepp” (men säg inte till någon jurist att jag betraktar begrepp som en rättskälla, då blir jag anklagad för att syssla med begreppsjurisprudens).
Utöver denna nya formgivning finns även ett antal nya funktioner. Jag tänkte gå igenom två av dem och visa hur den RDF/SPARQL-baserade plattformen gjort det snabbare att lägga till dem. Att lägga till ny funktionalitet på lagen.nu innebär att på ett eller annat sätt utvinna data (dokument) och metadata (egenskaper hos dokument) om/från rättskällor, för att sedan presentera och framförallt korskoppla denna data/metadata.
“Lagrum som hänvisar hit”: Bredvid varje paragraf så finns det en box (med rubriken “Lagrumshänvisningar hit”) som innehåller en lista över olika ställen i denna eller andra lagar som hänvisar till den aktuella paragrafen. Minnesgoda bloggläsare känner igen detta från det paper jag och Christine Kirchberger skrev förra vintern. Det är också implementerat på ungefär samma sätt, med en SPARQL-fråga vars svar vävs ihop med lagtexten genom XSLT. Den största skillnaden är att jag vid sidgenereringen ställer ett antal olika SPARQL-frågor (en för varje boxtyp, ungefär), väver ihop svaren till en RDF/XML-fil, som sedan används från XSLT. Det finns lite kvar att göra på den här funktionen, framförallt kryptiska beteckningar i stil med “SFS 2000:1225, P1S4″ bytas ut mot kryptiska beteckningar i stil med “1 § 4 st lagen (2000:1225) om straff för smuggling”.
Den här funktionen kunde alltså realiseras med hjälp av metadata som redan fanns, och det system för att väva ihop data och medatada som också redan fanns. Den enda nyutvecklingen var en ny SPARQL-fråga och en ny funktion i XSLT-stylesheetet.
“Legaldefinitioner”: I lagtext finns det ofta olika typer av begreppsdefinitioner. Dessa definitioner förekommer vanligtvis i samband med någon form av fasta uttrycksformer:
Tabellform, exv PUL 3 §:
I denna lag används följande beteckningar med nedan angiven betydelse.
Beteckning Betydelse Personuppgifter All slags information som direkt eller indirekt kan hänföras till en fysisk person som är i livet.
Listform, exv LEK 1:7:
I lagen avses med
abonnent: den som har ingått avtal med en leverantör av allmänt tillgängliga elektroniska kommunikationstjänster om tillhandahållande av sådana tjänster,
Löpande form, exv PAL 2 §:
Med produkter avses i denna lag lösa saker. En produkt som har infogats eller på annat sätt blivit en beståndsdel i någon annan lös egendom eller i fast egendom skall alltjämt anses i lagens mening utgöra en produkt för sig.
Parantesform, exv JB 4:19 a
Köparen får inte åberopa att fastigheten är felaktig enligt 11, 12 och 17–19 §§, om han inte lämnar säljaren meddelande om felet inom skälig tid efter det att han märkt eller borde ha märkt felet (reklamation).
Brottsrubriceringsform, exv BrB 17:4
Den som, utan att fall är för handen som förut i detta kapitel är sagt, genom att sätta sig till motvärn eller eljest med våld söker hindra någon i hans myndighetsutövning, dömes för våldsamt motstånd till böter eller fängelse i högst sex månader.
En definition av ett begrepp som finns i lagtext kallas vanligen
legaldefinition och har förstås en särskild tyngd jämfört med de
definitioner som vi vanliga dödliga kan åstadkomma. Därför är det
intressant att försöka känna igen legaldefinitionsmässigt. Hur man gör rent
textprocessingsmässigt för att göra det tänker jag inte gå in på här,
men den korta versionen är att det inbegriper ett stort antal, allt
hårigare, regexpar. Den långa versionen finns i den allt mer feldöpta
funktionen _construct_ids. Det är i vart fall inte särskilt svårt, utan jobbet ligger mest i att hitta de olika uttrycksformerna och skriva testfall. Poängen
är att efter vi kört våra regexpar så har vi ytterligare drygt tusen
RDF-triples på formen:
<http://rinfo.lagrummet.se/publ/sfs/1962:700#K17P4>
dct:subject "Våldsamt motstånd"@sv
Under den nya fliken “Begrepp” har vi samlat begrepp från 3½ olika håll – de begrepp vi själva beskrivit i lagkommenteringsprojektet, de begrepp som används som sökord i rättsfall och de legaldefinitioner som vi utvunnit enligt ovan (samt information om huruvida svenska Wikipedia har en sida om begreppet).
För att skapa en sådan sida — exempelvis för begreppet “Konsument” – hämtar vi all data från Sesame. Tre SPARQL-frågor, samma process för att slå ihop svaren till en RDF/XML-fil, (nästan) samma process för att väva ihop ett källdokument (som i detta fallet bara innehåller själva begreppet som titel) med RDF-datan. Ny funktionalitet med ganska liten arbetsinsats.
(Även innehållsförteckningarna under flikarna “Lagar”, “Domar” och “Begrepp” genereras nu på samma sätt — in med en stor RDF-graf, några konfigurationsparametrar och ut kommer ett antal hundra sidor som sammanlagt bildar ett index över all information av en viss typ som finns i systemet).