About Christopher Kullenberg | CV and publications

Archive

Monadologiska undersökningar 2 - Överlappande facebooksidor

Jag snubblade över en liten idé (eller så snubblade den på mig) när jag satt och kodade på en anonymiseringsteknik för facebookdata. Det konventionella sättet att se på politiska ideologier är ju att de formas och formuleras "uppifrån", att de har en normkälla och är underblåsta av en kraftig bas som skapar dess centraliserande kraft kring ett Budskap (som forskaren tolkar och säger Sanningen om till de som inte vet bättre).

Ett annat sätt att se på saken är att börja "nedifrån och upp", alltså i det sorlande hav av monader, divider, aktanter (vad vi kallar dem spelar inte särskilt stor roll). Här blir det intressant att studera de politiska varelsernas rörelser, eftersom det är dessa mönster och interaktioner, dessa översättningar och allianser, som i sin tur konstituerar det som vi ser som en politisk helhet. Här talar man mindre om de totalitära idéerna som texter och teser, utan letar efter totalitära affekter, begär, existensformer, interaktionsformer etc. Här hittar man inte fascismen, utan mikrofascismen.

Den empiriska data som presenteras nedan är bara ett litet test och det går inte att dra några slutsatser av dem. Själva insamlingen gjordes medelst det lilla pythonbiblioteket facepy. Jag gick till de öppna sidorna för Sverigedemokraterna, Miljöpartiet, Svenskarnas parti och Avpixlat och laddade ned så mycket jag kunde med Facebooks API-nyckel. Inga speciella tankar om urval alltså, jag hämtade bara vad jag fick, vilket varierade från några hundra till några tusen poster. Därefter valde jag ut alla kommentarer på alla poster och förvandlade varje användares unika Facebook-id till en kryptografisk hashsumma (för anonymisering). Dessa extraherades och skrevs till nya filer som sedan jämfördes i en korstabell:


             Sd             Mp             Svp            Avpixlat

Sd - 80 92 47 Mp 80 - 22 3 Svp 92 22 - 5 Avpixlat 47 3 5 -


Vad säger då denna figur? Den visar på samförekomst (co-occurrence) av (hashade) Facebook-id mellan Facebooksidorna. Det finns alltså 80 tillfällen då samma person har kommenterat på både Miljöpartiet och Sverigedemokraternas sida, 92 gånger på Sd och Svenskanas Partis sidor, osv. Vi följer alltså konkreta personer, men har avidentifierat dem (visst skulle detta vara en läskig form av "åsiktsregistrering").

Men det känns ju väldigt kontraintuitivt att det skulle vara större samförekomst mellan Sd och Mp än vad det skulle vara mellan Sd och Avpixlat. Sd och Svp ligger förvisso nära varandra "ideologiskt", men å andra sidan konkurrerar de om om röster. Som ni märker förklarar den aggregerade nivån väldigt lite. Men den kan ändå ge oss vissa riktningar att gå i, vissa spår att följa.

Vad är det då som förklarar siffrorna? Svaret är att informationsrikedomen ökar med förstoringen. Vi måste alltså dyka ned i de 80 samförekomsterna (i ett datamaterial av tiotusentals interaktioner) för att se vad Miljöpartister och Sverigedemokrater har gemensamt (inom ramen för mitt slarvigt genomförda testurval). Men om vi gör det så bryter vi anonymiteten!

Nu kan man förvisso tänka att det är oproblematiskt att ändå analysera detaljerna i helt öppna Facebooksidor och därmed tumma på anonymiteten, eftersom de är tillgängliga för vem som helst på internet.

En viktig sak är nämligen att varje enskilt fall av samförekomst kan ha diametralt olika anledningar till varför den uppstod. Jag hittar exempelvis en miljöpartist som gillar djur som har kommenterat på Sverigedemokraternas sida med:

"Något Sd borde fundera över? Man måste inte alltid tycka som storebror?"

Å andra sidan kommenterar en Sverigedemokrat så här på Miljopartiets sida:

TBC-fall ökar och ökningen härrör uteslutande från personer som kommer hit utifrån. Vad gör ni konkret för att säkerställa att inte diverse smittsamma sjukdomar sprids (dvs det handlar om upprätthållande av folkhälsan)? Vilka resurser tillför ni nu skolor, sjukvård, sociala myndigheter,polis, säkerhetspolis, skolor, kommuner när belastningen på dem ökar kraftigt?

Två exempel av 80 möjliga, totalt icke-representativa. Poängen med detta är bara att göra en distiktion mellan det molekylära och det molära. Hade vi genomfört en opinionsundersökning hade vi fått en jämförelse av folks åsikter utefter kategoriella frågor; vad anser du om X, Y, Z? Resultat: ett genomsnitt.

Men med denna approach, å andra sidan, får vi istället ett "omvänt arbete". Varje monad som interagerar med andra monader definierar själva frågan som ställs av dem, men inte utifrån en given kategori, utan snarare utefter imitation/repetition.

Vad som är målet är alltså att kvantifiera dessa kvalitéer så att man dels kan se aggregatens struktur utan att tumma på monadernas myller. Men detta sker nu  utan abstraktioner och "abstrakt tänkande". Istället når vi framkomlighet genom repetitioner och associativt tänkande. Lättare sagt än gjort.

Vad tror ni? Förslag på saker som skulle vara intressanta att titta närmare på?

\\

Några skriptsnuttar jag använt mig av.

För att kryptera de enskilda användarnas id-nummer i kommentarsfältena:

``` {.EnlighterJSRAW data-enlighter-language="python"} from json import load from os import listdir import hmac import hashlib

Multi file parser from directory

for filename in listdir("miljopartiet/"): #change path here (1/2) with open("miljopartiet/" + filename) as currentFile: #change path here (2/2) jsondata = load(currentFile) #parse json.

    #This loop extracts comments. make sure to separate "i" and "item"
    #and hashes them
    try:
        if item['comments']['data']:
            for i in item['comments']['data']:
                digest_maker = hmac.new(b'r3placewithmegasecretk3y', i['from']['id'].encode(), hashlib.sha256)
                print(digest_maker.hexdigest())
    except KeyError:
        break
För att räkna fram co-occurrences är det bara att jämför hashsummorna
som extraherats ovan, fil för fil. Ungefär:

``` {.EnlighterJSRAW data-enlighter-language="python"}
with open('mpencrypted.txt', 'r') as file1:
    with open('sdencryptedt.txt', 'r') as file2:
        same = set(file1).intersection(file2)

same.discard('\n')

print(same)
print("Number of co-occurences: ")
print(len(same))