Zadání domácího úkolu RPAVOUK

Stručná charakteristika: Spojení úkolů CRWL, RJAZ a HSAV. Dostanete k dispozici nejméně jedno řešení každého z uvedených úkolů, můžete ho použít celé nebo se jím jen inspirovat podle libosti. Půjde o stahování korpusu z webu, při kterém budete ale už za pochodu zjišťovat jazyk a kódování stahovaných dokumentů (statisticky, tedy i v případě, že dotyčné údaje nejsou v dokumentu uvedeny). Výstupní korpus rozdělíte do souborů podle jazyka; kódování sjednotíte na UTF-8. Procházení webu volitelně ukončíte při vystoupení z určité množiny jazyků. Před uložením ještě nasadíte program na hranice slov a vět.

Prostředí, ovládání: Řešení se skládá ze dvou skriptů v Perlu: rjtrain.pl a rpavouk.pl. První z nich slouží k natrénování rozpoznávače jazyků, druhý ke stahování textů z webu, jejich třídění podle jazyka a kódování a ukládání na disk ve tvaru korpusu. Kromě přípravy skriptů se také předpokládá, že natrénujete rozpoznávač jazyků pro praktické použití.

Příklady volání:

rjtrain.pl cs < trenovaci_text.txt > cs.frq

rpavouk.pl http://www.seznam.cz/ ../rjaz-frq

Program rjtrain.pl by měl být více méně připraven v řešení úkolu RJAZ, mělo by stačit ho přejmenovat a upravit předávání argumentů (protože v zadání RJAZ ještě nebyly přesně stanovené požadavky na ovládání). Požadavky na něj jsou následující:

  1. Ze standardního vstupu (STDIN) přečíst text v jazyce, který se chceme naučit (při jednom volání se učí pouze jeden jazyk, pro naučení n jazyků je třeba program zavolat n×).

  2. Na standardní výstup (STDOUT) vypsat tabulku četností znaků, dvojic znaků a trojic znaků, seřazenou vzestupně podle délky n-tice a podle četnosti. Podrobněji viz formát dat níže.

  3. Případná chybová a informační hlášení vypisovat na STDERR. Veškerá komunikace s okolím probíhá pomocí STDIN, @ARGV, STDOUT a STDERR. Nepřistupovat na disk prostřednictvím pojmenovaných cest a souborů, nepožadovat průběžnou interakci s uživatelem.

  4. Vzhledem k výše uvedenému program nepotřebuje znát název jazyka. Statistiky dodá na standardní výstup a je na volajícím, aby si je nasměroval do souboru, jehož jméno bude dostatečně vypovídat o jazyku a kódování. Pro pokusy nicméně doporučuji následující konvenci. Jméno frekvenčního souboru se skládá z identifikátoru jazyka, identifikátoru kódování a přípony „frq“; tyto tři části jsou odděleny tečkou. Zatímco identifikátor jazyka může být víceméně libovolný řetězec (např. dvoupísmenný kód podle ISO 639-1), údaj o kódování musí být řetězec použitelný v knihovně Perlu Encode (aby později program rpavouk mohl překódovat dokumenty do UTF-8 pomocí této knihovny). Příklad: „cs.iso-8859-2“ je čeština v unixovém kódování Latin 2 (ISO 8859-2). Poznámka: češtinu v ISO 8859-2 považujeme za jiný jazyk než např. češtinu v UTF-8 (každá z nich bude mít jinou frekvenční charakteristiku).

Program rpavouk.pl je spojením rozpoznávače jazyků, stahovače textů z webu a označovače hranic slov a vět. Požadavky na něj jsou následující:

  1. Jako argument $ARGV[0] převzít URL adresu HTML dokumentu, kterým se má prohledávání webu začít.

  2. Jako volitelný argument $ARGV[1] převzít cestu ke složce s uloženými frekvenčními modely známých jazyků. Není-li tento argument uveden, dosadit do něj aktuální složku („.“). V uvedené složce najít všechny soubory, jejichž jméno končí na „.frq“, a načíst z nich frekvenční obrazy příslušných jazyků. Předpokládat, že název souboru po odtržení „.frq“ je identifikátorem jazyka.

  3. Stáhnout z webu obsah dokumentu. Pomocí kontrolního součtu odhadnout, zda jsme už někdy takový dokument četli, byť z jiné adresy. Pokud stejný kontrolní součet najdeme uložený v hashi, dokument dále nezpracovávat. Vyhneme se tím např. opakovanému zařazování stránky „Chyba 404 – dokument nebyl nalezen.“

  4. Rozpoznat jazyk a kódování dokumentu, případně určit, že dokument není v žádném ze známých (= natrénovaných) jazyků. Poznámka: K tomu musíte odstranit značky a entity HTML (viz též níže; zde však musíte odstranit všechny značky a všechny entity, tedy včetně značek odstavců a entit pro většítko, menšítko a ampersand). Musíte to dělat na kopii dokumentu, protože některé značky a některé entity ještě budete potřebovat. Rozpoznání jazyka se však nedá příliš odkládat, protože některé akce odpadnou, pokud zjistíme, že dokument je v neznámém jazyce.

  5. Jestliže je dokument ve známém jazyce, známe i jeho kódování (lze vyčíst z názvu jazyka, viz výše). Pomocí decode($kodovani, $dokument) převést dokument do UTF-8. Už v něm zůstane a bude se v něm i ukládat (takže budeme potřebovat také binmode(STDOUT, ":utf8")).

  6. Jestliže je dokument ve známém jazyce, najít v něm odkazy na jiné dokumenty — zejména odkazy typu <a href=…> a odkazy typu <frame src=…> (volitelně i další, např. prostřednictvím JavaScriptu). Převést případné relativní cesty na absolutní (podle adresy právě zpracovávaného dokumentu doplnit adresu z kořenové složky, odstranit redundantní „/../” a “/./”, doplnit „http://“ a adresu počítače, umazat případné lomítko na konci (protože je potřeba sjednotit adresy s lomítkem a bez, a přidat lomítko není vždy možné)). Takto upravenou adresu přidat do zásobníku dokumentů ke zpracování, pokud nenastane jedna z následujících okolností:

  7. Odstranit z dokumentu HTML značky s výjimkou těch, které mohou ukazovat na začátek nového odstavce — ty akorát převést na jednotnou značku <p> a umazat u nich nepotřebné atributy. Jde zejména o značky <p>, <h1><h6>, <li>, <dt>, <dd>, <td> a případně další, které vás napadnou. Pozor, kolem některých značek bude nutné přidat mezery, aby se neslepila dvě slova. Naopak na konci by to chtělo stáhnout posloupnosti několika mezerových znaků do jediné mezery. Při odstraňování HTML byste měli odstranit i JavaScript, přestože jeho kód se někdy vyskytuje na úrovni obyčejného textu dokumentu (tj. mimo HTML značky). Na začátek dokumentu připsat novou značku <doc src="…">, kde bude adresa, ze které jste dokument stáhli.

  8. Odstranit HTML entity s výjimkou entit pro zvláštní znaky používané v HTML (“&lt;” = “<”, “&gt;” = “>”, “&amp;” = “&” — ty musí v textu zůstat, protože v něm zůstanou některé značky ohraničené většítky a menšítky). Příklad entit k převedení: &copy; = ©, &agrave; = à, &nbsp; = neoddělující mezera. Zvláštní případ: &#235; kde 235 je kód znaku. Asi předpokládejte, že tyto kódy již používají Unicode (tj. můžete udělat $znak = chr(235)).

  9. Doplnit hranice slov a vět podobně jako v úkolu HSAV. Tam, kde začíná nový odstavec, musí začít i nová věta. Odstavec se ale může skládat z více vět. Poznámka: Hledání hranic vět je jazykově závislé. Programy na HSAV obsahují tabulky českých zkratek, po kterých pravděpodobně nekončí věta. Tento fakt můžete ignorovat. Většina vět se pozná i ve většině jiných jazyků — samozřejmě s výjimkou těch jazyků, které ukončují větu jinými znaky než čeština (tečka, vykřičník, otazník a různé pravé závorky a uvozovky).

  10. Zpracovaný dokument uložit na konec souboru s korpusem pro příslušný jazyk. Pro každý rozpoznaný jazyk vznikne v aktuální složce („.“) jeden soubor xx.txt, kde xx je kód jazyka (teď již bez identifikace kódování, protože všechny texty jsou povinně převedené do UTF-8). Dokumenty v neznámém jazyce uložit každý do samostatného souboru neznamy-nnn-xx.txt, kde nnn je číslo neznámého souboru a xx je kód známého jazyka, kterému se text nejvíce podobá. Pokud dokument obsahoval informaci o kódování (např. <meta http-equiv="content-type" content="text/html; charset=iso-8859-2">), překódujte dokument do UTF-8. Jinak nezbývá, než ponechat původní kódování.

Formáty dat

Vstup programu rjtrain.pl je prostý text v příslušném jazyce a kódování.

Frekvenční charakteristika jazyka (soubor *.frq, tedy výstup rjtrain.pl a vstup rpavouk.pl) je textový soubor, jehož kódování obecně není stanoveno. Jeden řádek obsahuje tři hodnoty oddělené tabulátorem. První z nich je znak (resp. n-tice znaků), druhá je absolutní četnost znaku v trénovacím textu, třetí je relativní četnost (tedy číslo mezi 0 a 1). Řádky pro samostatné znaky, pro dvojice znaků a pro trojice znaků jsou uvedeny pohromadě, nejdříve samostatné znaky, pak dvojice, pak trojice. V rámci těchto skupin jsou řádky seřazené vzestupně podle četnosti. Poznámka: Vzhledem k naší situaci, kdy neznáme předem ani kódování, nebudou sledovanou jednotkou vlastně znaky v pravém slova smyslu, ale bajty. Tento rozdíl se projeví při vstupu ve vícebajtovém kódování, např. v UTF-8. Např. místo trojice znaků ých, která je v UTF-8 zachycena 4 bajty o hodnotách C3 BD 63 68, se zachytí dvě trojice, C3 BD 63 a BD 63 68, přičemž tu druhou už nelze samostatně interpretovat v UTF-8. I tak by však mělo být možné rozpoznat, že jde o češtinu v UTF-8.

Vstupem programu rpavouk.pl je prostý text nebo HTML v libovolném kódování. Dokumentaci k HTML lze nalézt na webu.

Výstup programu rpavouk.pl je text označkovaný podobnými značkami jako v HTML, SGML a XML (značka začíná menšítkem a končí většítkem, případná koncová značka má za menšítkem lomítko, skutečné většítko, menšítko a ampersand jsou reprezentovány entitami, které začínají ampersandem a končí středníkem). Jsou definovány následující značky:

Každá z uvedených značek začíná na novém řádku. Bezprostředně za značkou <f> je uvedeno příslušné slovo, pak teprve končí řádek.

Volitelně můžete program upravit tak, aby určoval jazyk pro dokument i samostatně pro každý jeho prvek. Např. je možné, že v převážně českém dokumentu se vyskytne anglický odstavec nebo věta All rights reserved. Nebo se v české větě může vyskytnout anglické slovo Windows. Atd. Pokud toto vylepšení implementujete, přidejte do značek <doc>, <p>, <s> a <f> atribut „lang“, např. “<f lang="en">Windows”.

Nastavení pokusu

Naučte systém alespoň následující jazyky alespoň v uvedených kódováních. Dbejte na to, aby trénovací texty pro jednotlivé jazyky byly srovnatelně veliké, v ideálním případě by se neměly příliš lišit ani tématicky. Pro trénování různých kódování téhož jazyka byste měli použít identický text, který se bude lišit pouze kódováním (překódování můžete provést např. pomocí několika řádků Perlového kódu).

cs, sk a sl jsou zařazeny pro testování úspěšnosti rozlišení blízkých jazyků, používajících tatáž kódování a podobnou abecedu. ru je zařazeno pro testování chování pro jazyk s úplně odlišným písmem. en, de, fr a es je výběr dalších nejběžnějších jazyků a je zařazen z praktických důvodů: na tyto jazyky nejspíše narazíme, když začneme s procházením v Česku. Můžete samozřejmě přitrénovat i další jazyky.



Jazyk

Kód jazyka

Kódování

čeština

cs

iso-8859-2

cp1250

utf-8

slovenština

sk

iso-8859-2

cp1250

utf-8

slovinština

sl

iso-8859-2

cp1250

utf-8

ruština

ru

koi8-r

cp1251

iso-8859-5

utf-8

angličtina

en

iso-8859-1

cp1252

utf-8

němčina

de

iso-8859-1

cp1252

utf-8

francouzština

fr

iso-8859-1

cp1252

utf-8

španělština

es

iso-8859-1

cp1252

utf-8



Podklady

Dodat CRWL, RJAZ, HSAV, případně též vzorové texty v požadovaných jazycích v UTF-8.