Tags

, , , , , ,

För den otålige:

https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fchristopher.kullenberg%2Fposts%2F10157205865935082&width=500

Filosofi och metod

Vilka ord och begrepp som uppfattas som eller påverkar mottagaren negativt respektive positivt psykologiskt hör till filosofi snarare än vetenskap. Särskilt eftersom människor har olika värderingar, såsom exempelvis traditionella, modernistiska eller postmoderna, och därför lägger olika tonvikt vid olika aspekter av verkligheten eller lägger in olika betydelse i värdeladdade ord som demokrati, rättvisa, solidaritet etc.

En rimlig utgångspunkt kan dock vara att börja i en annan ända, nämligen i förklenande respektive berömmande omdömen om idéer, ting eller andra människor. Det är ett välkänt fenomen att vi människor “lägger på” ett språkligt lager som förmedlar positiva och negativa känslor på skeenden. Ett klassiskt exempel inom medievetenskapen är “frihetskämpe” respektive “upprorsmakare”. Ett annat liknande är “martyr” respektive “terrorist”.

Fenomenet name calling är mycket vanligt och uppfinningsrikedomen är stor till exempel på Twitter där politik (liksom dess nära släkting fotboll) ofta avhandlas i realtid och utan alltför mycket inblandning av det numera förlegade och därför lätt ignorerade överjaget. En möjlighet är alltså att leta på Twitter efter ord och begrepp som människor använder för att medvetet eller omedvetet kasta skugga över någon eller någonting respektive att förhärliga och hylla.

Det finns i grunden två diametralt motsatta sätt att undersöka språk. Antingen utgår du ifrån regler och fasta hierarkier eller så utgår du från hur människor faktiskt använder språket och låter det flyta och förändras över tid. Att kombinera dem båda är förstås klokast, dock är det en konstart, snarare än en exakt vetenskap, liksom det mesta i livet värt att göra.

För många lingvistiska problem har sedan några år tillbaka ordrymder och deep learning, en i grunden ganska enkel och därför mycket galant, metod för att göra statistiska undersökningar av språk gjort avgörande framsteg för hela AI-fältet. Metoden hör till den senare sorten som alltså utgår från hur människor använder språket och uppdateras löpande vartefter en får fatt i nya språkexempel. Om kidsen till exempel plötsligt slutar säga “fett” om något som är bra och istället börjar säga t ex “gött” så kommer språkmodellen att lära sig det och “förstå” att de har en liknande betydelse. Detta beror på att ordrymder i grunden handlar om att datorn läser in vilka ord som förekommer före respektive efter det ord man undersöker. Med tillräckligt stort dataunderlag, i storleksordningen många miljoner exempel, så blir resultaten ofta förvånansvärt bra.

Jag har utifrån eget intresse tränat en modell (kod) på ett urval av tweets från 2015 från cirka 235 000 konton som i huvudsak skriver på svenska och som efter att ha skrubbats rena från hashtags, url:ar och omnämnanden av kontonamn innehåller minst tre ord. Det lämnade kvar drygt 47 miljoner tweets. Dessa är alltså i huvudsak på svenska, men även en mängd engelska, samt norska, finska och danska. Det gör att modellen visar prov på metodens förmåga att översätta riktigt bra mellan olika språk, en förmåga som åtminstonde för ordnörden respektive den som är intresserad av skalbar AI-teknologi numera visat stort intresse för metoden.

I Sverige har vi faktiskt legat långt framme på området akademiskt, vilket i sin tur ledde till att textanalysföretaget Gavagai knoppades av. För den som vill få en djupare förståelse av ordrymder rekommenderar jag varmt att läsa Magnus Sahlgrens avhandling från 2006 (!) som, trots det relativt avancerade ämnet är ett föredöme i lättlästhet även för en språkteknologisk novis.

När du hör talas om ordrymder idag är det sannolikt att du istället hör det engelska namnet word embeddings eller rent av deep learning och AI eftersom den mest populära metoden som släpptes av Google 2013, kallad word2vec, bygger på en grund variant av deep learning, alltså neurala nätverk, som är del av forskningsfältet Artificiell Intelligens. För den intresserade kan jag rekommendera en pedagogisk bloggpost av Magnus Sahlgren, numera forskningschef på Gavagai,  som reder ut en del av likheter och skillnader inom det sammahängande fältet av AI, deep learning och ordrymder.

Tack vare briljanta och generösa människor inom IT och språkteknologi finns det idag sätt att själv experimentera med ordrymder för att till exempel filtrera ut negativa och positiva ord (och fraser) tillgängliga för människor som endast har mycket grunda kunskaper i hur man använder programkod.

Ett populärt och mycket lättillgängligt kodbibliotek som låter en använda Google’s algoritm word2vec med hjälp av Python är Gensim. Här följer några exempel på hur jag närmar mig problemet med att identifiera positiva och negativa ord och testa hur word2vec fungerar i Gensim.

import gensim
import pandas as pd # utmärkt dataanalys-bibliotek så vi enkelt kan spara CSV:er etc

model = gensim.models.Word2Vec.load("./big_model_150_mincount_30_no_stops")

Jag läser in min färdigtränade algoritm beskriven ovan. Det tog ungefär två dygn att träna upp den på 47 miljoner tweets på min dator. För den specialintresserade har jag beräknat 150 vektorer per ord och bara tagit med ord som förekommer fler än 30 gånger och inte tagit med fler-ordskombinationer som

  • inte bra
  • Dagens Nyheter
  • De Nya Moderaterna

Du kan se koden för framställningen av modellen här på min Github.

Dessa exempel blir i denna variant av modellen enbart följande ord för sig: “inte”, “bra”, “Dagens”, “Nyheter”, “Det”, “Nya”, “Moderaterna” med stora respektive små bokstäver och som alltså måste matchas exakt.

Vi börjar med att kolla vilka 20 ord som enligt algoritmen mest liknar tre negativa ord en kan använda om andra människor. Bry er inte om att det står positive i koden, det betyder bara att vi vill att algoritmen ska leta efter dem. Vi kan även komplettera med negative för att säga åt den att lägga en negativ vikt på ord som till exempel har flera betydelser (se mer på Gensim word2vec tutorial), varav vissa inte ska räknas in ungefär på samma sätt som man kan använda ett minustecken vid Google-sökningar.

model.most_similar(positive=["idiot","svin", "lögnare"],topn=20)

[('idioter', 0.7550226449966431),
 ('kräk', 0.7507501840591431),
 ('hycklare', 0.7367528676986694),
 ('fega', 0.7356211543083191),
 ('rasist', 0.7228284478187561),
 ('stolpskott', 0.7205626964569092),
 ('massmördare', 0.7148877382278442),
 ('dåre', 0.7092620134353638),
 ('äckel', 0.7045900225639343),
 ('pajas', 0.7038259506225586),
 ('kärring', 0.7000449299812317),
 ('girig', 0.6987353563308716),
 ('fegisar', 0.6981837749481201),
 ('blattar', 0.6931677460670471),
 ('mördare', 0.6923777461051941),
 ('zigenare', 0.6921749711036682),
 ('jävla', 0.6913812756538391),
 ('patetiska', 0.6883847713470459),
 ('feg', 0.6847716569900513),
 ('slödder', 0.6809489130973816)]

Som synes fångar metoden upp ord som både säger något om ursprungsordets betydelse, det vill säga liknande adjektiv som “hycklare”, “kräk” respektive “pajas” och något om ursprungsordets vanligaste sammanhang, om vilket jag bara vill säga brrrr… Jag hoppas innerligt att bland annat de metoder jag presenterar här kommer till användning för att förbättra den politiska situation som formas just nu i digitala medier på grund av felaktiga uppfattningar om världsläget vilket du kan läsa mer om i Is it just me, or has the world gone crazy?.

Om vi istället tittar på positiva omdömen om andra får vi på samma sätt förslag på närliggande ord statistiskt. För övrigt kan det vara trösterikt att känna till att de är långt vanligare än negativa även på Twitter.

//platform.twitter.com/widgets.js

model.most_similar(positive=["förebild","hjälte","hjältinna"],topn=20)

[('kämpe', 0.7751948237419128),
 ('inspirationskälla', 0.722464919090271),
 ('stjärna', 0.6930128931999207),
 ('pionjär', 0.6772516965866089),
 ('krigare', 0.6767622232437134),
 ('eldsjäl', 0.6764605045318604),
 ('räddning', 0.665830135345459),
 ('superhjälte', 0.6634135842323303),
 ('inspiratör', 0.6594758033752441),
 ('berättare', 0.6585543155670166),
 ('hyllning', 0.6584010720252991),
 ('glädjespridare', 0.6553477048873901),
 ('dröm', 0.6531526446342468),
 ('vardagshjälte', 0.6528267860412598),
 ('världsstjärna', 0.6490020751953125),
 ('solskenshistoria', 0.6482461094856262),
 ('ikon', 0.6476023197174072),
 ('legendar', 0.6445429921150208),
 ('kärleksförklaring', 0.6341878771781921),
 ('hedersman', 0.6284327507019043)]

Här ser vi igen en blandning av likhet i betydelse såsom i “stjärna”, “pionjär”, “inspiratör”, men även dess sammanhang såsom i “kärleksförklaring”, “hyllning” och “solskenshistoria”.

För den som är intresserad av positivt och negativt laddade ord skriver jag ut en CSV-fil med de 1000 vanligaste orden i närheten av de ord jag ovan bedömt som positiva respektive omdömen. Kom ihåg att algoritmen endast svarar på vilka ord som statistiskt sett befinner sig nära varanda så du inte förleds att tro att den faktiskt förstår ordens betydelse och kan skilja mellan positivt och negativt. Om du läser igenom dem och gör din egen bedömning för vart och ett av orden så kan du enkelt placera dem i rätt kolumn och till exempel dela upp dem i ordform, ämnesområde eller på annat sätt göra dem mer användbara. Fördelen med just de här orden är att de är de statistiskt mest förekommande baserat på ett stort och rikt urval av ord, så även med enkla ordräkningsmetoder torde de ge många träffar på vardagsspråk i sociala medier.

neg = model.most_similar(positive=["idiot","svin", "lögnare"],topn=1000)
pos = model.most_similar(positive=["förebild","hjälte","hjältinna"],topn=1000)
combined = {"pos":pos,"neg":neg}
df = pd.DataFrame(combined)
df.to_csv("./pos-neg.csv", header=True,index=False)

Om du sitter på egna funderingar eller idéer i hur du skulle vilja tillämpa den här eller liknande metoder tveka inte att prova på Python för textanalys och höra av dig till mig om du vill ha hjälp på något sätt där du tror att jag är ett bättre stöd än Googles samlade resurser.

Twittra mig på @mattiasostmar eller om du föredrar det kan du mejla mig. Eller varför inte gilla att jag håller på med sånt här på min sida på Facebook ;-)