Söka i SOU via Linköpings universitet

Linköping University Electronic Press har gjort SOU-materialet sökbart i fulltext. Sökresultaten levereras i form av länkar till fulltext-pdferna på Kungliga Bibliotekets hemsida.

Testa sökverktyget här.

I en kommentar av signaturen MartLenn föreslogs programmet Solr som ett bra sökverktyg, vilket ledde till att Anders Fåk satte upp en testversion, som nu gjorts mera permanent tillgänglig.

Tjänsten är väldigt smidig för att snabbt hitta till rätt utredning, som genast blir tillgänglig. Att jämföra detta med att släpa sig ned till hyllorna för SOUer på biblioteket snuddar vid det bisarra. Detta gör det tusen gånger enklare att söka ofta och mycket.

\\

När det kommer till sökfunktionaliteter finns det ju många ingångar. Själv har jag mest jobbat med olika varianter av Grep för att även kunna inkludera sökträffarnas ”sammanhang”, alltså, för att få fram hela kontexten som ett ord figurerar i.

Men sökningar i textfiler som ligger på en hårddisk är långt ifrån optimalt. Mina programmeringskunskaper är ännu inte riktigt där, men snart tänkte jag bygga något som har ungefär den här funktionaliteten:

  • Läser in alla SOUer och sparar dem i en databas eller hashtabell som kan hållas i datorns minne. Exempelvis borde SQLite fungera bra.
  • Tillåter sedan sökningar både med enkla ord och reguljära uttryck.
  • Returnerar resultat dels som länkar till pdf-filerna (som ovan) men även som direkta textsjok ur plaintext-databasen.
  • Ovanpå detta bygger man ett gränssnitt som går att lägga ut på webben.

Funderingar kring detta?

Jag har en kraftfull maskin på GUs nät som kan användas för att göra en sådan söktjänst permanent tillgänglig för allt och alla.

Flattr this!

Internetövervakning som metod

I senaste pappersutgåvan av tidskriften Ikaros har jag en text med titeln Internetövervakning som metod. Här diskuterar jag hur datafloden som genereras av världsväven kan göras tillgänglig för samhällsforskare (och humanister) med utgångspunkt i en idé som Gabriel de Tarde formulerade för hundra år sedan:

…föreställde sig Tarde att människor, ur samhällsvetenskapernas synvinkel, optimalt sett levde i ”glashus” så att sociologerna kunde se rakt in i varje hem, ned i varje byrålåda och in i varje garderob. På så sätt kunde man föra statistik över varje liten detalj av människors liv och kartlägga vilka färger på strumpor som var populära, vilken sorts mjöl som fanns i påsarna i skafferiet och, inte minst, vilka böcker som stod i bokhyllorna. Dessa ändlösa detaljer betydde inget som isolerade enheter. Det är först, menade Tarde, när man ser dem som imitativa beteendemönster som de blir intressanta.

Glashusspekulationen finner man in Imitationens lagar (1895) på sidorna 112-113 i denna pdf-utgåva. Citatet (som är en del av ett större resonemang) lyder:

I mean a precise and complete house-to-house inventory of all the furniture in a given country and the annual numerical variations in all of its different kinds of furniture. This would give us an excellent photograph of our social condition; it would be somewhat analogous to the admirable pictures of extinct civilisations which the delvers into the past have made in their careful inventories of the contents of the tombs, the houses of the dead, of Egypt, Italy, Asia Minor, and America.

Vem kommer närmast att veta vilka möbler som finns i ”landet”? Troligtvis den som har tillgång till IKEA Family-databasen. Vem vet vad som finns i kylskåpen? Min gissning: Coop och ICAs kundkortsregister. På folks tallrikar? Instagram. Osv. osv. Vad jag vill framhäva med denna tanke är en reflektion över vilka data om ”det sociala” som är möjliga (givet ny teknik) och för vem de är möjliga. Det känns som att samhällsvetenskaperna och humaniora kanske borde ställa sig den frågan, eller vad säger ni?

Flattr this!

SOUernas geografi 2

För några månader sedan extraherade jag alla ortsnamn ur Statens offentliga utredningar i ett försök att skapa en bild av utredningarnas geografiska ”räckvidd”. Men jag körde fast när det kom till att visualisera denna datamängd. Jag visste inte hur jag skulle gå vidare för att lägga ”data på karta”.

Men under sommaren har jag haft som hobbyprojekt att lära mig programmeringsspråket Python. Jag kan verkligen rekommendera alla som vill öka sin digitala bildning att lära sig ett programmeringsspråk. Om man vill göra något som går utöver de formpressade och anpassade verktygen är det en sann frihet att kunna skriva sina egna små program och skript. Det är inte alltid det finns en ”app” för det problem man vill undersöka, och även om det finns en app är det inte säkert att man kan bryta ned i minsta detalj vad den gör (vilket är ett krav om man vill arbeta vetenskapligt, dvs. ”metodredovisning).

Trots att jag verkligen inte har blivit särskilt ”bra” på Python, kan jag med väldigt enkla medel göra massor av saker som tidigare begränsade mig. Till exempel följande.

De hundra mest frekvent omnämnda ortsnamnen i alla SOUer 1922-1996 ser ut så här på en världskarta:

Vi zoomar lite:

Lite till:

För att till sist landa i Sverige:

Jag har begränsat mig till de hundra mest omnämnda platserna (ladda ned både filen med ortnamn (SOU100utf.txt) och pythonskriptet (soukarta.py) från min Github-sida).

Det mest uppenbara är att topp 100-listan för var någonstans SOUerna gör nedslag följer ungefär de områden som är mest befolkade. Nu gör denna karta ingen skillnad mellan att Stockholm nämns tio gånger oftare än Umeå (ett framtida projekt).

Skriptet som jag skrev för att skapa denna karta har vissa begränsningar. Det läser först in en lista med ortnamn från en fil och skickar sedan namnet till Googles databas över orter som returnerar longitud och latitud. Här är man alltså begränsad av att Google i sin tur har en lika hög ”upplösning” som ”staten” (kanske är Google en ny stat?). Dessutom har Google en begränsning hur många anrop man får göra per dygn och per sekund. Således är detta första test begränsat till hundra platser.

Hur går man vidare härifrån? Finns det andra intressanta visualiseringar man kan göra? Fler orter? (det går att fixa så att skriptet tuggar mot Googles maxgräns vecka ut och vecka in). Andra visualiseringsformer? Kommentera gärna!

Uppdatering: Gustaf Nelhans har gjort en liknande visualisering.

Flattr this!

Det netpolitiske manifest

Ett gäng danska internauter kring Bitbureauet översätter för närvarande min bok Det nätpolitiska manifestet (2010) till danska och publicerar kapitel för kapitel både som text och som inläst poddkast, inläst av Henrik Chulu. Jag antar att man får en ”ljudbok” om man sedan klistrar samman poddkasten till en sammanhängade spellista.

Detta gör mig bubblande glad! Jag försökte skriva boken så att den skulle kunna ha en hållbarhet över tid och detta känns som att så kanske är fallet.

Hittills har två kapitel publicerats:

Idén till en dansk översättning föddes redan 2011. Då diskuterade vi ett antal översättningsproblem som uppstår främst kring begreppen ”nätvaro”, ”gå till näts” och pluralformerna av ”internäten”, ”internätverken”. Jag tänker att dessa översättningsproblem är positiva tecken på att det finns tankelinjer som kräver tankearbete i boken.

Jag har själv inte bläddrat i boken på fem år. Jag tycker det är svårt att läsa det jag själv har skrivit, ungefär på samma sätt som det är konstigt att höra sig själv på en ljudinspelning eller video. Kanske blir det lättare om jag läser på danska!

Flattr this!

SOU om Digitalisering re-digitaliserad och kvantifierad enligt sina referenser

Jag kunde inte hålla mig från att testa några saker på text-versionen av SOU 2015:65 – En antologi om digitaliseringens möjligheter. Jag är intresserad av att hitta olika sätt att förstå den kunskapsform som en SOU innehåller, och jag funderar på hur man kan begripa detta bortom de hermeneutiska cirklarna.

Ett sätt att ta tempen på en kunskapsform kan vara att se vilka andra källor av kunskap som åberopas. Detta är en slags paradigmatisk uppställning där en dimension består av en slags tidslighet. Hur gamla eller unga är de källor man hänvisar till? Vilken historicitet har citeringsnätverket?

Det trubbigaste men samtidigt det tydligaste sättet är att helt enkelt se hur gamla texterna är som man hänvisar till. Ämnet ”digitalisering” kommer givetvis vara ”ungt” i jämförelse med en utredning som har historiska inslag eller handlar om ämnen som inte har påverkats av en vis teknikutveckling osv. Men, det är bara hypoteser! Här har jag bara gjort ett litet stickprov.

Eftersom vi numera har nästan alla SOUer under våra fingertoppar är det bara fantasi och kod som sätter gränserna.

Vad säger detta tänker ni?

\\

Metod

När jag skriver fram metoden kan det tyckas att jag krånglar till det med terminalkommandon och kodsträngar. Anledningen till detta är 1) reproducerbarhet och 2) att arbetsflödet ska kunna skalas upp och automatiseras. I detta fall rör det sig ju bara om en SOU. Men låt säga att man vill göra samma sak på tusen dokument. Då går det inte att ”peka och klicka” för då blir man aldrig klar.

Först hämta pdf-filen och göra om den till text:


wget -U firefox http://www.regeringen.se/contentassets/bacbfd7c61ac4e4eaff7cd3a7505e6c4/sou-2015_65-webb.pdf; pdftotext sou-2015_65-webb.pdf

Observation: Regeringens hemsida gillar inte att wget kommer och hämtar filer. Så man får lura regeringen att tro att det är en vanlig firefox som kommer och vill vara en informerad medborgare. (regeringen diskriminerar robotar, något Robotpartiet kanske vill reagera på).

När vi sedan har textfilen redo kan vi analysera hur en referens ser ut. För det mesta följer de detta mönster:


Morozov, E. (2012). The Net Delusion: The Dark Side of InterneFreedom. PublicAffairs.

Det som verkar vara beständigt i denna SOUs referenslista är årtal inom parentes, eller \(\d\d\d\d\) som reguljärt uttryck. För vårt nuvarande syfte räcker detta. Om man däremot skulle vilja ha ut författarnamn, titlar osv. blir det lite svårare eftersom det är långt ifrån homogent hur litteraturlistorna skrivs ut. (se nedan exempelvis i om man skriver punkt före förnamnsinitial eller inte).

För att få ut alla årtal som finns inom parenteser:


egrep -io '\((\d\d\d\d)\)' sou-2015_65-webb.txt > file.txt

Som vi sedan gör till en kommaseparerad fil som går att räkna lätt på.


perl -p -i -e 's/\(|\)//g' file.txt

Sist men inte minst kan vi lägga till ett ”Year” allra först i filen, samt döpa om till .csv.


(echo "Year" ; cat file.txt) > file.csv

Nu är det bara att ladda in i R och tillverka ett enkelt histogram. Kör antingen rad för rad i Rs kommandotolk eller kopiera och kör hela skriptet med Rscript skriptnamn.r :


mydata <- read.csv("file.csv") hist(mydata$Year,main='SOU 2015:65 - Citation Frequency per Year',xlab='Years',col='green',breaks=100,xlim=c(1980, 2016),prob = TRUE) lines(density(mydata$Year))

Som ni ser har jag exkluderat de sporadiska referenser som finns till texter före 1980. De är kvalitativt intressanta, men kanske inte kvantitativt. Alla metoder har ju sina gränser (som tur är).

Flattr this!

Anteckning för arkivet: Det nätpolitiska manifestet citerat i SOU 2015:65 av de Kaminski

Lite ironiskt, men samtidigt som jag har bloggat väldigt mycket om Statens offentliga utredningar nås jag av nyheten att min fem år gamla bok Det nätpolitiska manifestet citeras i Digitaliseringskommissionens SOU 2015:65 Om Sverige i framtiden – en antologi om digitaliseringens möjligheter.

Kapitelförfattaren Marcin de Kaminski använder begreppet ”smittontologi” från boken, ett begrepp som jag och Karl Palmås jobbade med ett par år innan boken skrevs. de Kaminski skriver:

Som del av internet bör man känna till nätets särskilda ”smittontologi”. Med detta menas att användare kan vara mer eller mindre aktiva, men som noder i nätet är man – om än passivt – påtvingad funktionen av att föra vidare information. Man kan sammanfatta detta som att informationen smittar. Detta oavsett om man är primärkälla eller mottagare av informationen.

Jag har ännu bara bläddrat i resten av SOUen. Om någon vill ha en rå textversion för innehållsanalys, tillverkade jag en sådan med pdftotext. Ladda ned här.

Flattr this!

Dynamiska visualiseringar av citeringsnätverk – ett test och metodgenomgång

Jag har länge försökt hitta ett bra arbetsflöde för att skapa visualiseringar av dynamiska nätverk, dvs. nätverk som förändras över tid. Alla nätverk förändras ju, även om hastigheterna kan vara väldigt annorlunda. Ett nätverk av vägar, tågräls eller gasledningar kan se ganska oförändrade ut över flera år, även om de hela tiden måste underhållas. Ett nätverk av vänner, kolleger, politiker, lobbyister eller studiekamrater kan uppstå och försvinna inom ungefär samma tidsrymd.

Det är dock ett metodologiskt problem att de flesta sätt som vi visualiserar nätverken på består av statiska representationer. Vi skapar bilder och ”kartor” som hela tiden missar att nätverken aldrig egentligen är helt statiska. Jag och min kollega Gustaf Nelhans försökte råda bot på detta i vår artikel om lyckoforskningens framväxt genom att skapa statiska bilder för olika tidsintervaller. Med hjälp av lite hermeneutisk ifyllnade går det att ställa sig i ett processontologisk modus och få en uppfattning om själva flödet av citeringar.

Men som för de flesta metoder är det önskvärt att öka detaljrikedomen om man vill genomföra en antropologi av det moderna. Jag tänkte här lägga ut en lösning på hur man kan skapa dynamiska nätverksvisualiseringar av publikations(meta-)data hämtad från Web of Science. Exemplet utgörs av min pågående forskning om citizen science och mitt syfte är här att visualisera framväxten av ett citeringsnätverk för forskning som använder sig av medborgarforskning som metod.

Således följer en väldigt teknisk beskrivning. Med tanke på att det troligtvis bara finns en handfull av forskare som gör så här (på svenska) lägger jag ut resultated direkt för er som tänkte sluta läsa nu:

Vad kan man säga om detta nätverk? Kommentarer uppskattas som presenter på julafton!

\\

Nu över till själva metoden. Vad som följer är en ganska omständig process och det är verkligen inte den optimala metoden. Tanken är att jag framöver ska skriva några små skript som automatiserar denna process hela vägen, men jag måste först lära mig lite mera programmering. Men det är ändå bra att lägga ut hela processen så att man vet vad man ska göra.

Således. Ta fram datorkörkortet och se till att du har följande mjukvara:

  • Python (inkl. modulerna networkx och community),
  • find
  • git
  • Gephi
  • ffmpeg
  • (för bonus-features: imagemagick och perl)

Python, find och git borde följa med MacOS/Linux, medan Gephi och ffmpeg får hämtas separat. På Windows måste man (tror jag) installera separat, men var försiktig med de terminalkommandon som jag skriver ut, vissa saker skiljer sig åt. Dessa mjukvaror behövs för de tre stegen i arbetsflödet: 1) förprocessera data, 2) applicera nätverksalgoritmer, 3) rendera video utifrån statiska bilder.

1. Separera datamängder årsvis

När man har hämtat en datamängd från Web of Science består den av en enda textfil. För att Gephi ska kunna bygga dynamiska nätverk måste man antingen ha byggt en färdig .gexf-fil, eller så instruerar man Gephi att ta uppstyckade datamängder och ge dem en tidsstämpel. Den förra metoden är det som saknas rent skriptmässigt (min ambition är att skapa ett sådant skript i framtiden), den senare metoden är den som jag presenterar här (den är mera omständig, men funkar).

Först och främst behöver vi ladda hem en knippe skript som jag hittade på Github skrivna av Reid McIlroy-Young för John McLevey.


git clone https://github.com/mclevey/web_of_science_isi.git

Det är oklart varför dessa skrevs, men de är väldigt användbara, även om de måste modifieras för att breddas i användningsområde. Forskare skriver ju ofta specialiserade verktyg för en viss forskningsfråga. För att sedan anpassa dessa till den fråga man själv ställer måste man koda om dem. Men för detta exempel kommer jag använda dem ganska rakt av.

Ta datamängden från Web of Science och lägg txt-filen i katalogen ISIcollectors. Om du har klistrat ihop flera dataset är det viktigt att du tar bort alla gånger som strängen VR 1.0 förekommer, förutom på andra raden, precis i början av filen. Om denna rad kommer mitt i datamängden kommer skriptet att stoppa.

Kör sedan bara:


python ISISplitter.py

Om allt går vägen kommer du nu få massor med nya textfiler, en för varje år. År är ju den högsta ”upplösningen” vi kan få ur Web of Science, så allt är väl än så länge.

Nu skulle man kunna stanna här och sedan ta varje fil till Sci2 för för-processering och sedan vidare till Gephi. Men det optimala är ju att automatisera detta steg, alltså direkt skapa nätverksfiler från Web of Science-filerna. Det intressanta skriptet co-Citemaker.py gör precis detta. Men, det är inställt på att bara arbeta med en fil åt gången. Som tur är går det att köra det på massor av filer med det finurliga programmet find. Flytta först den ursprungliga filen ur katalogen och kör sedan:


find *.txt -exec python co-citeMaker.py {} \; -exec mv co-CiteNetwork.graphml {}.graphml \;

Vad jag gör övan är att 1) hitta alla .txt-filer 2) köra pythonskriptet på varje fil 3) döpa om oputpufilen till ursprungsfilnamnet + filändelsen graphml. Visst är datorer finurliga!

Nu har vi en .graphml-fil för varje tidsintervall (år). Nu vill man få in detta till Gephi. Den lösning som man borde jobba med på sikt är att direkt jobba mot Gephi’s java-bibliotek, men det får bli ett framtida projekt. Istället jobbade jag mot Gephis grafiska gränssnitt. Här har vi mitt skrivbord avfilmat:

Först generera jag bara ett dynamiskt nätverk som jag genast tar bort. Sedan öppnar jag första filen som jag vill ha in och väljer Time frame som jag sedan definierar årsvis. På så sätt får man fram en tidslinje som man kan laborerar med. Här är min gephi-fil

Nu kan det uppstå ett problem. Kanske är det så att vi vill ha en ”kumulativ” visualisering. Alltså, att noderna inte försvinner för varje år, utan att de ”varar” längre. Detta är i mindre utsträkning en teknisk fråga, utan i första hand en teoretisk: Hur långt ska vi sträcka ut ”relationismen” i vår analys? Finns bara det som hela tiden upprätthålls? I Så fall ska vi låta noderna förfalla när de inte längre är aktiva. Eller, tillåter vi en viss ”eko-effekt” på grund av pragmatisk-epistemiska överväganden? I detta exempel lutar jag åt det senare.

För att göra så att alla noder permanenteras vill vi att de ska vara till och med slutet av vår tidslinje (här 2015). Om man först exporterar från Gephi till .gexf-formatet kan man enkelt jobba mot rådatan.

Så här ser rådatan i gexf-filen ut:


<node id="CIRIACYWANTRUP SV 1975" label="CIRIACYWANTRUP SV 1975" start="1991.0" endopen="1992.0">

Vad som behöver göras är att byta ut alla endopen mot årtalet 2015. Det är bara att söka och ersätta med din favoriteditor, eller så kör man bara följande lilla rad perl (perl är redan inbyggt i vettiga operativsystem och det är smidigare att använda för stora filer):


perl -p -i -e 's/endopen="\d\d\d\d.\d"/endopen="2015.0"/g' filnamn.gexf

Gexf-filen kan nu importeras tillbaka till Gephi. Lite omständigt, jag vet. Men i framtiden kommer jag förhoppningsvis kunna knåpa ihop lite python-skript som fixar till .gexf-filerna som man vill ha dem redan från början.

Nu kommer man till sista steget. Jag hoppar över hur man skapar fina visualiseringar i Gephi, det är ett annat ämne. Men när man har fått det snyggt måste man exportera en bild för varje år. Detta gör man i preview-fönstret och det går bra att bara exportera png-filer till en katalog och numrera dem 1.png, 2.png, 3, 4 osv.

Sedan kan man bara ställa sig i katalogen och köra:


ffmpeg -r 1 -pattern_type glob -i '*.png' -c:v libx264 -pix_fmt yuv420p out.mp4

Så får man en liten filmfil.

För att göra en animerad gif kan man använda sig av smidiga imagemagic och snabbt baka ihop en fil med:


convert -delay 100 -loop 0 *.png animation.gif

För att göra den lite mindre:


convert animation.gif -coalesce temporary.gif; convert -size 1024x1024 temporary.gif -resize 300x300 animationsmall.gif

Så får man:

Det finns flera saker att förbättra här. Bland annat har noderna statiska storlekar (trots att deras ”degree” ändras över tid). Sedan har jag inte kört någon community detection på detta ännu. Men man kan tänka sig att det uppstår och försvinner små (algoritmdefinierade) communities av citeringar. Jag har heller inte kollat mera exakt hur co-citeringen går till i python-skriptet jag använde. Men det är något jag ska jobba med framöver.

Nu ska jag åter dyka in i mitt sommarprojekt. Kommentera gärna!

Flattr this!

Vilka universitet nämns i Statens offentliga utredningar?

Jag funderar på ytterligare en dimension i SOUerna som ”kunskapsform”. Vilka universitet och högskolor nämns i utredningarna? Man kan anta att ett sådant omnämnande har två huvudsakliga orsaker. Antingen äger det rum när expertis från universiteten inkorporeras i utredningarna (professor X från Lunds Universitet, forskning vid Malmö högskola), eller när högskoleväsendet som sådant utreds.

Eventuellt skulle detta kunna vara ett alternativt sätt att mäta det som så populärt (och problematiskt) kallas för ”impact” eller ”samverkan”, givet att man kan antingen separera eller vikta de två olika ovan nämnda orsakerna till omnämning

Ambitionen är inte här att skapa ett sådant mått, utan att bara att visa hur mått kan skapas på väg mot en mätkritik av måtten. Måttkonstruktivism helt enkelt, i sin mest bokstavliga betydelse.

\\

Jag tänker att det borde vara ganska enkelt att med grova verktyg kunna göra en första insamling.

Följande lilla uttryck:


\s[A-Z]([^\s]*)\s(universitet|högskola)

Ger sökträffar i stil med:


381:samma universitet C O . Häggquist, dåvarande docenten vid Göteborgs högskola, professorn vid Stockholms högskola S. I. Karling, överbibliotekarien
390:förslag i tre promemorior, betecknade »P. M. angående Uppsala universitets drätselverk», P. M. angående Uppsala universitets kansli» och »P. M.
391:angående organisationen m. m. vid Lunds universitets kansli och räntekammare». Promemoriorna, som äro dagtecknade den 30 juni, den 3 september
398:15 januari 1947 till departementschefen avgivit en promemoria rörande Göteborgs högskolas ekonomiska ställning. Vid handläggningen av denna fråga
399:har beredningen biträtts av sekreteraren vid Göteborgs högskola, filosofie

Uttrycket säger ungefär: ”hitta allt som börjar med ett mellanslag, därefter en stor bokstav, därefter vad som helst förutom ett blanksteg, därefter ett mellanslag och sist antingen ordet ”universitet” eller ”högskola””. Uttrycket är väldigt snällt för att det går enkelt att hämta stadens namn i första parentesen och universitet/högskola i andra parentesen (ex. som $1, $2, Tyvärr ger denna sträng även några anomalier, exempelvis:


För högskolans
I universitetsstaden
En universitetslärare

Dessa går dock att sortera ut med en liten stoppordslista i ett senare skede. Vad man dessutom missar är nya uttryck såsom ”Mittuniversitetet”, ”Högskolan Väst” osv. Funderar vidare på hur dessa kan matchas.

Jag tänkte sedan stoppa in dessa uttryck i några små program. Men först kastar jag bara ut denna lilla anteckning och ni som vill kommentera är mer än välkomna att göra så.

Flattr this!

SOUernas geografi

Var är Sverige utrett? Oftast frågar man efter hur och så tänker man sig att svaret skulle vara av kvalitativ art. Men det finns en annan väg, givet att man vet exakt vilka platser som har skrivits ned i alla statliga offentliga utredningar. Rad för rad. I denna bloggpost och instruktion hade jag tänkt att försöka mig på att ta ett steg närmare en sådan empirisk datamängd.

En spännande teoretisk fråga man då kan ställa sig handlar om hur staten ”blir till” (performativt) genom att utreda ort för ort. På samma sätt som ett nätverk av ryska gasledningar kan göra anspråk på ett territorium, kan ett nätverk av utredningar sakta men säkert släppa på och av flöden av ”statsgas” som letar sig ända ut i skogarna och värmer (eller kyler) stugorna med en känsla av att tillhöra ”staten Sverige”.

Nationens gränser finns inte, de måste hela tiden (om)skapas.

Jag tänkte med denna bloggpost lägga ut steg för steg hur jag har lyckats extrahera alla ortnamn ur SOUer 1922–1996. Jag lägger ut all rådata och alla steg i bearbetningen. Det blir kanske inte så läsvänligt, men å andra sidan kan alla mina steg replikeras och kritiseras så att datan blir fullt användbar för vem som helst att använda eller publicera. Dessutom krävde det hela mycket datorkraft, så det är en miljöinsats att använda mina filer.

Med andra ord, det är alltså fritt fram att göra vad ni vill!

\\
Steg 1 – Extrahera ortsnamn
Detta tog en vecka. I skripten som Peter Krantz publicerade finns lista på ortsnamn som man kan matcha mot alla SOUer med hjälp av:


grep -owf features.txt data/30tal/*.txt > trettiotal.txt

Jag körde detta för varje katalog i åtta screens på en riktigt snabb server. I detta läge använder sig grep av Aho Corasick strängmatchning. Den letar alltså efter träffar från en (jättelång) lista av ord och så printar den ut dessa till en fil. Kanske hade jag kunnat distribuera processorlasten över alla 32 processorer i mitt system, men jag ville heller inte krascha maskinen som delas med andra. Den råa datamängden från detta kan laddas ned som:

Men dessa filer innehåller massvis av skräpdata och är bökiga att arbeta med statistiskt. Således måste de bearbetas.

\\

Formatera data

För att göra datamängden statistiskt läsbar började jag karva fram variablerna Årtal, SOU-Nummer och Ortnamn enligt följande trixande med reguljära uttryck (kommentera gärna om ni har smidigare lösningar).

Först gjorde jag en första grov extrahering av Årtal (\d{4}), Nummer (:\d{2}) och sedan Ortsnamen som kommer sist på varje rad (.*):


ag -o '\d{4}:\d{2}.*(?<=:\d{2}.txt:).*' SOU1922-1996.txt > 1.txt

Sedan gjorde jag två olika versioner. Den första filen (2.6Mb)inneåller År, Nummer, Ort och gjordes om till en kommaseparerad fil med ett enkelt perl-handgrepp:


perl -p -i -e 's/.txt:/, /g' 1.txt

Men, för enkelhets skull gjorde jag även (2.4Mb) en version med bara År och Ort ur ovanstående fil:


perl -p -i -e 's/:\d{2}//g' 1.txt

\\

Stoppord

Men nu framträder ytterligare ett problem. Ortnamn, speciellt svenska ortnamn, har ju ibland betydelser även i vardagsspråket. Staden Kista och en sådan där trälåda man läggs i när man dör, stavas likadant. Ännu värre blir det med orten ”Vi” eller ”Gran”. Jag började först med att bläddra igenom filerna induktivt och hittade själv följande lista:

Vi|Bet|När|Bön|Håll|Mark|Böj|Vad|Färjan|Kap|Så|Alla|Verksamheten|Vecka|Källa|Varmvattnet|Hallen|Bo|Gran|Björk|Viken

Men detta var väldigt tidsödande, så jag frågade runt i sociala medier och fick massvis av svar. Här är de jag samlade in i går kväll:

Lyckan|Önska|By|Ön|Holmen|Strand|Vara|Mannaminne|Ensamheten|Bor|Kärleken|Skara|Bro|Viken|Skruv|Tving|Råda|Torp|Näs|Berg|Lugnet|Torp|By|Sand|Slut

För att sortera ut dessa falska positiver använde jag mig av lite perl.


perl -p -i -e 's/^.*\b(Vi|Bet|När|Bön|Håll|Mark|Böj|Vad|Färjan|Kap|Så|Alla|Verksamheten|Vecka|Källa|Varmvattnet|Hallen|Bo|Gran|Björk|VikenLyckan|Önska|By|Ön|Holmen|Strand|Vara|Mannaminne|Ensamheten|Bor|Kärleken|Skara|Bro|Viken|Skruv|Tving|Råda|Torp|Näs|Berg|Lugnet|Torp|By|Sand|Slut|Mom)\b//g' test.txt

Detta tar bort alla rader som innehåller något av ovanstående ord. Däremot lämnar det kvar blanka rader som jag tar bort med:


perl -p -i -e 's/^(\s*|\r|\n)$//mg' test.txt

Av någon anledning fanns fortfarande orten ”Så” med, så jag fick köra en ny vända med:


perl -p -i -e 's/.*Så//g' test.txt

Och sedan ta bort blanka rader igen.

\\
Datamängden

Sedan är det bara att döpa om txt-filen till .csv. Och så har vi datamängden SOU1922-1996artal-ort-filtered.csv.zip (1.5Mb).

Denna kommaseparerade fil borde man kunna läsa in rakt i Excel om man vill. För att göra allt replikerbart har jag dock bara gjort lite enkel statistik i R. För att skapa en enkel lista över orter i SOUer (i fallande ordning), kör jag bara (byt ut sökväg):


mydata <- read.csv("/home/anon/Desktop/SOU1922-1996artal-ort-filtered.csv") sink("Platserfrekvens.txt") df <- as.data.frame(table(mydata$Place)) ; df[order(df$Freq, decreasing=T), ]

Här instruerar jag R att skriva ut hela resultatet till filen Platserfrekvens.txt vars topplista ser ut så här:

Stockholm 73039
Göteborg 28937
Uppsala 26130
Malmö 20032
Danmark 17324
Norrland 15245
Örebro 14191
Lund 14143
Kalmar 10821
Bohus 8124
Frankrike 7372
Umeå 6948
Gävle 6569
Norrköping 6013
Västerås 5777
Luleå 5389
Skåne 5249
Linköping 5125
Karlskrona 5015
Hälsingborg 4695
Växjö 4190
Os 4069

Jag antar att "Os" är ytterligare en sökanomali. Stoppordslistan måsta alltså uppdateras.

Men detta vara bara ett test och ett sätt att få ut datamängden så att ni andra kan börja tinka med den. Det borde vara enkelt att skapa fina grafer över tid, kanske ned till varje enskild rapport. Det skulle även vara helt magnifikt med en sverigekarta som över tid uppdaterades dynamiskt med en "prick" på kartan varje gång en SOU nämnde en ort. Då skulle man, precis som med tekniska nätverk, se precis var någonstans det finns "täckning" och var någonstans det finns "vita fläckar". Tänk en täckningskarta för mobiltelefoner.

Kommentera mer än gärna. Vad finns det mer för idéer?

Flattr this!

Medborgarforskning som motstånd

Häromveckan publicerades min artikel ”Citizen Science as Resistance: Crossing the Boundary Between Reference and Representation” i första numret av Journal of Resistance Studies. Hela numret kan laddas ned i sin helhet från tidskriftens hemsida. Eller, om man vill gå direkt till artikeln, finns en postprint-pdfGUs hemsida.

Här använder jag mig av en rad exempel hur aktivistorienterad medborgarforskning använder sig av vetenskapliga metoder som motståndspraktik. Detta skapar ett problem som jag använder för att diskutera kärnan i Latours resonemang om separeringen mellan ”vetenskap” och ”politik”, dels som den kommer till uttryck i We have never been Modern, men framförallt så som problemet formuleras i An Inquiry into Modes of Existence.

En rad förarbeten till artikeln finns att läsa på bloggen under taggarna NET, POL, REF. Allt är således väldigt systematiskt.

Flattr this!