Google | Programování

Analyzovali jsme emoce ve vítězném oscarovém filmu Země nomádů pomocí Google Cloud

  • Tentokrát si vyzkoušíme Cloud Natural Language API od Googlu
  • Pomocí Apps Scriptu zjistíme emoce
  • Pomohou nám v tom anglické titulky z OpenSubtitles

...a Oskara za nejlepší film získává...

Včera jsme se dozvěděli, že podle americké Akademie filmového umění a věd je nejlepší snímkem roku 2020 film Země nomádů.

Existuje plno indikátorů, podle kterých by se dal odhadnout nejlepší film. Jedním z nich jsou bezpochyby emoce, které hrají ve filmu hlavní roli; jejich množství, rozložení či změna. Právě proto scénáristé využívají ty správné techniky tak, aby emoce zanechaly v divácích hluboký dojem i po skončení filmu.

 

Ivan Kutil

Autor článku působí jako CTO a Google Cloud Architect ve firmě AppSatori. Ve své práci předvádí, že technologie „umělé inteligence“ jsou snadno dostupné a dají se využívat i zábavným způsobem. Krásným příkladem je využití Google Cloud AI k hledání odpovědí v televizní soutěži Kalendárium.

Analýza titulků v cloudu

Demokratizace A.I. (či M.L. v tomto případě) vede k přístupnějším algoritmům, které dříve byly k dispozici hlavně pro vědecké výzkumníky nebo firmy s velkými rozpočty. I díky tomu je oblast zpracování přirozeného jazyka (Natural Language Processing) k dispozici téměř pro kohokoliv, kdo potřebuje analyzovat jazykovou syntaxi, identifikovat objekty v textu nebo právě k analýze emocí (sentimentu).

Klepněte pro větší obrázek
Cloud Natural Language API pro analýzu textů na serverech Googlu

Velké firmy jako Google, Microsoft či Amazon investují obrovské částky na vylepšení svých algoritmů, které pak poskytují ostatním formou služby zpravidla skrze aplikační rozhraní.

Díky API tak můžeme jednoduše analyzovat texty, a protože filmové titulky tuto funkci splňují, můžeme z nich v čase zjistit, jak se v průběhu filmu mění emoce. Dnes si to vyzkoušíme právě na vítězné Zemi nomádů a jejích komunitních anglických titulcích. 

Klepněte pro větší obrázek
Anglické titulky k Nomadland stažené na Google Drive

Nejdříve si proto uložíme anglické titulky ze serveru OpenSubtitles ve formátu .srt a nahrajeme je na Google Disk.

Google Cloud ovládneme z Disku 

V dalším kroku vytvoříme nový Google Apps Script, který je vhodný pro automatizaci a prototypování aplikací. Vývoj, spuštění a případné nasazení probíhá komplet ve webovém prohlížeči, takže si nemusíte nic instalovat.

Klepněte pro větší obrázek
Skript můžeme vytvořit jako nový dokument přímo na Disku, anebo jako na obrázku výše skrze jeho web script.google.com. I ten poté bude dostupný z úložiště Google Drive. 

Apps Scriptem sice vše zprovozníme, samotnou analýzu ale provede projekt na Google Cloud Platform, který slouží pro aktivaci a nastavení profesionálních cloudových služeb firmy. Výhodou Google Apps Scriptu je, že vám tento GCP projekt vytvoří automaticky spolu s Apps Scriptem.

Základ zdarma

V konzoli projektu aktivujeme Cloud Natural Language API, do kterého se budou posílat texty pro analýzu. Cena za využívání je nastavena za zpracovaný dokument s 1 000 textovými znaky v rámci jednoho API dotazu.

Měsíčně máte zdarma až 5 000 dotazů, respektive 5 000 dokumentů, a každý s 1 000 znaky. Poté se platí dle přiloženého ceníku. Takže po překročení bezplatného limitu budete platit 1 dolar za 1 000 dokumentů (každý s 1 000 znaky).

Klepněte pro větší obrázek
Jazykové API stačí dohledat a aktivovat v konzoli Google Cloud

Aktivaci API z konzole Google Cloudu provedeme v nabídce API & Services →  Library →  Cloud Natural Language API → Enable.

API vyžaduje aktivní platební účet pro případ, že byste překročili kvótu zdarma. Po založení nového účtu ale získáte kredit 300 dolarů po dobu 90 dní, což se hodí pro další a náročnější experimentování. Pokud chcete využívat cloudových služeb Googlu, ale nechcete vyplňovat údaje o své platební kartě, můžete se ozvat některému z českých partnerů (třeba AppSatori).

Ještě potřebujeme klíč k API

Ještě potřebujeme API klíč, který identifikuje náš projekt při volání jazykové analýzy. Získáte jej v nastavení projektu na Google Cloud v sekci API & Services → Credentials →  Create credentials →  API key.  V ostrém veřejném nasazení by bylo vhodné nastavit i nějaké bezpečné omezení (Application restrictions) jaké aplikace mohou volat API, aniž byste nepřečerpali kvótu (např. HTTP referrer).

Klepněte pro větší obrázek
Vygenerování klíče pro náš projekt 

Hodnotu API klíče konečně uložíme jako trvalou proměnou apiKey v našem Apps Scriptu a to v případě české lokalizace skrze hlavní menu Soubor → Vlastnosti projektu →  Vlastnosti skriptu. Odtud ji budeme načítat v kódu.

Klepněte pro větší obrázek
Nastavení trvalé proměnné pro projekt Apps Scriptu ve starém rozhraní editoru

Pozor, Google Apps Script používá od prosince 2020 staré a nové rozhraní editoru. V tom novém (k dubnu 2021) nelze editovat vlastnosti skriptu, a tak se musíte přepnout do staršího IDE přes tlačítko.

Tabulka Google jako databáze s výsledky

Textové titulky ve formátu srt nebudeme jazykovému API posílat přímo, ale předpřipravíme si je v tabulce, do které je nahraje funkce níže, která jako parametr používá ID souboru s titulky. 

Abychom nemuseli analyzovat titulky po větách, ale po delších celcích, provedeme tzv. bucketing. Vytvoříme shluky textu v délce dvou minut a ty se budou analyzovat jako celek. Z těchto bloků poté zjistíme, zda má část filmu spíše pozitivní, nebo naopak negativní sentiment. U dvouhodinového filmu bude podobných segmentů šedesát.

var subitlesParser = function(fileId) {
  var agregated = false;
  var CHARS = "-->";
  var BATCH_SIZE = 2; // time-window (e.g. 2minutes)
  var epoch = 0;
  var text = [];
  var output = [];
  var content = DriveApp.getFileById(fileId).getBlob().getDataAsString();
  var rows = content.split("\n");
  
  rows.forEach(function (row) {
    if (row.indexOf(CHARS) > -1) {
      var times = row.split(CHARS);
      var to = times[1].split(":");
      var hour = parseInt(to[0],10);
      var minutes = parseInt(to[1],10);
      var position = hour * 60 + minutes;
      
      if (position > BATCH_SIZE*epoch) {
         epoch++;
         var sentence = text.join("")
         sentence = sentence.replace(/\r?\n?/g,"");
         if (sentence != "") {
           var max = (BATCH_SIZE*(epoch-1));
           output.push([max, sentence]);
           text = [];
         }
      } 
      agregated = true;
    } else if (row === String.fromCharCode(13)) {
       agregated = false;
    } else if (agregated) {
      text.push(row)
    }
  });
  return output;
}

Funkce výše nám titulky načetla do tabulky a shlukla do textových řádků po 120 sekundách, které nyní konečně můžeme prohnat analýzou sentimentu.

Konečně si napíšeme funkci pro dotazování na Natural Language API od Googlu. Funkce vrátí dvě hodnoty:

  • skóre (score)
  • důležitost (magnitude)

V našem případě využijeme skóre v intervalu <-1;1>. Čím více je číslo záporné, tím negativnější emoce a naopak.

/* 
 * Get sentiment from Google Cloud Natural Language API
 */
var getSentiment = function(text) {
   var apiKey = PropertiesService.getScriptProperties().getProperty("apiKey")
   var url = "https://language.googleapis.com/v1/documents:analyzeSentiment?key=%KEY".replace("%KEY", apiKey)
   
    var data = {
       document: {
         language: "en-us",
         type: "PLAIN_TEXT",
         content: text
       },
       encodingType: 'UTF8'
     };
     
   var parameters = {
     method : 'post',
     contentType: 'application/json',
     payload : JSON.stringify(data)
   };
  
   var response = UrlFetchApp.fetch(url, parameters);
   return (response);
};

Pak zbývá už jen dopsat hlavní funkci, která vezme připravená data (dvouminutové segmenty), odešle je na API a výsledek uloží do tabulky.

var SPREADSHEET_ID = "xxxxx"; // <-- Google Spreadsheet ID

var settings = {
  nomadland : "xxxxxx" // <--- subtitles fileId 
}

function RUN() {
  var movie = "nomadland"
  var fileId = settings[movie];
  var output = subitlesParser(fileId);
  var table = [];
  table.push(["time", "score", "magnitude", "text"]);
  output.forEach(function (line) {
    var position = line[0];
    var content = line[1];
    var nlp = getSentiment(content);
    nlp = JSON.parse(nlp);
    table.push([position, nlp.documentSentiment.score, nlp.documentSentiment.magnitude, content]);
    Utilities.sleep(200);
  });

  var ss = SpreadsheetApp.openById(SPREADSHEET_ID)
  if (ss.getSheetByName(movie) === null) {
      var sheet = ss.insertSheet(movie)
  } else {
      var sheet = ss.getSheetByName(movie)
  }
  sheet.getRange(2,1,table.length,table[0].length).setValues(table);
}

Klepněte pro větší obrázek
Pomocí jazykového API jsme doplnili k jednotlivým dvouminutovým segmentům (řádkům tabulky) sentimentální skóre, které můžeme vynést na graf

Emoce ve filmu na časové ose

Jakmile máme tabelovaná data, můžeme nad nimi v „Excelu od Googlu“ vytvořit libovolný typ graf. Vyrobíme si tedy graf emocí v čase. Hezky je na něm vidět stoupající trend pozitivních emocí během filmu (fialová čára).

Klepněte pro větší obrázek
Emoce ve filmu podle API Googlu

Ve filmu jsou nejspíše tři hlavní dějové krize: 

  • okolo 20. minuty
  • okolo 76. minuty
  • okolo 100. minuty

Tedy alespoň podle API, které ohodnotilo jednotlivé pasáže anglických titulků.

Dále je zde důležitý prvek dramatu: katastrofa, ve které se radikálně změní děj. V posledních deseti minutách filmu se totiž skokově změní emoce z negativních na pozitivní a lze očekávat katarzi diváka až do konce filmu.

Dnes jsme se na několika desítkách řádků kódu v Apps Scriptu spojili s aplikačním rozhraním Googlu a ohodnotili pomocí něj anglické titulky vítězného oskarového snímku. Meze představivosti se přitom nekladou a stejně tak bychom mohli prozkoumat i něco mnohem zajímavějšího. To je už ale na vás. 

Diskuze (1) Další článek: Netac otestoval linky pro rychlé operační paměti DDR5. Hromadná výroba začne brzy

Témata článku: Microsoft, Google, Umělá inteligence, Programování, Země, Amazon, Hudba, filmy, seriály, API, Javascript, Excel, Analýza, String data, Apps Script, Tier, CTO, Google Cloud, Oskar, Anglický titulek, Skončení, Google Drive, Google Disk, UrlFetchApp, Google Cloud Platform, Google Cloud AI, CHARS



Bude to o prsa. Facebook a Instagram pořád neví, kdy jsou zobrazené bradavky porno

Bude to o prsa. Facebook a Instagram pořád neví, kdy jsou zobrazené bradavky porno

**Meta má zjednodušit pravidla a být ke všem spravedlivá **Facebook s Instagram věnují samostatný odstavec bradavkám **Pravidla ale neřeší nebinární, transsexuální a intersexuální osoby

Petr Urban
InstagramFacebookSociální sítě
Za WhatsApp se bude platit! Za předplatné dostanete funkci, která je u konkurence zadarmo

Za WhatsApp se bude platit! Za předplatné dostanete funkci, která je u konkurence zadarmo

** Bylo to jen otázkou času ** Už i WhatsApp nabízí prémiové předplatné ** Za poplatek dostanete funkci, která je u konkurence zadarmo

Martin Chroust
předplatnéWhatsAppMobilní aplikace
Šedý trh s předplatným se vymyká kontrole. Spotify, Netflix nebo Disney+ můžete mít doslova za pár korun

Šedý trh s předplatným se vymyká kontrole. Spotify, Netflix nebo Disney+ můžete mít doslova za pár korun

** Sdílení účtů mezi kamarády je jen začátek ** Dnes letí nákupy předplatných v Indii nebo na Aliexpressu ** Superlevné „netflixy“ ale mohou nakonec spíš škodit

Lukáš Václavík
PředplatnéNetflixSpotify
Návod, jak dostat maximum z Peněženky Google

Návod, jak dostat maximum z Peněženky Google

Služba Google Wallet (Peněženka Google) schlamstla před několika měsíci platební aplikaci Google Pay. Díky tomu se původní platforma rozrostla o další funkce. Je zde však i prostor pro zlepšení.

Jan Spěšný
Jak rozmazat dům, aby vás sousedi nemohli šmírovat. Jde to v Mapách Google i na Mapy.cz

Jak rozmazat dům, aby vás sousedi nemohli šmírovat. Jde to v Mapách Google i na Mapy.cz

** Nelibí se vám, když cizí lidé okukují váš dům? ** Všechny mapové aplikace nabízejí možnost rozmazání snímku ** Máme návod pro Apple Maps, Bing Maps, Mapy Google a Mapy.cz

Karel Kilián
SoukromíNávodyMapy
Vyzkoušeli jsme levnou autodiagnostiku s Androidem. Servisy ohrnou nos, řidičům bude stačit

Vyzkoušeli jsme levnou autodiagnostiku s Androidem. Servisy ohrnou nos, řidičům bude stačit

** Smartphone s Androidem dnes využijete i pro autodiagnostiku ** Jednotku OBD-II dnes pořídíte za pár stovek ** Co se vše dokáže diagnostika s bezplatným SW v češtině?

Martin Chroust
DiagnostikaPro řidiče
Facebook má nejspíš vaše telefonní číslo, i když jste mu ho nikdy nedali. Tímto tajným nástrojem ho můžete smazat

Facebook má nejspíš vaše telefonní číslo, i když jste mu ho nikdy nedali. Tímto tajným nástrojem ho můžete smazat

**Meta poskytuje nástroj na vymazání telefonních čísel a e-mailových adres z Facebooku a Instagramu **V minulosti Mark Zuckebrg popřel, že by Facebook vytvářel stínové profily **Metě teď můžete sebrat klíčové iddentifikátory, pořád o vás ale nejspíš ví mnoho dalšího

Petr Urban
MetaSledováníSociální sítě
Všichni žijeme v Bublině. Je velká 1000 světelných let a magnetizovaná

Všichni žijeme v Bublině. Je velká 1000 světelných let a magnetizovaná

** O bublinách v galaxiích toho víme jen velmi málo ** Theo O’Neill a jeho kolegové se to snaží zlepšit ** Zmapovali magnetická pole naší Lokální Bubliny

Stanislav Mihulka
Astronomie