Kdy se narodil... Vypracovali: Mrkývka Vojtěch, Mrázek Ondřej, Novotná Marie Předmět: PLIN08 Projekty II Semestr: Jaro 2015 Vedoucí projektu: Mgr. Marek Grác, Ph.D. Úkolem tohoto projektu bylo vytvořit program/skript umožňující počítači automaticky zodpovídat některé otázky ve hře Česko (jinými slovy: snaha naučit počítač vyhledat v textových souborech jistý typ informací a pracovat s nimi). Česko je stolní (desková) vědomostní hra postavená na týmovém soupeření v zodpovídání otázek vztahujících se nějakým způsobem k České republice. Otázek existuje ve hře velké množství (tedy se dá tvrdit, že otázka není dopředu známá a je náhodná). Ve hře existuje několik okruhů otázek. Náš úkol spočíval ve vytvoření skriptu, který by uměl excerpovat z textového vstupu datum narození známé osobnosti (což je jeden z frekventovaných herních dotazů). 1 Přípravná fáze Základní program, pro který skript vytváříme, pracuje se surovými daty získanými na internetu. Tzn. bylo nutné zjistit, jaký výsledek předá vyhledávač po zadání dotazu na jméno osobnosti. Podle toho bylo později možné navrhnout algoritmus. Po zkoušení velkého počtu dotazů jmen osobností se nám podařilo zjistit, jaké výsledky se zobrazují nejčastěji. U více než 90 % vyhledávaných osobností se jako první ve vyhledávači zobrazují odkazy na portál Wikipedie.org. Zbylých asi 10 % výsledků odkazuje na osobní webové stránky osobností (většinou se jednalo o žijící a mediálně velmi známé osoby). Dotazy jsme zadávali do vyhledávačů Google i Seznam. 1
2 Wikipedie Na stránkách Wikipedie jsme v další fázi opět zadávali jména českých osobností. Pozorovali jsme, že jednotlivé výsledky, respektive informace o datech narození, bývají napsány ve velmi podobné formě. To je způsobeno tím, že dnes již na Wikipedii existují pravidla o podobě jednotlivých uváděných informací. Díky tomu se lze spolehnout na to, že i když se může měnit obsah jednotlivých wiki stránek, formát zůstane téměř nezměněn. V této fázi bylo také potřeba zjistit, zda neexistují osobnosti, u nichž se standardní podoba informace o datu narození diferencuje. (Toto vyhledávání muselo být z podstaty informace intuitivní. Znalost existence těchto potenciálně problémových osobností (z hlediska formy zápisu) je totiž závislá na empirických zkušenostech, tzn. nelze algoritmizovat.) 2.1 Formát informací Z průzkumu vyplynulo, že standardní podoba informace o datu narození na wiki stránkách má tento charakter: celá informace je uzavřena v kulatých závorkách v samotné závorce jsou uvedeny informace o době narození (den, měsíc, rok), místě narození, datu úmrtí (den, měsíc, rok) a místě úmrtí 1 formát těchto jednotlivých oblastí (data, místa), tedy struktura textu v závorce, je téměř shodný Př.: Alois Jirásek (23. srpna 1851 Hronov (1) 12. března 1930 Praha) byl český prozaik, dramatik a politik, autor řady historických románů a představitel realismu. Cílem této fáze bylo sestavení regulárního výrazu, který by akceptoval co nejvíce variant možných forem zápisů (pokud možno všechny). 1 Pokud osoba žije, pak tyto informace pochopitelně nejsou. 2
2.2 Problémové jevy Pokud by byly informace o datu narození na všech stránkách skutečně shodné, nebylo by příliš obtížné sestavit adekvátní regulární výraz. Museli jsme ale zohlednit i to, že některý z údajů v závorce chybí nebo je realizován jinou formou. Pokud hledaná osoba žije, je obsah textu v závorce v podstatě poloviční. Sestavení dotazu může problematizovat např. místo narození nebo úmrtí osoby. Třeba tehdy, je-li jméno města víceslovné, obsahuje-li spojovník aj. (Frýdek-Místek, Borová u Přibyslavi). Příklady problémových jevů: uvedení symbolů * u narození osoby rozdílné pádové formy měsíců (leden, ledna, únor, února,... ) redundatní výrazy asi, nebo (u osob, kdy není daná informace dostatečně doložena) uvedení jiných informací v závorce (např. celé jméno osoby) víceslovné pojmenování místa narození nebo úmrtí... 2.3 Sestavení regulárního výrazu Výše zmíněné problémové jevy nejsou jediné, se kterými jsme se setkali. Pouze ilustrují velkou variantnost možných zápisů v (na první pohled) homonymní podobě obsahu závorky. Samotný regulární výraz pak byl sestaven pro množinu několika standardních zápisů a následně rozšiřován tak, aby vyhovoval i třídám samostatných problémových jevů. I během této fáze jsme se pokoušeli rozšířit okruh osob s nevhodnou podobou zápisu. Jména obsahující přídomky (šlechtický predikát), dvě data narození nebo úmrtí aj. a tyto opět otestovat pro aktuální regulární výraz. 3
3 Skript Když byl sestaven dostatečně silný regulární výraz, bylo potřeba jej efektivně aplikovat v rámci skriptu. Samotný výraz pouze najde konkrétní informace, ale dále s nimi nepracuje. Mohli jsme ale tento výraz využít v rámci skriptu, který by pomocí něj přidal do textu metainformaci o datu narození. Výsledný program pak pouze analyzuje námi obohacený text a výslednou informaci předá na výstup. Jedním z řešení byl unixový program sed, který umožňuje nahrazování textových řetězců jinými řetězci. V praxi by to vypadalo tak, že bychom např. řetězec 23. srpna 1851 uzavřeli do párových tagů s metainformací datum narození. Při testování jsme ale zjistili, že program sed není pro náš účel úplně ideální. Skript v něm zapsaný byl velmi nepřehledný a v průběhu testování se ani zkoušené regulární výrazy nechovaly podle očekávání. Vhodnější variantou pak bylo napsat skript v jazyce Python. Tuto metodu jsme nakonec zvolili. 3.1 Popis algoritmu Skript vyžaduje na vstupu textová data, která analyzuje. Pokud najde hledané informace, vrací je na výstup doplněné o metainformace. Základní soubor, tak zůstane nezměněn. Samotný skript je složen ze dvou hlavních regulárních výrazů. Jeden pokrývá skupinu dat obsahujících datum narození i úmrtí osoby. Druhý výraz zachycuje data u osob majících pouze datum narození. Před tiskem výstupních dat jsou provedeny ještě některé, spíše vizuální, úpravy (např. je nahrazen slovní údaj měsíce narození za jeho číselnou reprezentaci: leden = 1, únor = 2 atd.) Přestože cílem bylo zjistit pouze informaci o narození osoby, rozhodli jsme se zpracovat i některé další informace (místo narození, datum a místo úmrtí). 4
4 Závěr 4.1 Slabiny skriptu Jak již bylo řečeno, asi 10 % dotazů se nenachází na stránkách Wikipedie. Zjistili jsme, že tyto výsledky jsou natolik rozdílné (formou zápisu informace o narození), že je nemožné je zahrnout do našich regulárních výrazů. Zápisy byly dokonce natolik rozdílné, že by bylo nutné sestavit regulárních výrazů velké množství. Navíc není jisté, jestli by i tak bylo vyhledávání úspěšné. Protože pro těchto 10 % existuje i stránka na Wikipedii, bylo by efektivnější přesměrovat program právě tam, kde by bylo možné použít fungující skript. Další slabinou je pak nefunkčnost získání informací u některých osob; např. tehdy, vyskytují-li se u osoby dvě data narození nebo úmrtí. Tyto případy ale nelze predikovat, takže problém bude vhodné řešit operativně až ve chvíli zjištění nefunkčnosti regulárního výrazu. 4.2 Výhody skriptu Zpracování v jazyce Python umožňuje díky přehlednému zápisu (oproti sedu) snadnou manipulaci s obsahem, a tím dovoluje rychle upravit regulární výrazy nebo podobu výstupu. Získání i jiných informací, než je datum narození, zjednodušuje práci výsledného programu, který v jedné iteraci analýzy textu získá více důležitých dat. Oproti sedu je navíc jednodušší práce se zpětnými referencemi v rámci regulárních výrazů. 5