Mirka Spáčilová je už léta známá mezi filmovým publikem jako přísná a nesmlouvavá kritička. Říká se mezi lidmi, že prý nejčastěji hodnotí film na 60 %.
Během loňského roku o ní Michal Bláha publikoval hezký příspěvek na svém blogu. Upřímně řečeno to byl spíše příspěvek o webové službě Apify, která umí web scraping. Tehdy se mi to hrozně líbilo a říkal jsem si, že se příležitostně na Apify podívám a pohraju si s tím, ať se naučím nějakou novou hračku.
Řeka života ale nakonec tekla jinudy a k Apify jsem se zatím nedostal. Nicméně se nyní poslední měsíce intenzivně zabývám R, statistikou, zpracováním dat a strojovým učením. (Jsem ale pořád ještě salát, bažant, bulík, prostě totální začátečník.)
Úplně se mi během volnějšího odpoledne vynořily vzpomínky na Michala Bláhu a jeho analýzu filmových hodnocení od Mirky Spáčilové. Tak mě napadlo, co když to půjde i jinak? A heleďte, ono to eRko ten web scraping umí taky docela snadno! Skript jsem vymyslel během půlhodinky a běh programu se počítá na slabou půlminutku. Nejvíce času mi teda asi zabere tenhle blogový příspěvek. :-)
Tak pojďme na to.
Mám hrozné štěstí, že Mirka Spáčilová má na zpravodajském webu svoji vlastní sekci. Tím se nám zjednodušuje načítání filmových kritik. Co je ještě lepší? Že už výpis kritik obsahuje názvy filmů a procenta hodnocení. Takže nemusím načítat každou kritiku zvlášť a můžu projít jen stránkovací výpis.
Nejprve si v R načtu potřebné balíčky a vytvořím proměnné.
# load packages library(tidyverse) # data cleaning library(rvest) # web crawler # set basic variables max.pages <- 42 # number of pages filmnames <- NULL # vector of film names filmratings <- NULL # vector of film ratings filmurl <- NULL # vector of film reviews urls
Teď projedu všechny stránky na serveru a získám názvy filmů, hodnocení a URL kritiky. Tohle by se dalo uzavřít do nějaké hezké funkce – a to narůstání vektorů taky není ukázka hezkého kódu. Ale na piplání udržitelného kódu mám jiné projekty, tohle jsem napsal jen tak, jak mi zobák roste. Přesto se za to omlouvám. :-)
Pro získání dat z webové stránky použiju balíček rvest od Hadleyho Wickhama. Poskytuje jednak funkci read_html()
, která načte HTML stránku, a jednak i další funkce, které získají žádaný uzel ( html_nodes()
, koukněte na to – adresování funguje skoro jako CSS třídy a identifikátory) a text daného uzlu ( html_text()
). URL kritiky pak získám pomocí funkce html_attr()
, která vydoluje odkaz z atributu href
značky <a>
.
Stránky na daném zpravodajském webu mají pěkné URL se stránkovacím parametrem, takže to můžu projet obyčejným cyklem od 1 do 42 (což je aktuální počet stránek s recenzemi filmů).
Když prozkoumám HTML kód webu, tak mi stačí zjistit kýžené uzly a formát textu v nich uvedeného. Pak si ten text upravím nějakými regulárními výrazy, ať mám čistý název filmu a jeho hodnocení zvlášť.
Kód cyklu je tento:
# go to web and get all 42 pages with links to reviews for(i in 1:max.pages) { # get every page page <- paste("https://kultura.zpravy.idnes.cz/recenze-mirky-spacilove.aspx?strana=", i, sep="") page.html <- read_html(page) # film names # ......... find names of films tmp.filmnames <- page.html %>% html_nodes(".rec-box") %>% html_text(trim = TRUE) # ......... delete rating from the film name tmp.filmnames <- gsub("[[:digit:]]{1,3}[[:blank:]]%[[:blank:]]", "", tmp.filmnames) # film ratings # ......... find film ratings tmp.filmratings <- page.html %>% html_nodes(".rating") %>% html_text(trim = TRUE) # ......... and make them numeric tmp.filmratings <- gsub("[[:blank:]]%", "", tmp.filmratings) %>% as.numeric() # film reviews url tmp.filmurl <- page.html %>% html_nodes(".art>a") %>% html_attr("href") # save the results filmnames <- c(filmnames, tmp.filmnames) filmratings <- c(filmratings, tmp.filmratings) filmurl <- c(filmurl, tmp.filmurl) # print some info print(paste("Page ready:", i)) }
Teď už stačí jen uložit proměnné, vygenerovat graf a uložit výstup do CSV souboru na pozdější použití:
# make data frame reviews <- data.frame(film = filmnames, rating = filmratings, url = filmurl) # create basic histogram hist(reviews$rating, main = "Jak hodnotí Mirka Spáčilová", xlab = "Hodnocení filmu (v %)", ylab = "Četnost", labels = TRUE) # write CSV write.csv(reviews, "reviews.csv", row.names = FALSE, fileEncoding = "UTF-8")
A je to! Po spuštění to nějakých třicet vteřin chroustá a nakonec to vyplivne graf a CSV soubor.
Mirka Spáčilová fakt nejčastěji dává hodnocení 60%, aktuálně 330krát. A nikdy žádnému filmu nedala víc než 90 %. Celá polovina jejích hodnocení se pohybuje mezi 50 a 65 procenty.
Pokud jde o celkový počet různých hodnocení, vypíšeme si tabulku. V prvním řádku je hodnocení v procentech, ve spodním řáku je počet takto udělených hodnocení.
> table(reviews$rating) 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 1 2 9 5 11 13 37 26 105 42 268 147 330 163 210 56 62 4 2
Pro milovníky obrazových vjemů přikládám kompletní graf hodnocení. Z něj jde vidět, že kritička spíše uděluje celé desítky procent než jejich „poloviny“ (35, 45, 55, apod.).
A ještě tedy histogram (je to fakt histogram, takže některé kategorie jsou sloučeny do společných sloupců):
Podobně můžu zjistit i minimum, medián, průměr, maximum a první a třetí kvartil:
> summary(reviews$rating) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.00 50.00 60.00 56.99 65.00 90.00
A takhle si s tím můžu hrát i dál, než dojdu až k úplnému poznání tohoto světa. Mimochodem, všimli jste si, že počet stránek s recenzemi je aktuálně shodný s odpovědí na otázku Života, Vesmíru a vůbec?
Pokud máte zájem o CSV s výstupem, stahujte z paste.sh.
Určitě by se dalo takto získaný dataset ještě rozšířit o informace přímo z recenzí. Případně propojit s databází ČSFD, vytvořit sparse matrix s herci a pomocí strojového učení vyrobit algoritmus, který by jednou dokázal filmy zhodnotit stejně jako dnes Mirka Spáčilová. A tak dále…
Na závěr bych ještě rád podotkl, že se zde zmíněnými lidmi nemám co dočinění, neznám se s nimi, recenze filmů nečtu a na uvedený zpravodajský server v podstatě nechodím. Ale je to pěkné hřiště pro hrátky s daty. :-)
Aktualizace 2018–08–14 v 15:40: Přidal jsem sekci zajímavých odkazů na konec článku.
Aktualizace 2018–08–17 v 12:20: Přidal jsem graf hodnocení na základě zpětné vazby z komentářů.
No, nevím. Dříve jsem to také dělal, že jsem bral filmy Spáčilovou vychválené za špatné a naopak. Nejde to tak praktikovat, ukázalo se, že často se s jejím názorem shoduji. Ovšem se svými 60% mi připadá příliš hodná, nulou hodnotím mnohem více filmů, než ona :-)
Ono se toho spoustu nakecá, realita ale nebývá tak horká...
Zrovna u Spáčilové má výrazně nadpoloviční většina recenzí hlavu a patu a ani se nijak neliší trend bodů od jiných zdrojů.
Holt ale když tu a tam jde mimo trend, tak se rozmázne daleko více...
Take me Michaluv clanek zaujal a na jeho zaklade jsem udelal porovnani recenzi Mirky Spacilove s CSFD, IMDB a recenzemi Frantiska Fuky dostupne zde
@jakubbalada: Váš článek jsem také tehdy četl a je výborný. Hlavně parádní práce s mergem, namapováním a porovnáním recenzí navzájem - udělal jste z toho moc pěkný dataset. Díky :-)
Díky za pěkný příklad práce v R.
Vzhledem k tomu, že mám v okolí několik lidí, kteří se snaží přejít z R do Pythonu, nebo jen s Pythonem začínají, tak jsem si dovolil příklad téměř 1:1 přepsat: https://github.com/lynt-smitka/spacilova/blob/master/spacilova.ipynb
Osobně bych na to šel malinko jinak, spíše než spojování vektorů bych data zpracovával po "řádcích" a ve výsledném kódu by také měly být ošetřené případné chybové stavy při parsování.
Pokud by někdo chtěl napsat vylepšenou verzi, tak PR jsou vítána, jen bych zanechal ten originální přepis 1:1, aby bylo možné to porovnat s R. Fantazii se meze nekladou, pokud by to chtěl někdo třeba přepsat ještě v jiném jazyku ;-)
Do repozitáře jsem přidal "řádkovou" verzi s hledáním následující strany a dostal jsem PR se základní verzí v bashi s curlem na 5 řádek.
Taky děkuji za pěkné grafy a srovnání. Nicméně pro mě osobně jsou procenta irelevantní. Podstatnější, a proto, když vidím pod recenzí podepsanou MS, což je bohužel v "protekční" MF DNES vždy, tak recenzi nečtu.
Proč? Jedině MS dokáže napsat "recenzi" spoilerovsky. Ve třicáté minutě hrdina spadne z mostu .. a nakonec použije kulomet a zachrání hlavní hrdinku. Děkuji, nechci.
Mě docela překvapilo její poměrně jednostranné psaní o dění na FAMU.
Podobu histogramu považuji za nevhodnou. Nedá se z něj poznat, zda byla ta šedesátka zahrnuta do sloupečku vlevo nebo vpravo, když je tam předěl.
@P_V: Díky za zpětnou vazbu, přidal jsem do článku názornější barplot s kompletním přehledem hodnocení. :-)
Osobně moc nechápu tu posedlost sledováním nejnovějších filmů a čekáním na recenze.
Když se pář let počká, tak se mezitím na spoustu kravin zapomene, nebo si člověk názor udělá poměrně snadno na základě velké spousty recenzí na ČSFD (včetně klasického "Jsou výtky, které znamenají hold, a pochvaly, které jsou utrháním na cti.").
R ... to je ten nadmíru konzistentní jazyk kde CSV soubor se ukládá pomocí write.csv()
zatímco RDS soubor se ukládá pomocí saveRDS()
? A kde se na přiřazení do proměnné zcela unikátně používá <-
přestože celý zbytek světa se dokázal shodnnout na =
? A kde v článku použité proměnné page
a page.html
spolu nemají pranic společného přesto že to tak podle jinde obvyklých konvencí vypadá?
Ještě že máme Python + Numpy + SciPy + Pandas...
protože RDS soubory mají blíže k databázím než k textovým souborům rozděným na řádky? V pythonu máte také funkce pickle.dump, json.dump.
Co se týče kritiků, měli by si vzít k srdci recenzi Antona Ego v Rattatouille. Moc by mě zajímalo, jak by dopadl film natočený nějakým kritikem / recenzentem. V podstatě už čtu recenze jen od Franty Fuky a Tomáše Baldýnského, protože i když se (extrémně výjimečně) stane, že se můj názor s jejich rozchází, aspoň se u toho zasměju.
Přečteno 54 889×
Přečteno 43 011×
Přečteno 39 938×
Přečteno 34 738×
Přečteno 31 886×