P1-reportage om lagkommenteringsprojektet

För ett tag sedan gjorde P1-morgon ett reportage om lagkommenteringsprojektet, som sändes igår (och kan lyssnas på i efterhand). I reportaget berättar två av deltagarna, Daniel och Tizian, om vad projektet går ut på och varför det är viktigt. Jag tycker det blev ett riktigt bra reportage och det känns otroligt coolt att höra andra än mig själv förklara vad det är vi försöker bygga. Det är inte längre bara mitt lilla hobbyprojekt utan vårt försök att göra juridiken begriplig. En förändring som är nödvändig för att lyckas med det målet.

”Om jag får grovt bröd, så är jag fullkomligen nöjd”

I morse läste jag Lina Karlssons inlägg med anledning av Sakine Madons inlägg om hur den ekonomiska situationen för studenter ser ut. Som student kanske jag borde ha någon åsikt om debatten, men då min situation inte är särskilt typisk så vet jag inte om min erfarenhet är särskilt relevant.

Men sen runt lunch läste jag inför dagens seminarium i idéhistoria och stötte på följande intressanta brevväxling mellan Gustaf Andersson, student i Lund, och dennes föräldrar:

Den 26 oktober 1828:

Mitt bröd är nu jämt slut, oaktat jag ej på minsta sätt slösat, ty jag äter aldrig frukost eller merafton, men mår ändå bra, ty vår middag är merendels god och alltid mer än tillräcklig. Om mina goda föräldrar på något sätt kunde få skickat hit något bröd, likaså gärna grovt som knäckebröd, så vode det mig ändeligen tjänligt, ty det kostar mig för mycket att köpa bröd för hela november och kanske en god del av december. Om jag får grovt bröd, så är jag fullkomligen nöjd.

Den 7 februari 1830:

När jag kom hit, såg det ej för gott ut i mitt rum. Fönstren voro betäckta av is och denna ökas dagligen ty alls ingen värme förslår i det förskräckligt kalla rummet. Väggarna äro även betäckta av ganska tjock is och jag måste varje afton flytta sängen mitt fram på golvet för att ej alldeles förfrysa. Men det värsta av allt är att kölden ej det minsta lärer vilja lämna rummet förrän sommarvärmen en gång tvingar den bort. Jag sparar ej på veden, ty hälsan är mig kärare än en liten penningbesparing. Jag var så lycklig att få ett tämligen gott lass för 2 Rd. 40 sk.

Den 20 februari 1831:

Min tid är helt och hållen upptagen av arbete. Kl. 4 om morgnarna stiger jag upp och då läser Ekborn och jag latin till kl. 8. Från 8 till 10 läser jag för Zetterljung, med vilken jag ännu icke ackorderat, från 10–12 giver jag undervisning i latin för traktör Thornströms son och en annan, varför jag har fri mat både morgnar och aftnar, från 1/2 1 em. till 2 läser jag för desse samme. Från 2–4 har jag för egen räkning 2 privata lektioner. Från 4–7 skriver jag stilar och repeterar. Från 7 till 9 om aftonen läser åter Ekborn och jag latin tillsammans. Jag betalar en karl, som väcker mig om morgnarna, 36 sk. om månaden

(Ur Svensk idéhistoria, del II av Tore Frängsmyr, s 65)

Ok, argument av typen ”man ska vara tacksam, för det var mycket värre förr” är inte så tunga. Men det är å andra sidan inte ironiskt återberättande heller.

Specialbehandla eller arbeta runt?

Jag upptäckte just ett fel i SFST, dvs den databasen som innehåller alla svenska lagtexter i konsoliderad form, och som ligger till grund för lagen.nu Inget unikt med det, det förekommer fel där då och då, vilket jag vanligtvis märker genom att någon kodsnutt går sönder eftersom den inte var skriven för att indatat skulle vara så trasigtmärkligt. Över tiden har jag utvecklat ett system för att hantera sådana här felaktigheter – jag skriver helt enkelt en patch, som appliceras först av allt innan resten av parsekoden kör.

Som ett exempel på ett typiskt fel, kolla 3 § PUL i SFST:

3 § I denna lag används följande beteckningar med nedan angiven
betydelse.


Beteckning                      Betydelse

Behandling (av person)          Varje åtgärd eller serie av
uppgifter)                      åtgärder som vidtas i fråga om
                                personuppgifter, vare sig det
                                sker på automatisk väg eller inte,
                                t.ex. insamling, registrering,
                                organisering, lagring, bearbetning
                                eller ändring, återvinning, inhämtande,
                                användning, utlämnande genom
                                översändande, spridning eller annat
                                tillhandahållande av
                                uppgifter, sammanställning eller
                                samkörning, blockering,
                                utplåning eller förstöring.

Dvs vänstercellen i tabellen har en högerparantes där det borde vara ett bindestreck.

Detta löses genom en patch i unified diff-format. Den appliceras, resten av parsningen tar vid, resultatet blir fint (och, nota bene, med en liten förklaring om att texten faktiskt har ändrats – transparens är viktigt).

(jo, jag har rapporterat det upstream också, och de som sköter SFST vet var de kan hitta mitt patcharkiv. Vissa fel har rättats med tiden, men inte alla).

Generellt försöker jag låta bli att lösa parsningsproblem med en patch – i en korpus så stor som SFST kan man nästan utgå från att alla tänkbara klasser av fel förekommer fler gånger. Om det är möjligt att lösa problemet generellt i själva parsningen, genom någon typ av workaround, är det att föredra framför att specialbehandla lagtext för lagtext. Ovanstående fel tror jag inte är möjligt att hantera generellt.

Men nu har jag hittat ett fel som är sådär på gränsen: I köplagens första paragraf, fjärde stycket finns texten ”Vid köp av byggnad som uppförts för stadigvarande bruk gäller […] vad som föreskrivs i 4 kap. 11, 12 och 18–19d §§ jordabalken”

Felet här är i slutet av meningen – den avslutas med en lista av hänvisningar, där den sista går till 4 kap. 19 d § jordabalken. När lagstiftaren ändrar en lag så vill denne ibland stoppa in nya paragrafer mellan exv 19 § och 20 § — dessa får då beteckningarna 19 a §, 19 b § osv.

(Sidnot: Amerikanska lagstiftare har i allmänhet löst det här på ett sätt som är mer tilltalande för gamla basicprogrammerare – kolla exempelvis Oregons reglering av forumregler i civilmål och notera att numreringen lämnar gott om utrymme att stoppa in nya bestämmelser mellan de befintliga, vilket också görs då och då).

Det svenska sättet att stoppa in nya paragrafer gör det krångligare att skriva en parser för lagtext — den måste klara av uttrycket ”3 §”, ”3 och 4 §§”, ”3 e §”, ”3 eller 4 §” och många många fler (glöm för allt i världen inte att ”10 § f” är något helt annat än ”10 f §”). Den EBNF-grammatik som används har vuxit fram organiskt över några år, och kan ge känsliga personer mardrömmar.

Av den anledningen blir jag lite kallsvettig varje gång jag ser ett nytt sätt att hänvisa till lagrum som systemet inte klarar av att parsea. Exemplet ovan — som kan förenklas till ”19d § jordabalken” — är ett sådant. Med den skillnaden att hänvisningen faktiskt är felaktig: paragrafen har nummer ”19 d”, inte ”19d”.

Så frågan är: Ska jag fixa det med specialbehandling, dvs skriva en patch, eller ska jag försöka arbeta runt problemet genom att ändra min EBNF-grammatik? En vägledning kan man få genom grep — vi kan helt enkelt kolla hur många andra förekomster av det här felaktiga sättet att hänvisa som vi hittar:

find data/sfs/intermediate -name "*.txt" | xargs  egrep '[0-9][a-z] §'
data/sfs/intermediate/1980/770.txt:5 § Vid tillämpning av 11a § tredje stycket kungörelsen (1972:412 ) om
data/sfs/intermediate/1990/931.txt:kap. 11, 12 och 18--19d §§ jordabalken. Om en tomträttsupplåtelse enligt
data/sfs/intermediate/1995/238.txt:-- 22--23, 25--26, 30 och 35--44a §§ kungörelsen (1969:380) om
data/sfs/intermediate/1995/238.txt:vapenfri tjänst skall 12--17a §§ kungörelsen (1966:414) med vissa
data/sfs/intermediate/1996/844.txt:d) Bestämmelserna om sanktioner i 31a-31e §§ lokalradiolagen
data/sfs/intermediate/1997/1157.txt:reglerna, jfr 72a § lagen nr 612 den 24 juni 1996 om social
data/sfs/intermediate/1998/488.txt:stycket finns i 2a §. I fråga om utfärdande av nytt
data/sfs/intermediate/1999/1229.txt:Vad som sägs i 2 kap. 3 §, 6 kap. 5, 10a och 16a §§, 17kap.

Ok, åtta fel är inte jättemånga, men jag får väga risken av att introducera nya fel genom en ändrad grammatik (vilken hålls nere av ett stort batteri med testfall) mot det tråkiga och tidskrävande arbetet att göra åtta patchfiler (samt den potentiella nyttan av att de appliceras upstream).

Mer om semweb-utveckling och nya features på lagen.nu

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 w
dct:isPartOf x . x dct:isPartOf y . y dct:isPartOf z
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
w dct:isPartOf z. 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).