Meelestatuse analüüs

Martin Mölder
2020

Järgnev ülevaade eeldab algteadmisi R-st ja on ennekõike praktilise suunitlusega: rõhk on sellel, kuidas on võimalik teha lihtsat meelestatuse analüüsi R-s.

Meelestatuse analüüs ehk inglise keeles sentiment analysis (eesti keelde võiks selle tõlkida ka kui tundmusanalüüs) on meetod, mis võimaldab hinnata, kas teksti sõnavara on valdavalt positiivne või negatiivne. Kuigi kaasaegsed masinõppe ja kvantitatiivse tekstianalüüsi meetodid võivad meelestatuse analüüsi ka üpriski keeruliseks teha, on ta oma kõige lihtsamal kujul üks kergemini mõistetavamaid ja rakendatavaid kvantitatiivse tekstianalüüsi meetodeid.

Meelestatuse analüüs on üks lihtsamaid analüüse, kuna see kujutab endast tekstis esinevate positiivsete või negatiivsete sõnade kokku lugemist. Mida rohkem on ühes dokumendis positiivseid sõnu, seda rohkem on see dokument emotsionaalselt ehk oma meelestatuse poolest positiivne ja vastupidi – mida enam dokument sisaldab negatiivseid sõnu, seda enam on see oma meelestatuse poolest negatiivne.

Positiivsete ja negatiivsete sõnade eristamine

Taolise meetodi rakendamine eeldab, et esmalt on ära määratletud, millised sõnad väljendavad positiivseid ja millised sõnad negatiivseid emotsioone. See võib olla üpriski keeruline ülesanne. Õnneks on see aga midagi, mida selle meetodi kasutaja ei pea ise tegema. See töö on juba tehtud. Keeleuurijad on koostanud vastavaid sõnaraamatuid/leksikone (dictionary), mis kujutavad endast loetelusid sõnadest, mis on seotud kas positiivsete, negatiivsete või muude emotsioonidega.

Näiteks on eesti keele kohta taolisel otstarbel kasutatav sõnaraamat allalaetav siit.

Näiteks sõnad nagu „õnn“ või „armastus“ väljendavad üpriski üheselt mõistetavalt positiivseid emotsioone ning sõnad nagu „kurb“ või „surm“ väljendavad üldiselt negatiivseid emotsioone. Meelestatuse analüüs loeb eelnevalt määratletud meelestatuse sõnaraamatuid kasutades kokku, kui palju on ühes tekstis positiivseid või negatiivseid sõnu. Osade sõnade emotsionaalne alatoon võib aga sõltuda kontekstist ning grammatilistest struktuuridest (näiteks eitus) ning sellistel juhtudel võib kõige lihtsam sõnaraamatupõhine meetod natuke hätta sattuda.

Positiivsete ja negatiivsete sõnade arvu põhjal on võimalik määratleda analüüsitavate tekstide erinevaid aspekte. Esmalt on võimalik uurida, kui suur osa dokumendis leiduvatest sõnadest on üleüldiselt emotsioonidega seotud, ükskõik kas siis positiivsete või negatiivsetega. Loomulikult on võimalik määratleda, kui suur osa neist sõnadest on kas positiivse või negatiivse tähendusega. Niimoodi on väga lihtsal ja esmasel viisil võimalik mõõta tekstide emotsionaalsust ning emotsionaalset alatooni või teisisõnu polaarsust. Need on ühe teksti kaks erinevat aspekti. Tekstis võib olla väga vähe sõnu, mis viitavad emotsioonidele, kuid nendest vähestest võivad kõik viidata kas positiivsetele või negatiivsetele emotsioonidele. Seega peab mõlemat aspekti eraldi arvesse võtma.

Kõige lihtsamal juhul koosneb teksti emotsionaalsus üksnes positiivsetest või negatiivsetest emotsioonidest, kuid mõned emotsioonide või meelestatuse sõnaraamatud (eriti inglise keele kohta koostatud) pakuvad ka palju täpsemaid liigitusi, mis eristavad selliseid emotsioone nagu viha, rõõm või kurbus.

Analüüsitava teksti formaat

Kuigi paljud lihtsamad kvantitatiivse tekstianalüüsi meetodid eeldavad, et tekstid oleksid dokument-termin maatriksi kujul, siis meelestatuse analüüsi jaoks pole see ilmtingimata vajalik. Pea meeles, et selle analüüsi kõige lihtsama vormi põhimehhanism on lihtsalt dokumentides esinevate sõnade kokku lugemine ja kategoriseerimine. Seda on võimalik teostada erinevate andmeformaatidega.

Näiteks võivad analüüsitavad dokumendid olla R-is salvestatud nimekirjana (list), kus iga nimekirja element on ühte teksti sisaldav tekstiline vektor ning iga element selles vektoris on sõna ühes dokumendis. Sellisel juhul peaks analüüsima igat elementi selles nimekirjas, mis sisaldab ühe dokumendi kõiki sõnu, ning kokku lugema kas siis positiivsed või negatiivsed sõnad, mis seal esinevad.

Analüüsitavad dokumendid ja nendes sisalduvad sõnad võivad esineda ka dokument-termin maatriksi kujul. Dokument-termin maatriks on andmetabel, mis sisaldab endas informatsiooni kõikide dokumentide sõnavara kohta. Selles andmetabelis on iga rida üks dokument ja iga tulp vastab ühele sõnale kõikide analüüsitavate dokumentide kogusõnavaras. Seega näitavad andmetabelis kujutatud arvud, kui palju iga sõna kõikide dokumentide kogusõnavarst igas dokumendis esines. Taolise andmeformaadi korral peaks meelestatuse analüüsi läbi viima mõnevõrra erinevalt. Sellisel juhul oleks vaja kindlaks teha, millistes tulpades esinevad sõnad vastavad millistele emotsioonidele. Seejärel peaks võtma iga rea selles maatriksis ning kokku liitma positiivsete ja negatiivsete emotsioonidega seotud sõnade esinemissagedused.

Meelestatuse analüüsi paketid

R-is on võimalik meelestatuse analüüsi teostada mitme erineva paketi kaudu ning siin on keskendutud neist ühele – quanteda (lühend sõnadest quantitative analysis of textual data). See on üks vähestest pakettidest R-is, mis pakub suhteliselt lihtsa, kuid samas mitmekesise tööriistakasti tekstiliste andmete analüüsiks ning on hästi integreeritud teiste tekstianalüüsi tööriistadega, mis sisalduvad teistes enam levinud pakettides.

Quanteda võimaldab ka lihtsalt teostada tekstianalüüsiks vajalikud eelsammud (tekstide puhastamine ja ette valmistamine), nagu näitaks kirjavahemärkide ja numbrite eemaldamine, suurte tähtede muutmine väikesteks tähtedeks ning stopp-sõnade eemaldamine. Vaikimisi on see mõeldud ingliskeelsete tekstide analüüsiks, kuid ta võimaldab teha analüüse ka teistes keeltes.

Teksti ette valmistamine analüüsiks

Oletame, et analüüsi alguses on R-s kõik analüüsitavad dokumendid elemendid tekstilises vektoris. Kõik sõnad ja kõik laused – kogu tekst tervikuna – on ühes „tükis“. See on tavapärane olukord juhul, kui oled analüüsitavad tekstid oma arvutist R-i sisse laadinud või kui oled need tekstid kusagilt Internetist kokku kogunud. Need suured kogu teksti sisaldavad tükid tuleks osadeks teha, puhastada ja korrastada enne, kui neid on võimalik analüüsida.

Kui alustada tekstilise vektoriga, kus iga element on terve tekst, siis on võimalik quanteda paketist kasutada funktsiooni tokens(), et teostada mitmed vajalikud teksti puhastamise sammud. Sõna tokens viitab siin teksti baasühikutele, mis enamasti on lihtsalt sõnad. Kui seda funktsiooni kasutada ilma täiendavate argumentideta, siis ta eraldab üksteisest teksti kõik elemendid (sõnad) ning annab väljundiks objekti, mis on sisuliselt nimekiri (list), kus iga nimekirja element on ühe dokumendi sõnade vektor.

Nüüd on suured teksti „tükid“ jagatud väiksemateks elementideks, sõnade vektoriteks. Need sõnade vektorid sisaldavad ka kirjavahemärke ja numbreid, mida on samuti võimalik eemaldada funktsiooniga tokens(). Selleks tuleb funktsiooni argumentidele remove_numbers ja remove_punct anda väärtus TRUE. Seega näeks see funktsioon välja selline:

tokens(my_data, remove_numbers = TRUE, remove_punct = TRUE) ,

kus my_data on see objekt, mis sisaldab neid tekste, mida soovitakse analüüsida.

Stopp-sõnad on sellised sõnad, mis ei sisalda tähenduslikku sisu (näiteks sidesõnad) ning seetõttu on nad mõistlik ja võimalik paljudest analüüsidest välja jätta. Stopp-sõnade eemaldamiseks on võimalik kasutada funktsiooni tokens_remove(). Esimese argumendina sellele funktsioonile tuleb anda objekt, mis sisaldab analüüsitavaid tekstielemente (token). Argumendiga pattern tuleb funktsioonile anda stopp-sõnade nimekiri. Inglise keeles sisalduvaid stopp-sõnu on R-i võimalik laadida funktsiooniga stopwords("en"), mis annab väljundiks stoppsõnade nimekirja. Seega näeks funktsioon tokens_remove() välja selline:

tokens_remove(my_tokens, pattern = stopwords(„en“)) ,

kus my_tokens on see objekt, mis loodi eelneva käsuga tokens().

Kui seda funktsiooni rakendada, siis annab see väljundiks samad tekstide sõnade vektorid, kuid ilma stopp-sõnadeta.

Eesti keele stoppsõnade loend on võimalik leida siit.

Lihtsama meelestatuse analüüsi teostamine

Nüüd on tekstid valmis kõige lihtsama meelestatuse analüüsi teostamiseks, et emotsioonidega seotud sõnad kokku lugeda. Selleks on vaja vastavat sõnaraamatut, mis ütleb, millised sõnad on seotud positiivsete ja millised negatiivsete emotsioonidega.

Kui tegeleda ingliskeelsete tekstidega, siis sisaldab quanteda sõnaraamatut nimega Lexicoder sentiment dictionary. Selles on 4 klassifikatsiooni: positiivsed ja negatiivsed sõnad, aga ka positiivsete sõnade eitused ja negatiivsete sõnade eitused. Lihtsa analüüsi puhul võib esmalt kokku lugeda üksnes positiivsete ja negatiivsete sõnade esinemissagedused ning jätta nende eitused esialgu mängust välja.

Kuidas neid positiivseid ja negatiivseid sõnu kokku lugeda? Quanteda paketis on seda võimalik teha funktsiooniga tokens_lookup(). Esimese argumendina tuleb talle anda objekt, mis sisaldab analüüsitavaid tekste ja sõnu. Argumendiga dictionary tuleb talle anda vastav sõnaraamat. Lexicoder sentiment dictionary on R-is ja quanteda-s allpool välja toodud nime all ning kui soovid keskenduda ainult kahele esimesele kategooriale (positiivsed ja negatiivsed sõnad, kuid mitte nende eitused), siis näeb see funktsioon välja selline:

tokens_lookup(my_tokens, dictionary =  data_dictionary_LSD2015[1:2])

Kui seda funktsiooni rakendada, siis annab ta väljundiks objekti (nimekiri, list), kus iga element vastab ühele analüüsitavale dokumendile ning sisaldab termineid „positive“ ja „negative" iga korra kohta, kui positiivne või negatiivne sõna esines vastavates dokumentides. Nüüd on võimalik kokku lugeda, kui palju nendesse kategooriatesse kuuluvaid sõnu esines analüüsitavates dokumentides.

Sellisel viisil on võimalik saada põhilised toorandmed dokumentides sisalduvate emotsioonide kohta. Analüüsiga edasiminekuks on palju erinevaid võimalusi. On võimalik arvutada positiivsete sõnade suhe negatiivsetesse sõnadesse, et hinnata vastandlike emotsioonide tasakaalu. Samuti on võimalik arvutada emotsioonidega seotud sõnade osakaal kõikidest dokumendis sisaldunud sõnadest selleks, et määratleda dokumendi üldise emotsionaalsuse tase.

Need on kirjeldavad analüüsid, kuid emotsioone on võimalik kasutada ka dokumentide teiste omaduste seletamiseks, nagu näiteks dokumendi loomise aeg või selle autor. Neid andmeid kasutades on võimalik luua mudeleid hüpoteeside testimiseks dokumentide omaduste kohta. Näiteks on uuritud, kas (riigijuhtide) öösel postitatud Twitteri säutsud on teistsuguse meelestatusega kui päeval postitatud säutsud.

 

Näide

R-is on olemas pakett nimega "sotu", mis sisaldab USA presidentide iga-aastaseid nö "olukorrast riigis" kõnesid (State of the Union Address). Neid võib kasutada, et teostada lihtsamat sorti meelestatuse analüüs. Allpool on välja toodud terviklik kood, mis sellise analüüsi teostab ning selle ühed võimalikud tulemused joonisena. Kui vastavad paketid on installeeritud, siis see kood töötab igas arvutis ja see näide on võimalik ise läbi teha.

 

library(sotu)

data(sotu_text) # Siin on tekstid.

data(sotu_meta) # Siin on lisaandmed tekstide kohta, nagu näiteks aeg, president ja tema erakondlik kuuluvus.
library(quanteda)
# Järgnev käsk eraldab tekstid sõnades ja teostab esmase puhastamise. 
data <- tokens(
  sotu_text, 
  remove_numbers = T,
  remove_symbols = T,
  remove_punct = T,
  )
data_sen <- tokens_lookup(data, dictionary =  data_dictionary_LSD2015) # See tuvastab sõnaraamatu alusel positiivsed ja negatiivsed sõnad koos eitustega. 
data_sen <- tokens_replace(data_sen, "neg_negative", "positive") # Negatiivsete väljendite eitamine on arvestatud positiivse emotsiooni väljendusena. 
data_sen <- tokens_replace(data_sen, "neg_positive", "negative") # Positiivsete väljendite eitamine on arvestatud negatiivsete emotsioonide väljendusena. 
counts_sen <- lapply(data_sen, table) # Loeb kokku kui palju positiivseid ja kui palju negatiivseid sõnu oli. 
data_sen2 <- do.call(rbind, counts_sen) # Muudab nimekirja andmetabeliks. 
# Nüüd on meil olemas andmetabel, kus iga rida vastab ühele kõnele ja tulpades on ära näidatud positiivsete ja negatiivsete sõnade osakaal. 
counts_words <- unlist(lapply(data, length)) # See annab meile iga kõne pikkuse sõnades.
data_sen3 <- data_sen2/counts_words # Ning see arvutab positiivsete ja negatiivsete sõnade proportsiooni. 
data_sen3 <- data.frame(data_sen3)
data_sen4 <- cbind(sotu_meta, data_sen3)
# Lõpuks saame sellisest analüüsist järgmise joonise, mis näitab positiivsetele ja negatiivsetele emotsioonidele viitavate sõnade osakaalu kõnedes. 
 library(ggplot2)
ggplot(data_sen4, aes(x = year)) +
  geom_line(aes(y = positive), color = "firebrick3") +
  geom_line(aes(y = negative), color = "dodgerblue3") +
  labs(title = "Positiivsete (punane) and negatiivsete (sinine) emotsioonide osakaal kõnedes",
       x = "aeg",
       y = "osakaal") +
  theme_bw()

Positiivsete (punane) ja negatiivsete (sinine) emotsioonide osakaal kõnedes

Valminud Hariduse Infotehnoloogia Sihtasutuse IT Akadeemia programmi toel.

back