Relationer i SOUniversum

Att lägga ut sorlet från SOUer visade sig leda till intressanta uppslag. Bland annat har idé- och vetenskapshistorikern Gustav Holmberg gjort en inventering av amatörbegreppet genom hela SOU-korpuset, Copyriot har skrivit, och Peter Krantz på KB har gjort en graf av datamängden.

Väldigt roligt! Nu kommer en uppföljning som bitvis är teknisk, men som bör läsas mera som en humanvetenskaplig ingång som har råkat ta hjälp av några digitala verktyg.

Jag tänker att det finns två approacher till materialet; data och metadata. Att söka i innehållet (data) visar sig vara mycket kraftfullt, speciellt om man tillämpar sökverktyg som är snabbare än grep. Men här tänkte jag ge ett litet uppslag till hur man kan extrahera/skapa metadata ur SOUerna. Exakt vad det skulle vara användbart till vet jag inte riktigt ännu, men ibland måste data komma före frågorna för att man ska veta vad man ska fråga.

Inspirerad av Peter Krantz graf, började jag harva runt i SOUerna för att hitta regelbundenheter som går att ta som utgångspunkt för relationer mellan texterna. En sådan regelmässig konvention tycks vara hur man anger SOU som en källa: årtal kolon nummer, exempelvis 1945:68, eller 19\d{2}:\d{2} med reguljära uttryck.

Om jag nu ställer mig i katalogen för varje SOU som enskild fil (en sådan katalog skapas om man laddar ned och packar upp denna datamängd) så kan jag köra grep -r -Eo '19\d{2}:\d{2}' * för att söka efter detta mönster, som vi känner igen som en referens. Detta gör att datorn spottar ur sig ungefär:

20tal/Betänkande och förslag i fråga om kvinnors tillträde till statstjänster. - SOU 1923:22.txt:1923:11 20tal/Betänkande och förslag rörande understöd åt den civila luftfarten - SOU 1929:21.txt:1929:21 20tal/Betänkande om inkomst- och förmögenhetsskatt. - SOU 1923:70.txt:1923:41

Det fetade mönstret identifierar filnamnet för den SOU som vi läser ur och det kursiverade numret visar att datorn har hittat en referens till en SOU (inuti en SOU). Det är inte mera konstigt än att det finns referenser längst bak i en bok eller i en artikel. SOUer hänvisar till andra SOUer. Detta bildar ett litet SOUniversum som vi kan visualisera. Men vägen dit kräver att man processar detta brutala output till något som kan läsas av exempelvis Gephi. För att man ska få fina sociologiska monader måste man definiera vad som är noder och vad som är relationer i ett nätverk.

Det mest gångbara formatet för sociala nätverksdata är nog .gexf. Det är öppet, enkelt och läses av Gephi och Sigma.js.

Varje enskild SOU är en nod, och varje gång en SOU citerar en annan SOU har vi att göra med en "relation". Relationen som enskild händelse (haecceitet) kan vi inte veta så mycket om – någon eller några författare har skrivit en SOU och "laddat ned" andra SOUer till sitt tänkande. Det enda spåret vi har bland de 166 miljoner rader (!) text som alla SOUer utgör är en "referens".

För att bygga om det output som vi fick ovan till .gexf-formatet så körde jag några "hemmasnickrade" regex-sökningar. Jag tar inte alla detaljer utan skissar mest några exempel. På denna sträng:

20tal/Betänkande och förslag rörande understöd åt den civila luftfarten - SOU 1929:21.txt:1929:21

Kan vi ta allt före den första noden – 1929:21 – söka upp med ^(.*?)SOU som vi ersätter med source=". Sedan kan vi söka efter \.txt: och ersätta med " target=". Några vändor fram och tillbaka börjar vi närma oss relationer, som bör se ut ungefär så här:

source="1951:13" target="1948:42" source="1951:13" target="1948:42" source="1951:13" target="1948:42" source="1951:13" target="1945:51" source="1951:13" target="1945:51" source="1950:21" target="1926:18"

Men, för att de ska begripas måste de numreras. Det går att lösa med ett enkelt pythonskript som ungefär lyder:

#!/usr/bin/python

items = ['source="1951:13" target="1948:42"', 'source="1950:21" target="1926:18"', 'source="1950:21" target="1926:18"', osv. alla edges efter varandra.]
number = 0
for item in items:
print(number, item)
number = number + 1

Skriptets output kör man sedan > fil.gexf, så har man en numrerad lista på alla relationer. Med detta gjort är det bara att fortsätta att sök-ersätta med reguljära uttryck tills man börjar få något i stil med:

edge id="0" source="1951:13" target="1948:42" / edge id="1" source="1951:13" target="1948:42" / edge id="2" source="1951:13" target="1948:42" /

Därefter tar man alla unika SOU-nummer och skapar en lista. Enklast är att ta filen man sparat med ovanstående information och bara suga ut varje enskild SOU med grep -Eo '19\d{2}:\d{2}' fil.gex > baranoderna.gexf. För att sedan spara lite plats kan man ta och radera duplikata nummer. Sedan kan man bygga noder som ser ut så här:

node id="1951:13"

Men för att det ska bli komplett ska varje nod ha en "label". För att göra labels till noderna kan man göra ungefär så här i en avancerad texteditor så som Textwrangler eller Notepad++ (glöm inte att slå på Grep).

Find
node id="(19\d{2}:\d{2})" /

Replace
node id="\1" label="\1" /

Så får man snyggt:

node id="1951:13" label="1951:13" / node id="1948:42" label="1948:42" / node id="1945:51" label="1945:51" /

(allt detta ska sedan vara inom < > i .gexf-filen)

Fint. Resten är bara en fråga om lite meta-uppmärkning och vi har oss en .gexf-fil som går att öppna i Gephi.

Pust. Det är nu jag tänker att någon som kan programmera kan göra allt detta så mycket fortare/smidigare. Men, skam den som ger sig!

Med lite modularitetsfilter för att lägga färger och "degree" för att göra noderna större ju oftare de är citerade får vi en sån är liten bild:

50talet{.alignnone .size-full .wp-image-3244 width="400" height="400"}

SOU 1956:39 heter Offentliga byggnader och verkar vara den mest ~~omtalade och citerade~~ "nätverkade" SOUn under 50-talet (Degree, dvs. både inkommande och utgående länkar) (jag begränsade min datamängd till 50-talet för detta test). Om vi visualiserar med raka relationslinjer ser vi tydligare riktningarna på citeringarna.

Detta var bara ett test och proof of concept. Kanske finns det något i detta som ger uppslag till tankar och funderingar på hur man kan forska vidare.