Když jsem se v lednu rozhodovala, o čem budu psát svůj závěrečný projekt digitální akademie Czechitas, analýza textu scénáře seriálu Game of Thrones pro mě byla jasnou volbou. No, nevím, jak vy, které jste si DA prošly, ale já jsem postupně své téma asi 5x změnila, vždy ve víře, že na to, co jsem si vymyslela, seženu data. Jenže ono to tak vůbec nebylo — když už byly nějaká data k dispozici, postrádaly některé údaje, které jsem sháněla, nebo naopak firmy nebyly vůbec ochotné data poskytnout. Když selhalo i téma od mentora a do odevzdání projektu zbývalo 16 dní, začala úroveň mého stresu šplhat až do nebeských výšin.
Spojila jsem se tedy s Michalem Šimonem, který naštěstí souhlasil, že mi s projektem do začátku pomůže. Společně jsme se pustili do psaní kódu v Pythonu (za což jsem byla opravdu ráda, protože mě Python na hodinách hodně bavil). Nejklasičtější klávesovou zkratkou Ctrl+C a Ctrl+V jsem si do textového souboru zkopírovala text první epizody a začali jsme se společně dívat na to, jak text rozdělit.
Tím, že byly jména postav v kapitálkách a text byl oddělen dvojtečkou, poradil mi Michal, abych pro oddělení postavy a textu použila regulárních výrazů (regular expressions). Společně jsme si pak otevřeli Online regex tester a debugger, abych si vyzkoušela, jak tato metoda funguje a rovnou viděla, které části textu budou vybírány.
Nakonec jsme došli k tomuto kódu, který nám pomohl oddělit text od postavy, níže je vidět, které části jsou obsaženy v jednotlivých částech regulárního výrazu.:
(?P
Tento kód měl před dvojtečkou brát vše jako jméno s tím, že jméno může obsahovat velká písmena, mezery a číslice (protože se nám tam objevily i případy „MAN 1“, „NIGHTS WATCH BROTTHER 2“ a další.
Hned u druhé epizody jsme ale narazili na problém — postavy nebyly napsány v kapitálkách. Proto jsme výraz upravili tak, aby bral v úvahu i malá písmena.
(?P
Když jsme si už zjistili, co vlastně budeme z textu vybírat, mohli jsme se pustit do psaní samostatného skriptu. Nejdřív jsme si samozřejmě museli nadefinovat funkce pro získání souborů epizod a jejich přečtení. Tyto funkce jsme nadefinovali v samostatném skriptu s tím, že jsme je pak jednotlivě importovali.
Už když jsme začínali se psaním skriptu, upozornil mě Michal na to, že analýza jako taková bude relativně jednoduchá, ale že se mám připravit na to, že strávím spoustu času s editací textu. No a asi Vás nepřekvapí, že měl naprostou pravdu. V GoT mají 7 bohů a 7 pekel, a já jsem si několika z nich při získávání a čištění dat prošla. Každá epizoda byla napsána trošku jinak — ať už šlo o upper nebo lower case, popisky scén, které jsme chtěli přeskočit nebo o to, že postavy byly často nazývány různými jmény.
Perfektním příkladem byla Daenerys Targaryen — postava, která používá v celé sáze nejvíce titulů vůbec, měla asi 5 nejčastějších aliasů — Daenerys, Daenerys Targaryen, Daenerys Stormborn, Dany, Khaleesi. No a pak tady taky byly překlepy (taky si mohl G. R. R. Martin vymyslet trošku snazší jména, že ano?) — a tak jsem se setkala s Danerys, Daerenys a jinými.
Ale ani to všechno nebylo nic proti tomu, co mě čekalo až v tom pomyslném sedmém pekle. Tím myslím zjištění, že asi k 27 epizodám chybí scénáře — respektive byly k dispozici titulky, kde ale nebylo uvedeno, která osoba mluví. Ať jsem hledala, jak jsem jen mohla, nejlepší varianta, kterou jsem objevila, vypadala takto:
Samozřejmě, že jsem si řekla, že se s tímto textem nespokojím, a tak začal můj sledovací maraton hry o trůny, kdy jsem texty v podobě výše upravovala do podoby, kterou jsem chtěla. To znamená, že jsem si všech 27 epizod musela přehrát a ke každému řádku doplnit jméno, případně věty pospojovat mezerou a ne novým řádkem, pokud šlo o souvislý text (jeden výstup v rámci dialogu), nebo dokonce řádky rozdělovat, protože se někdy stalo, že na jednom řádku byly texty více postav. Tato část mi zabrala asi 45 hodin čistého času — naštěstí mi to ale velmi usnadnilo plánování volného času (protože jsem prakticky žádný neměla).
Kromě mých “základních” dat jsem se rozhodla, že si přidám ještě trošku jiná data, a tak jsem si vytvořila tabulku, kde jsem měla uvedené označení epizody a informace, kdo ji režíroval / napsal a jaké je jeho/její pohlaví (říkala jsem si, že zkusím vyvrátit stereotyp, že jsou ženy nejukecanější — k tomu se ale dostaneme až později).
Jedno se rozhodně nedá Michalovi upřít — a tím je to, že má opravdový zájem o to, aby holky zvládaly (nebo se o aspoň pokoušely) psát práci samy. Společně jsme ze startu strávili cca 6 hodin na tom, abychom nadefinovali v pythonu načtení a přečtení souboru, nastavit rozdělení textu na slovník, kde klíčem byla postava (name/character) a hodnotou byl text, který říka (speech). Musím říct, že jestli jsem si na tomhle projektu něco procvičila, tak to byla práce se seznamy, slovníky a cykly.
Výsledkem bylo .csv, ve kterém bylo uvedeno jméno postavy, text, který říká a informace o tom, kolik výstupů v dané epizodě daná postava měla.
Pak jsem si říkala, že by kromě počtu výstupů nebyla špatná informace, kolik slov daná postava říká (jestli se může např. někdy stát, že má jedna postava 3 výstupy, ale řekne během nich to, co jiná za 10). Postupně jsem tedy očistila text a rozdělila pomocí splitu jednotlivá slova.
Při přípravě tohoto kódu jsem se musela zamyslet nad tím, jak budu řešit klasická anglická spojení typu “don’t”, “won’t”, “he’s” a jiné. Bude se to počítat jako jedno nebo dvě slova? Vzhledem k tomu, že v tomto případě jde o sdružení dvou slov “do not”, “willl not” nebo “is not”, rozhodla jsem se, že to budu počítat jako dvě samostatná slova. Byla zde sice i možnost přivlastňovacího “ ‘s ”, ale tyto případy byly spíše ojedinělé v porovnání s předchozím.
Níže je vidět výstup z csv (otevřeno v excelu), kde ve sloupci 1 je název postavy, ve sloupci 2 je počet výstupů, ve sloupci 3 je počet slov a ve sloupci 4 je pak samotný text. Pro každý textový soubor se scénářem epizody vznikl samostatný soubor se základními informacemi o postavách, které v daném díle vystupovaly a alespoň jednou promluvily.
Pak jsme se mohli podívat na další část projektu, a to počítání sentimentu. Nejdříve jsem vytvořila slovník AFINN111 , ze zdroje, který je veřejně dostupný a obsahuje cca 2500 nejběžnějších anglických slov a spojení, které mají citové zabarvení.
Slova jsou hodnocena na škále <-5,+5>, podle toho, jak jsou pozitivní či negativní, a v souboru jsou od hodnot odděleny tabulátorem, proto je zvolen .split(‘ ’).
Do analýzy sentimentu jsem se pustila s tím, že jsem doufala, že naprostá většina negativních postav bude mít navzdory svým činům pozitivní slovník, protože jde přece jen o seriál plný intrik, pastí, podrazů a vrážení kudel do zad.
Opět jsem hodně pracovala s cykly. Nejdřív jsme pro každé slovo, které bylo ve slovníku sentimentu, hledali, jestli je použito v textu postavy. Pokud bylo, zvýšilo (případně snížilo) se skóre sentimentu dané postavy a zároveň se přičetla 1 k celkovému počtu citově zabarvených slov. Na konci cyklu se pro postavu spočítala průměrná hodnota sentimentu, a to klasickým průměrovým vzorcem = celkové skóre sentimentu děleno počtem citově zabarvených slov na postavu. Tento cyklus samozřejmě nebyl úsporný v tom, že pro každé slovo se nejdříve musel projet celý slovník. Ale nebojte, to jsem později napravila.
Níže je vidět, jak vypadal výstup z csv souboru. Byl uveden pouze název postavy a průměrná hodnota sentimentu. Samozřejmě, že jsem později zjistila, že mi to vůbec nestačí, ale v tuto chvíli jsem byla hlavně ráda, že to všechno funguje.