Blogi

Kuinka kehitetään sovellus, joka seuraa, mitä meistä puhutaan Twitterissä?

Sebastian Falk

Kuka työntekijöistämme puhuu pahaa Petristä?
Mitkä frameworkit ovat tällä hetkellä suosiossa?
Miten saamme seuraamamme twiitit tuotua suoraan Slackiin?

Nämä kysymykset sekä halu leikkiä AWS:ssä johtivat testaamaan, miten luotaisiin yksinkertainen Twitteriä monitoroiva sovellus. Ideana oli kehittää kevyt sovellus, joka hakee määritellyn avainsanan sisältävät Twitter-postaukset, analysoi ne ja lähettää tweetit sekä analyysin halutulle Slack-kanavalle. Tähän postaukseen on dokumentoitu oppimisprosessin eri vaiheet, jotta muutkin voivat hyötyä havainnoista tai toisaalta haastaa niitä ratkomalla tehtävää toisin. Voit tutustua projektiin myös GitHubissa.


Liikkeelle olemassa olevien ratkaisujen pohjalta?

Nopealla Google-haulla löytyi automate.io sovellus,  jonka avulla voi luoda botin jolla on triggeri (meidän tapauksessa avainsanan sisältävän tweetin luonti). Botille annetaan tehtävä,  joka suoritetaan kun botti tunnistaa trigger-tapahtuman. Meillä botin tehtävä on viestin edelleenlähetys valitsemaamme Slack-kanavaan.

Koska ideamme kuitenkin oli myös käyttää AWS:än palveluita tweettien analysointiin, törmäsimme siihen, ettei näitä palveluita voitu kutsua suoraan automate.io:n kautta. Näin ollen meidän olisi pitänyt luoda joka tapauksessa oma rajapinta AWS:ään, käyttäen esimerkiksi API gatewaytä ja lambda funktioita. Huomioituamme myös sen, että automate.io:n ilmaisen käyttäjän maksimikutsumäärä kuukaudessa on vain 250,  päätimme luoda sovelluksen mieluummin kokonaan itse.


Twitterin Standard search API hakee Twitterin sisällöstä määrittämämme avainsanan

Päätimme siis luoda ohjelman pythonilla ja pyörittää sitä lambda funktiona AWS:ssä. Funktiota ajetaan viiden minuutin välein. Ensimmäinen funktion tehtävä on hakea kaikki uudet tweetit jotka sisältävät määrittelemämme avainsanan. Tämä onnistuu käyttämällä Twitterin Standard search API:a. Tätä varten olemme luoneet Twitteriin appin, jonka tunnuksilla pystymme kutsumaan API:a. Kun ensimmäisen kerran teemme hakupyynnön, kutsumme seuraavan kaltaista urlia https://api.twitter.com/1.1/search/tweets.json?q=sysart+OR+%40SysartOy&count=100&since=2018-03-27

Tämä kutsu palauttaa päivästä 27.03.2018 lähtien kaikki sellaiset tweetit jotka sisältävät sanan sysart, tai joiden kirjoittaja on SysartOy -käyttäjätili. Ensimmäisen kutsun vastauksessa saamme refresh_url parametrin, jota meidän tulee käyttää seuraavassa kutsussa. Käyttämällä tätä parametriä alkuperäisen urlin tilalla emme saa uudestaan tweettejä jotka me olemme jo hakeneet.


AWS Comprehend ei tue suomenkielisen tekstin analysointia


Haettuamme uuden tweetit, testaamme pystyisimmekö analysoimaan viestin sisältöä. AWS Comprehend sisältää työkaluja tekstin analysointiin, esimerkiksi tekstin aiheen määrittelyn, avainsanojen etsimisen sekä viestin sävyn päättelyn. Päätimme testata API:a joka määrittelee, onko viesti sävyltään positiivinen, neutraali vai negatiivinen. Ongelmaksi AWS Comprehend:ssä osoittautui se, että se tukee vain englannin- ja espanjankielisten tekstien analysointia. Suomeksi julkaistun twiitin sävyn Comprehend arvioi aina neutraaliksi.


Viestin lähetys Slack-kanavalle


Sovelluksemme havaitseman tweetin sekä Comprehend-analyysin tuloksen lähettäminen määrittelemällemme Slack-kanavalle on helppo toteuttaa. Tämän voimme tehdä käyttämällä Slackin API:a ja Slackiin luomaamme appia, jonka tunnuksia käytämme kutsuessamme API:a. Luomme Slack-appillemme webhook urlin, jota kutsumme. Kutsuun liitämme viestin, jonka haluamme lähettää, eli linkin tweettiin ja tuloksen jonka saimme Comprehendistä.

Esimerkki Slack-kanavalle tulevasta viestistä:

twitter-comprehend-esimerkki (1)


Terraform, helppo tapa deployata AWS:ään

Mitä tapahtuu, jos haluamme jatkossa luoda uuden samanlaisen funktion, tai toisia funktioita jotka vahtivat erilaisia tweettejä? Joudummeko  luomaan kaiken käsin uudestaan alusta? Välttääksemme tämän, otamme avuksi Terraform-työkalun.

Terraformia varten luodaan skripti jossa määritellään mitä kaikkea halutaan sen tekevän. Ensinnäkin lambda funktiomme tarvitsee ulkoisia kirjastoja. Emme halua lisätä näitä versiohallintaan, mutta onneksi Terraformilla on mahdollista ajaa komentorivikomentoja. Pystymme siis ajamaan pip komennon jolla lataamme tarvittavat kirjastot. Tallennamme nämä kirjastot samaan hakemistoon joka myös sisältää lambda funktiomme.

Seuraavaksi meidän pitää luoda zip tiedosto lambda funktio hakemistostamme. Tämä onnistuu myös helposti Terraformilla, sen archive_file konfiguraatiolla. Tarvitsemme zip tiedoston hakemistostamme koska sen avulla voimme luoda lambda funktion.

Luomme myös S3 bucketin, jossa säilytämme aikaisemmin mainittua refresh_url parametria. Tämän jälkeen luomme IAM roolin jonka annamme funktiollemme jotta sillä on oikeus kirjottaa cloudwatch logeja, hakea refresh_url parametria S3 bucketista sekä kutsua Comprehend:in API:a. Luomme myös Cloudwatch event säännön joka ajaa funktiotamme viiden minuutin välein.

Nyt olemme määritelleet Terraform skriptissä kaikki ne resurssit jotka haluamme luoda. Voimme nyt ajaa seen komennolla “terraform apply”. Jos haluamme muuttaa jotain, niin voimme vain ajaa tämän komennon uudestaan. Terraform tarkistaa silloin automaattisesti mitä resursseja se voi suoraan muuttaa ja mitä se joutuu poistamaan ja lisäämään uudestaan.


Jatkokehitysidea

Näin olemme luoneet sovelluksen joka vahtii tweettejä ja analysoi niiden sävyä. Jatkokehityksenä voisimme esimerkiksi luoda kaksi lambda funktiota, yhden joka vahtii tweettejä jotka puhuvat react:sta ja toisen, joka vahtii sellaisia, jotka puhuvat vue:sta. Vertailemalla näiden twiittien määrää ja sävyä saisimme tietää kummasta frameworkistä ihmiset pitävät enemmän.

 

Tilaa blogikirjoitukset

Aiheet: Oppiminen, Ohjelmistokehitys

Sebastian Falk
Sebastian Falk

Päiväsaikaan ohjelmistokehittäjä ja koneoppimisosaaja, öisin scifi-kirjoista kiinnostunut (melkein) ammattipelaaja.