SENTIMENT ANALÝZA MÉDIÍ

Radka Malik
12 min readMar 11, 2018

--

Mediální obraz druhé přímé prezidentské volby v ČR

Závěrečný projekt Digitální akademie Czechitas Ostrava 2018, za podpory Google.org

Autorky: Radka Malik a Hanka Pavlasová

Mentor: Petr Kotas, Red Hat

Pro náš projekt jsme zvolily téma analýzy sentimentu článků v období prezidentské kampaně neboli v jakém sentimentu se psalo o jednotlivých kandidátech v daných médiích. Domníváme se, že analýzy médií podobného typu jsou v dnešní době klíčové nejen pro účely firem, prezentace politických agend, ale i pro občany. Pro jejich přehled a zvýšení chápání souvislostí. Samozřejmě tyto analýzy jsou důležité o to více, čím více vzrůstá vliv dezinformačních webů i fenoménu „oligarchizace“ a je snaha lidi uzavírat do názorových bublin, kde konzumují pouze takový obsah, který jim potvrzuje vlastní úsudek, bez ochoty kriticky uvažovat o podávané skutečnosti. Studii o těchto hrozbách už v minulosti vypracovala např. Standfordská univerzita[1] a mnoho dalších světových i českých institucí.

Tým v nočním procesu

Obsah práce, fáze

1. PROJECT SET-UP

  • Volba zpravodajských serverů, které budeme analyzovat

2. DATA PROCESSING

  • Stahování dat (F12, SelectorGadget, Python)
  • Konverze dat, čištění a strukturování dat (Python, Excel)

3. DATA ANALYSIS

  • Výpočty a analýza (Python, Excel)

4. KEY FINDINGS

  • Vizualizace dat a výsledky analýzy (Python, PowerBI)

5. SUMMARY

  • Přínos projektu
  • Co dál aneb kurzem náš projekt teprve začíná!
Schéma dolování dat

1. PROJECT SET-UP

Volba zpravodajských serverů pro analýzu

Úvodní představu jsme hned v úvodu redukovaly. Původně jsme chtěly analyzovat 10 zpravodajských serverů včetně diskusí pod články. Vzhledem k objemu textových dat, která v určité fázi musí datový analytik procházet ručně a připravit pro další strojové zpracování (viz vytváření slovníku v další kapitole), nám náš mentor projekt doporučil zúžit.

Tedy, výsledný počet serverů jsme snížily na 5 a vynechaly analýzu diskusí.

V našem projektu se zaměřujeme na články těchto 5 zpravodajských serverů: Idnes.cz, Ihned.cz, Novinky.cz, Aktualne.cz a Parlamentnilisty.cz. A jmenovitě na těchto 9 prezidentských kandidátů: M. Zeman, J.Drahoš, M. Horáček, M.Topolánek, P.Fisher, P. Hannig, V. Kulhánek, J. Hynek. M. Hilšer.

A pro zajímavost budeme analyzovat zvlášť titulky a celkový obsah článků.

Analyzované zpravodajské servery

Opora výběru médií a sledované období

U výběru prvních čtyř médií jsme se opíraly o výzkumy čtenosti (viz OLA projekt NetMonitoru). Idnes.cz, Ihned.cz, Novinky.cz, Aktualne.cz se objevují v první desítce nejčtenějších zpravodajských i-deníků. Parlamentní listy jsme zařadily jako zástupce českých fake-news/dezinformačních webů, kterým, roste faktický vliv na věřejné mínění (PL jako dezinformační web vede na seznamu české Ministerstvo vnitra). Považovaly jsme tedy za přínosné analyzovat komunikační strategii i tohoto zpravodajského webu.

Sledované období, ve kterém nás budou zajímat články, jsme si stanovily na období 24.11.2017–27.1.2018 tj. ode dne potvrzení kandidátů MVČR až po druhý volební den 2. kola.

2. DATA PROCESSING

Stahování dat (HTML, Python)

V této fázi jsme musely nejprve pochopit strukturu zápisu v HTML jazyce, abychom mohly správně napsat skript v Pythonu, který následně vytáhne potřebná data. Nastudovaly jsme tutoriály a prohlížely si články pomocí inspektora struktury stránky, funkce F12. Pokládaly jsme si otázku, jak vymezit pro stahování jen relevantní články vztahující se k prezidentským volbám. Podařilo se nám objevit, že klíčovým vodítkem je tag meta keywords –v klíčových slovech je tu definován obsah článku a vždy označena jména lidí dotčených v článku. Tento tag mají v kódu téměř všechny servery (s výjimkou PL), hurá — pokud se zde jméno některého z kandidátů objevuje, je pro naše účely článek relevantní. U Parlamentních listů nám Petr poradil fígle a pomohl přepsat skript, univerzální mustr zde nešel použít.

Důležité: Logicky se nám do souboru dat dostanou i články s vazbou na prezidenta Zemana ve výkonu své funkce (zejména mediálně exponované sestavování vlády). Tyto články ovšem zahrnujeme záměrně, neboť se domníváme, že jakákoli medializace pana Zemana měla vliv na veřejné mínění (a subjektivně se domníváme, že veškeré kroky, které činil, činil i s vědomím polického boje o křeslo prezidenta).

Vývojový nástroj F12

Pro pozdější analýzu jsme potřebovaly z článků do souborů vytáhnout údaje: titulek, obsah, datum, název serveru a keywords. Každý provozovatel stránek má ale jinou strukturu stránky. K určení oblastí v HTML jazyce jsme využily nástroj SelectorGadget, který pro každou oblast vypíše tag a umístění v HTML.

Později jsme došli k tomu, že jsme si měly postahovat i URL adresu každého článku, abychom měly i konkrétní vazbu.

SelectorGadget

Skript pro stahování

V této fázi jsme se docela se potrápily. Rozhodly jsme se využít Python a jeho nejčastěji uváděnou webscrapingovou knihovnu Beautiful Soup (bs4). Každá jsme se po vlastní ose pomocí tutoriálu a dokumentací snažila napsat skript, který by nám naše požadovaná data ze serverů stáhl. Narazily jsme však na to, že při zápisu nelze jednoduše stáhnout více než jeden článek (urllib.request). To se zdálo být velmi pracné a pro náš objem dat nepraktické. Nakonec nám mentor doporučil webového pavouka Scrapy. Výhodou Scrapyho na rozdíl od BS je, že stačí popsat sadu pravidel pro stahování, transformaci a export dat bez opakovaného zadávání requestů. S pomocí mentora jsme si upravily náš kód a pak již pro spidera jednotlivého serveru definovaly jen strukturu, z niž chceme obsah stahovat.

Zatímco u Ihned a Idnes se nám vyhledávaly sekce/tagy dobře, Parlamentní listy jsou napsány nepřehledně, Novinky nás všechny potrápily svou ochranou proti robotům.

Jaký to byl pak zasloužený pocit extáze po mnoha hodinách práce, když jsme uzřely v černobílém prostředí příkazové řádky výjezdy článků. Data se nám mezi tím průběžně ukládala do souborů ve formátu json.

Celkem jsme stáhly 1010 článků (souborů json).

Kód spideru pro ihned.cz zobrazený v Jupyter notebooku
Výjezd dat v příkazové řádce

Konverze, strukturování a čištění dat

Slovník

Pokud chceme analyzovat sentiment slov v článcích, musely jsme si vytvořit z našich konkrétních dat slovník s přiřazenou hodnotou sentimentu. Nejprve jsme si musely data ze souborů json transformovat do csv. souboru. Pro tvorbu slovníku budeme brát pouze slova z titulků[title] (přesnější slovník z obsahu článků bychom do deadlinu nestačily zpracovat). Ke konverzi souboru jsme použily Python:

import json

import glob

with open(‘vysledek.csv’, ‘w’) as vysledny_soubor:

for nazev_souboru in glob.glob(‘*.json’):

with open(nazev_souboru) as zdrojovy_soubor:

zdrojovy_slovnik = json.load(zdrojovy_soubor)

vysledny_soubor.write(‘“{}”;”{}”;”{}”.format(zdrojovy_slovnik[‘server’], zdrojovy_slovnik[‘title’], zdrojovy_slovnik[‘keywords’]))

Vygenerované .csv, jsme poté dále zpracovávaly v Excelu. Potřebovaly jsme ale ve finále mít připravený řádkový seznam relevantních slov pro ocenění hodnotou sentimentu = slovník. Proto jsme musely data řádků převést do sloupců Data > Text do sloupců (zde si vybraly jen oblast textu titulku k převedení), sloučit všechny sloupce do jednoho. Pomocí funkce DÉLKA jsme zjistily délku textového řetězce a jednoduše jsme pak odmazaly slova s délkou <=3. Ve výsledku nám seznam tvořil 5724 slov, které bylo třeba „ocenit“ hodnotou Sentimentu — to jsme prováděly ručně.

K určení Sentimentu jsme si vytvořily 5-ti bodovou škálu od -2 do 2. Pro přesnost v ocenění jsme naše úvahy dvojitě porovnávaly s již vytvořeným slovníkem Czech Subjectivity Lexikon (Kateřina Veselovská MFF UK). Slova, které mohou nabývat jak pozitivní, tak i negativní hodnoty, dle kontextu věty, jsme označily písmenem N; a jejich hodnotu pak dopočítaly dle sentiment hodnoty celého větného řetězce +1/-1.

Takto nám vznikl výsledný autentický slovník subjektivně zabarvených slov z našich sledovaných článků. Ten jsme se vzhledem k času a neexistenci komplexnějšího českého slovníku rozhodly aplikovat i na obsah článků, byť jsme si vědomy, že mnoho slov nám takto proklouzlo bez hodnoty sentimentu (dostaly hodnotu 0).

Transformace dat — příprava slovníku

Stemmer

Abychom mohly sentiment slov v Pythnu počítat, je potřeba mít limitní množství různých tvarů slov, a taky, aby se ze slov mohly dělat např. frekvenční analýzy. V češtině je ale vlivem skloňování, časování a přechylování obrovské množství variant jednoho slova.

Čištění slov do jejich základní podoby se říká stemming. Nebylo by v našich silách stemmer napsat během DA, proto jsme hledaly již připravený skript. Použily jsme jeden z minima vůbec dostupných stemmerů pro češtinu, který nám přišel alespoň trochu obsáhlejší. (Stemmer našel až náš mentor Petr.) Tento stemmer nám slova z obsahu článků ořezal do více „slučovatelné“ podoby a tím byla data připravena a mohly jsme začít s analýzou a vizualizací.

V Excelu jsme pro vizualizaci textu použily jen citově zabarvená slova v hodnotách -1, 1, 2, -2. Sloučení do jednoho tvaru na základu kořenu slova jsme udělaly na počtu cca 2000 slov, ručně.

3. DATA ANALYSIS

Analýza titulků článků v Excelu

Pro analýzu titulku jsme si musely nejprve v Excelu vytvořit tabulku, ze které by byla jasná provázanost mezi: serverem — textem titulku — hodnotou sentimentu slov — jménem prezidentského kandidáta. Abychom tyto vazby mohly vytvořit, musely jsme data dále strukturovat. Pro to jsme využily několik funkcí, nejčastěji:

VYHLEDAT,SVYHLEDAT

KDYŽ(JE.CHYBHODN();;)

SUMA, SUMIF, SUMIFS

COUNT, COUNT IF, COUNTIFS, COUNTBLANK

NEBO

Podmíněné formátování atd.

Příklad syntaxe vzorců:

=32-COUNTBLANK(D614:AI614) =KDYŽ(JE.CHYBHODN(SVYHLEDAT(M214;xxxxx!$A:$C;3;));0;SVYHLEDAT(M214;xxxxx!$A:$C;3;)) =KDYŽ(BQ626=0;BQ626;KDYŽ(BS626>0;SUMA(BQ626;KDYŽ(BQ626<1;-1;1));BQ626)) =COUNTIFS(BU$2:BU$1011;-1;$C$2:$C$1011;$AJ1033)+COUNTIFS(BU$2:BU$1011;-2;$C$2:$C$1011;$AJ1033)+COUNTIFS(BU$2:BU$1011;-3;$C$2:$C$1011;$AJ1033)+COUNTIFS(BU$2:BU$1011;-4;$C$2:$C$1011;$AJ1033)+COUNTIFS(BU$2:BU$1011;-5;$C$2:$C$1011;$AJ1033)+COUNTIFS(BU$2:BU$1011;-6;$C$2:$C$1011;$AJ1033)+COUNTIFS(BU$2:BU$1011;-7;$C$2:$C$1011;$AJ1033)+COUNTIFS(BU$2:BU$1011;-8;$C$2:$C$1011;$AJ1033)

Výsledná tabulka, ze které jsme si poskládaly vstup do PowerBI vypadá ve stránkovém zobrazení takto:

Excelová tabulka — komplet matrix

Analýza obsahu článků v Pythonu

Pomocí skriptu jsme stemmerem ořezaly slovník i slova v článcích a vyhodily předložky a spojky. Každý článek s takto očištěnými texty jsme znovu exportovaly do formátu json. Následně se očištěná data „projela“ slovníkem a byla jim přiřazena hodnota sentimentu.

Stemming— výřez skriptu

4. KEY FINDINGS

Vizualizace a výsledky analýzy

Pro vizualizaci analýzy titulku z Excelu, jsme použily PowerBI. Obsah článků jsme vizualizovaly v Pythonu s použitím knihoven Bokeh a Wordcloud — Matplotlib.

Tabulky jsme si pro práci v PBI musely ještě upravit a vytvořit si i vlastní metriky.

Relationship struktura provázanosti tabulek v PBI
Pomocná tabulka kategorií sentimentu v PBI

GRAFY

ANALÝZA TITULKŮ

Graf 1 (PBI): Interaktivní Dashbord, který zobrazuje poměr četnosti článků mezi různými servery ve sledovaném období. Vrchní řádkový graf pak zobrazuje celkovou míru sentimentu 1010 titulků článků. Dashboard lze též vyfiltrovat na jednotlivého kandidáta/médium.

V počtu článků dominují Parlamentní listy, nárůst komunikace o prezidentských kandidátech se výrazně zvýšil po prvním kole volby. Naopak Idnes o tématu prezidentských voleb psalo, oproti ostatním, jen minimálně. Média mají tendenci komunikovat spíše negativně, celková míra sentimentu v titulcích dosáhla hodnoty -0,8.

Graf 2 (PBI): Zobrazuje zastoupení zmínek o každém kandidátovi per jednotlivý server v celém sledovaném období (sloupcový graf), kruhový graf zobrazuje denní četnost článků o kandidátech, a poměr prezence jednotlivých kandidátů v klíčových slovech daných článků.

Z kruhového grafu je vidět, že největší medializaci měl jednoznačně Miloš Zeman, a to napříč všemi sledovanými servery. Druhým nejčastěji medializovaným kandidátem byl Jiří Drahoš. Stabilní, byť menší, prezenci měl také Mirek Topolánek. Ostatní kandidáti měli mediální prostor v těchto serverech minimální. Z grafu je i patrné, že nejvíc „ukecaným“ serverem jsou Parlamentní listy, které v průměru 13x denně otiskly článek se zmínkou o některém z kandidátů, což je až 3x častěji než u, druhých v pořadí, Novinek.

Graf 3 (PBI): Polaritní graf ukazuje v jakém sentimentu se nesly titulky článků, které psaly o jednotlivých kandidátech. Sloupcový žlutý graf pak ukazuje celkové skóre sentimentu per kandidát — neboli jaká byla emocionalita titulku článku, ve kterém se objevilo (i) jméno daného kandidáta v klíčových slovech.

Opět vedou Parlamentní listy s nejvíce negativně zabarvenými titulky, naopak Aktuálně zejména u Hynka, Hlišera a Topolánka má tendence psát v pozitivním duchu. Zajímavé je pozitivní spojení Pavel Fisher a Ihned, byť je nutno říci, že count článků byl nižší. Celkové skóre sentimentu ukazuje, že nejvíce neutrální skóre sentimentu v titulcích měl Marek Hilšer a Petr Hannig. Naopak Zeman, Topolánek, Drahoš a Horáček byli často medializováni spíše pod hlavičkou negativně zabarveného titulku článku.

Graf 4 (PBI): Wodclouds (count) nejčastějších slov obsažených v titulcích per server. Včetně celkové známky sentimentu. Zahrnuty pouze slova s četností >3.

Graf 5 (PBI): Graf ukazuje na úroveň sentimentu rozdělenou do 5 kategorií (fuj, negativní, neutrální, pozitivní a top pozitivní), dlaždicový grafu ukazuje na poměr pozitivní vs. negativní strategie komunikace; sloupcový graf zobrazuje hodnoty dvě: jednak sentiment ve spojení s kandidátem a míru medializace kandidátů.

Je vidět, že s výjimkou ihned.cz a novinky.cz, které mají poměrně vyrovnaný poměr negativních a pozitivních slov, většina ostatních serverů sází spíše na přitáhnutí pozornosti negativní — až šokující cestou. Novinky.cz navíc, alespoň trochu, daly mediální prostor všem kandidátům.

ANALÝZA TITULKŮ+OBSAHU

Graf 6 (Py): Graf ukazuje, v jakém sentimentu se nesly články pro každého kandidáta v daných zpravodajských serverech.

Miloš Zeman dostal jednoznačně nejvyšší mediální prostor ve všech sledovaných médiích, zároveň byl sentiment článků, kde se o něm psalo, vždy spíše pozitivní. Nejvýraznější „přátelství“ je pak vidět ve vazbě na Parlamentní listy. Parlamentní listy, Ihned a Novinky měly tendence psát články pozitivněji zabarveným sentimentem častěji i u Jiřího Drahoše.

Graf 7 (Py): Graf ukazuje count článků na jednotlivých serverech pro jednotlivé kandidáty.

Ukazuje se silná vazba Zeman — Parlamentní listy, více jak 350 článků v období 63 dnů. Je velkým překvapením, jak dramatický je rozdíl v medializaci Zeman vs. zbytek. Potvrzuje se, že kampaní pro něj již byl výkon samotné prezidentské funkce v jejíž souvislosti byl zmiňován (exponované sestavování vlády).

..Mohly bychom také z těchto dat vyvodit, že napříč danými médii existuje menší ochota systematicky se prezidentskou volbou zaobírat..:)

Graf 8 (Py): Wordclouds nejčastějších slov z 1010 článků, pohled per zpravodajský server.

M. Zeman dominuje počtem zmínek jména naprosto ve všech i-denících. Z dalších kandidátů měl výraznější mediální prezenci pouze J. Drahoš v ihned.cz.

5. SUMMARY

Postřehy:

❖ Je patrné, že média volí strategii zaujmout spíše negativními emocemi.

❖ Ukazuje se, že negativní titulek nemusí znamenat i negativní obsah. Například u M. Zemana jsme tento rozdíl sledovaly.

❖ Parlamentní listy volí strategii „šokovat“, v titulcích pracují s přímou řečí velmi expresivně zabarvenou v dlouhých větách.

❖ Miloš Zeman měl absolutně největší mediální prezenci, tak velký nepoměr jsme nepředpokládaly.

❖ Ostatní kandidáti, lze říci, nedostali žádnou výraznější šanci být čtenářům na očích.

❖ Idnes.cz v roli „ticho po pěšině“, výrazně menší počet článků na téma prezidentské kampaně celkově, ale také v podílu článků Zeman:Drahoš 4:1.

❖ Nejvyváženější jsou - co do sentimentu a prezentace i jiného kandidáta -novinky.cz a ihned.cz

❖ Nevyplácí se sázet na útočnou negativně zabarvenou rétoriku, kterou mnoho prezidentských kandidátů vedlo proti Zemanovi — v zásadě mu totiž dělali dobrou reklamu > Zemanovi se tím navýšil počet článků a některá média výrok využila k negativnímu hodnocení autora výroku.

❖ Česká média nevolí strukturovanou a vyváženou strategii v prezentaci tématu prezidentské volby, což dokazují propastné rozdíly v medializaci ostatních prezidentských kandidátů.

Co nás čeká dál aneb kurzem náš projekt teprve začíná!

Co jsme jako tým nestihli, chceme dodělat. Dobře se nám spolu pracuje, takže budeme Radka, Hanka i Petr rozvíjet projekt dál. Cílem je disponovat s Case study pro textovou analytiku, na které si vyzkoušíme další analytické postupy.

Velmi klíčové: Je zřejmé, že bez pořádného slovníku a stemmeru je analýza textu v češtině hodně složitá, a tím i nepřesná. Uvažujeme, že bychom k situaci mohli přispět a vhodný nástroj vytvořit.

Konkrétně chceme naši práci doplnit o:

✓ Analýzu všech zpravodajských webů v první desítce čtenosti

✓ Sledovat i časové hledisko, tj. do jaké míry se vyvíjí rétorika/sentiment v průběhu kampaně

✓ Rozšířit analýzu na bigramy/trigramy

✓ Vytvořit si vlastní web a naučit se HTML jazyk

✓ Naučit se analyzovat obrázky

Naším velkým cílem v delším horizontu je:

✓ Zdokonalit stemmer pro češtinu (odvážit se zapojit machine learning)

✓ Vytvořit co nejširší slovník citově zabarvených slov v ČR

…a proč si myslíme, že to má smysl?

Webová textová analytika je přínosná jako nástroj pro potřeby marketingu. Díky ní lze dokreslit obraz toho, jak např. spotřebitelé smýšlejí, co jsou jejich hodnoty, jaké „frčí“ trendy, jak vnímají značky a produkty (soc. sítě). Sentiment médií zase může odhalit, jaké strategie média uplatňují v období voleb, zda jsou objektivní či referují v zájmu určitých politických názorů.

Náš projekt bychom jako kompletní case study v plné podobě rádi nabídli vybraným politickým subjektům, médiím, či firmám, pro které je textová analýza atraktivní.

Poděkování:

Díky Petrovi Kotasovi za jeho znalosti a přiloženou ruku k dílu a chválu, kterou nás v pozdních večerních hodinách povzbuzoval.

Radka:

Muži a mámě za to, že tři měsíce vzali hodně na sebe a já se mohla věnovat projektu.

3 letému Radečkovi, že to zvládnul a počítač mi polil vodou jen jednou, a že tu odtrženou klávesnici pak statečně osobně vrátil.

Hanka:

Mému muži, mamce a dětem, že se mnou měli trpělivost :)

Díky všem, kteří mi v průběhu DA dělali taxikáře, poté co jsem si zlomila ruku :)

…a holkám i klukům z Czechitas za bezva vzdělávací projekty — nevidíme se naposledy!

--

--