Kategoriat
Yleinen

Reddit-datan kerääminen r/wallstreetbets alaredditistä

Kymmenellä rivillä koodia joista osa on turhia

Python

Tässä blogitekstissä kerrotaan miten redditistä voi kerätä dataa käyttämällä yksinkertaista python ohjelmaa. Sen käyttö ei vaadi koodausosaamista, riittää jos osaa tehdä python asennuksen ja avata tiedoston mukana tulevalla työkalulla.

Datan keräämiseen tarvitaan siis python-ohjelmointikielen asennus tietokoneelle. Kätevän ja jokseenkin pöhöttyneen ratkaisun tarjoaa Anaconda ja sen voi asentaa tietokoneelleen täältä.

Kun kärmes on asennettu, voidaan siirtyä datan keräämiseen. Tässä esimerkissä käytetään Pushshift APIa sekä sille räätälöityä python kirjastoa nimeltä psaw. Jos ei jaksa lukea blogitekstiä niin koodi löytyy datalabin githubista täältä.

Psaw-kirjasto täytyy asentaa ennen sen käyttämistä. Anacondan (ja vähemmän pöhöttyneen minicondan) mukana tulee python pakettien asentaja nimeltä pip, ja tarvittavan paketin voi asentaa kirjoittamalla anacondan komentoriville komento pip install psaw

anaconda komentorivin käynnistys windows koneella

Vihko

Koodi on kirjoitettu internet-selaimessa pyörivään Jupyter-vihkoon. Sen voi käynnistää joko anacondan valikosta tai kirjoittamalla jupyter notebook promptiin. Githubista löytyvän vihkon voi avata omalla koneella ja tehdä redditiin hakuja muuttamalla hakuparametrejä mieleisekseen (ja lisäämällä uusia). Pushshift API tarjoaa useita tapoja rajata haettavaa dataa. Esimerkiksi parametrillä q voi postauksen otsikkoon tai tekstiin kohdistaa sanahakuja, mutta tässä käytetään vain seuraavia parametrejä:

  • after: ajankohta jonka jälkeen postauksia haetaan (VVVV-KK-PP)
  • before: ajankohta johon asti postauksia haetaan
  • subreddit: alareddit josta haetaan
testihaussa käytetyt hakuparametrit jupyter vihkossa

Haku tehdään postausten (submission) endpointiin ja kohdennetaan r/wallstreetbets alaredditiin. Se on aktiivinen yhteisö joka tunnetaan mm. äkillisestä innostuksesta ostaa Gamestop-yrityksen osaikkeita alkuvuodesta 2021.

Testissä haetaan postauksia puolentoista kuukauden ajalta lokakuun alusta marraskuun puoleenväliin 2021 ja niitä löytyi hieman yli 41 000, eli n.900 kpl/päivä.

Nopeata tarkastelua varten postausten data laitetaan Pandas-kirjaston avulla luotuun taulukkoon. Esimerkissä taulukko on nimetty nimellä df, joka on lyhenne sanoista DataFrame. Pandas kirjasto löytyy valmiina anacondasta. Taulukon voi muuttaa helposti esimerkiksi csv-tiedostoksi komennolla df.to_csv('myRedditDataCsv.csv')

Palkkikaavio

Seuraavaksi dataa analysoidaan värikkäällä palkkikaaviolla. Redditissä postauksella voi olla ”flair” joka on käyttäjän sille lisäämä luokittelu ja josta käy ilmi postauksen aihe. Joissain alaredditeissä sellainen vaaditaan kun taas joissain sitä ei käytetä ollenkaan. Kerätyssä datassa flair on muuttuja nimeltä "link_flair_text” ja pandas-taulukosta voi nopeasti tarkastaa, että kerätyissä postauksissa kyseinen sarake saa vain 15 Null -arvoa. Tämä kertoo siitä että kyseisessä alaredditissä postausten merkitseminen flairilla on todennäköisesti pakollista.

Eri flairien määrät on visualisoitu aina trendikkäällä palkkikaaviolla.

flairien määrärt kerätyissä postauksissa

Tuloksista näkee, että flaireja on postausten määrään nähden vähän, mikä todennäköisesti johtuu siitä että ne valitaan valmiista listasta eikä niitä voi keksiä itse.

Koodi löytyy siis Xamkin datalabin githubista. Onnistuneen python asennuksen jälkeen koodia voi pyörittää omalla koneella painamalla play-nappia. API:n avulla voi selvittää esimerkiksi miten monta kertaa iltasanomien url on jaettu Redditissä,kerätä kaikki kuva-urlit r/historymemes -yhteisöstä tai vaikka kaikki koronamegaketjuihin tehdyt kommentit.

Kategoriat
Yleinen

Instagram-kuvien analysointi Azuren konenäöllä

Kuten sadoissa muissa organisaatioissa, Kaakkois-Suomen ammattikorkeakoulussa käytetään Microsoftin ohjelmistoja ja palveluita. Teamsien ja powerpointtien lisäksi Data-analytiikka on ottanut käyttöönsä Microsoftin pilvipalvelualusta Azuren, josta löytyy monenlaista palvelua SQL-palvelimesta koneoppimismallien luomiseen.

Yksi palvelutyyppi on nk. kognitiiviset palvelut johon kuvien analysointi eli konenäkö kuuluu. Päätelmien tekeminen suuresta määrästä digitaalisia valokuvia niitä näkemättä tuntui mielenkiintoiselta ajatukselta. Azuren konenäössä on monenlaisia ominaisuuksia: on kasvojentunnistusta, kuvassa olevan tekstin tunnistusta, kuvien kategorisointia jne. Päätin lopulta kokeilla automaattista kuvatekstien ja tagien luomista valokuville jotta syntyisi jonkinlainen käsitys siitä miten se kuvia lajittelee.

Esimerkki automaattisesti generoidusta kuvatekstistä ja tageista. Tekstille ja jokaiselle tagille on myös konenäön tekemä ”confidence score”.

Testiaineistoksi valikoitui oppilaitoksemme Xamkin virallinen Instagram-tili ja sieltä 2000 valokuvaa.

Miten se toimii?

Konenäkö on API, eli ohjelmointirajapinta (Application Programming Interface). Yksinkertaisimmillaan sinne syötetään kuva ja kone palauttaa kuvalle pyydetyn datan (esim. tunnistetut kasvot, kuvauksen jne.) Tässä harjoituksessa käytin rajapintaa python-ohjelmointikielen avulla, jolle Microsoft tarjoaa kehitysalustan. Käytännössä Azureen perustetaan resurssi josta saa tarvittavan salasanan. Koodikirjastot tuodaan pythonin import-komennolla ja client autentikoidaan salasanalla, minkä jälkeen rajapintaan voi alkaa heitellä kuvia. Rajapinnasta on kattava ja johdonmukainen dokumentaatio.

Python-ohjelmointikielen tarvittavien koodikirjastojen tuonti ja clientin autentikointi konenäölle ja kasvojentunnistukselle.

Päätin hakea kuvatekstit ja tagit 2000 kuvalle ja liittää saadut tulokset osaksi Instagram-aineiston metadataa. Kahden tuhannen kuvan läpikäynti kestää koneelta jonkin aikaa, joten kerkesin käydä välillä lounaalla ja palata sitten katsomaan mitä tuloksista mahdollisesti voi saada irti.

Ja toden totta, tekoäly oli keksinyt kuville englanninkieliset kuvatekstit ja tagit. Azuressa olisi mahdollista myös kääntää tekstit automaagisesti suomeksi mutta tämä vaatisi lisää API-kutsuja, joten päätin pärjätä kolmannella kotimaisella. Analyysissä käytin pythonin pandas-kirjastoa jossa data on taulukkona (dataframe) ja sen filtteröintiin ja muokkaamiseen on paljon tehokkaita työkaluja.

Polkupyöräkuvien etsiminen – with confidence

Tagien avulla suuresta kuvamassasta voi hakea tiettyjä elementtejä sisältäviä kuvia. Kokeilin hakea 2000 kuvan joukosta ne, joissa on tägi ”polkupyörä” (eli siis bicycle). Tuloksista selvisi, että Bill Gatesin robottisilmälasit ovat nähneet yhteensä 27 kuvaa joissa on polkupyörä.

kuvat['pyörät']=kuvat['tagit'].str.contains('bicycle')

Suodatin polkupyöräkuvat tykkäysten mukaan alenevaan järjestykseen ja katsoin mitä kone on oikein nähnyt. Aluksi kaikki vaikuttaa hyvältä. Esimerkiksi 157 tykkäystä saaneessa, Vappua juhlistavassa kuvassa on selkeästi polkupyörä ja kone antaa ’bicycle’ -tagille confidence scoren 0.9501 mikä on todella kova.

Koneen mielestä tässä kuvassa on polkupyörä yli 95 % luottamustasolla.

Seuraavassa kuvassa ei kuitenkaan ole polkupyörää. Siinä on polkupyörä-tägi ja mies hymyilemässä jonkinlaisen osittain näkyvän metalliputkihässäkän luona mikä aivan ilmeisesti ei ole polkupyörä. Kuvan bicycle-tag onkin saanut confidence scoren 0.31. Luokittelua varten päätin rajata pisteytyksen 0.9 ja sitä suurempiin lukuihin. Tätä varten pandasilla on helppo luoda uusi taulukko kuvista, joissa on mukana vain tagit joiden luotettavuusarvo ylittää 0.9. Polkupyörien kohdalla tämä toimii mainiosti ja lopulta onnistun etsimään kaikista kuvista vain sellaisia, joissa oikeasti on pyörä. Lisäksi on tuntematon määrä kuvia joissa on pyörä mutta jotka eivät saa polkupyörä-tagia.

Julkiset naamat

Lievänä yllätyksenä tuli, että kuvatekstitoiminto tunnistaa julkkisten naamoja. Azuressa on erikseen kasvojentunnistin, jolla kasvoille voi generoida tunnisteen. Tunnisteen avulla samanlaisia kasvoja voi etsiä kuva-aineistoista. Kuvateksti-toiminto kuitenkin löytää suvereenisti suomalaisia julkkiksia. Koska Xamk on vahvasti mukana Emma-gaalassa, päätin katsoa onko gaalakuviin tallentunut julkisia naamoja. Etsinnässä auttaa myös tässä yhteydessä käytetty hashtag ”xamkgoesemma”. Keinosilmät ovat nähneet mm. 3 Anna Puuta, Reino Nordinin, Juha Tapion, Sanni Kurkisuon ja Erkki Liikasen (joista viimeinen ei ehkä Emma-gaalasta).

Kuvassa Pyhimys puvussa. Tekoälyn mielestä kyseessä on 0.563 todennäköisyydellä ’gentleman’.

Yksi hämmentävä ilmiö ovat julkkisten kaksoisolennot. Kone löysi Xamkin Instagramista useita ulkomaisia julkkiksia, jotka lähemmässä tarkastelussa osoittautuivat tavallisiksi tallaajiksi jotka vain sattuvat näyttämään julkkiksilta.

Scoreissa on eroja

Luottamuspisteytykset jotka kone ilmoittaa kuvateksteille ja tageille poikkeavat ratkaisevasti toisistaan. Kuvateksti joka saa pisteytyksen 0.5 on usein ”oikein” ja jopa hyödyllinen, kun taas jos haluaa luokitella kuvia tagien avulla niin 0.5 tasoa ei välttämättä kannata ottaa mukaan.

Ero käy ilmi myös luottamustasojen jakaumasta. Tarkastelin kuvatekstien ja tagien saamia pisteitä tekemällä niistä box-plotit pandasissa:

kuvat['caption_confidence'].plot(kind='box', vert=False, figsize=(10,5), title = 'caption_confidence')

Datassa on 2000 koneen generoimaa otsikkoa. Mediaani on alle 0.5:ssä. Silläkin tasolla otsikot ovat kuitenkin usein ”oikein”.
Kahdessatuhannessa kuvassa on hieman alle 18000 tagia (n.9kpl/kuva) 25. ja 75. persentiilit asettuvat välille 0.7-0.94 mediaanin ollessa 0.869.

Konenäön tekemän luokittelun luotettavuuden arvioinnissa koneen ilmoittamat pisteytykset ovat hyvä apuväline. Erityisen mielenkiintoista on etsiä tageja joista kone on omasta mielestään lähes varma, mutta jotka kuitenkin ovat päin honkia.

Seuraavia harjoitteita

Kuvatekstigeneraattorin kyvystä tunnistaa julkisuuden henkilöitä syntyi ajatus syöttää konenäölle julkisuuden henkilöitä. Suunnitelmissa on käyttää kotimaisten digitaalisten viihdeuutisten kuvastoa ja analysoida keitä se tunnistaa ja keitä ei. Jatkuu seuraavassa numerossa.