Jak je to s tou Mirkou Spáčilovou a jejími 60 %

26. 10. 2018 8:35 (aktualizováno) Petr Kajzar

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.

Dolujeme data

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.

Jak to teda dopadlo?

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.).barplot

A ještě tedy histogram (je to fakt histogram, takže některé kategorie jsou sloučeny do společných sloupců):

histogram

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. :-)

Použitý software

Zajímavé odkazy

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ářů.

Sdílet