====== Rozpoznávání a třídění jazyků ======
{{template>spolecne}}
Napište program, který dokáže rozpoznat jazyk dokumentu, věty a slova a roztřídit vstupní text podle jazyků. Součástí zadání bude konkrétní skupina jazyků, které má program umět poznat, váš program by však měl být jazykově nezávislý. Vše, co potřebuje o konkrétních jazycích vědět, by měl být schopen se naučit z dat. (Z toho plyne, že vy dané jazyky ovládat nemusíte, naopak je možná výhodou, když jsou vám zcela neznámé.)
Úloha má tyto části:
- Program na natrénování statistiky, podle které dokážeme rozpoznat jazyk dokumentu.
- Program, který na základě statistiky přiřadí jazyk dokumentu i jednotlivým jeho částem. Skupinu dokumentů v jedné složce dokáže roztřídit do složek podle jazyka.
- Natrénování rozpoznávače pro zadanou skupinu jazyků a kódování. Trénovací data sežeňte sami, například na webu.
Odevzdávat budete oba programy a natrénované statistiky.
===== Specifikace programu pro trénování jazyků =====
Program se jmenuje ''rjtrain.pl'' a nepotřebuje žádné argumenty. Pokud je přece dostane, považuje je za cesty k souborům, ze kterých má načíst svůj vstup. Jinak čte ze standardního vstupu (STDIN). Na standardní výstup (STDOUT) vypíše frekvenční charakteristiku textů, které měl na vstupu. Standardně by měl sbírat frekvence trojic, dvojic a samostatných znaků/bajtů. Volitelně můžete evidovat i nejčastější slova.
Volitelně může program dostat volbu ''-u'', která říká, že vstup bude v UTF-8 a že v tomto kódování chceme dostat i frekvenční charakteristiku. Nebyl-li program zavolán s touto volbou, žádné kódování nepředjímejte. Čtěte i vypisujte prostou posloupnost bytů (''":raw"'').
Frekvenční charakteristika obsahuje na každém řádku dva údaje oddělené tabulátorem: n-tice znaků a její relativní četnost v dokumentu (tedy číslo mezi 0 a 1). Volitelně můžete připsat i třetí údaj, absolutní četnost, ale až na třetím místě (za dalším tabulátorem). Tento údaj typicky slouží jen pro informaci člověku, který se na to bude koukat, nikoli vlastnímu rozpoznávači. Řádky frekvenčního souboru seřaďte na prvním místě podle délky sledované ntice (nejdříve trojice, pak dvojice, pak samostatné bajty, nakonec případná celá slova (bez ohledu na délku, pokud jste jejich frekvence sbírali). Druhé třídící kritérium je četnost (nejdříve nejčastější ntice, ty vzácné až nakonec). Příklad:
ní] 0.00712694877505568
[po 0.00623608017817372
[pr 0.00556792873051225
ch] 0.00489977728285078
[ne 0.00334075723830735
pro 0.00334075723830735
...
[p 0.0137118578601777
ov 0.0117806102742372
ra 0.00984936268829664
a] 0.00965623792970259
[s 0.00946311317110854
...
[ 0.117286055233549
] 0.117286055233549
o 0.0555744971019434
e 0.0497783839072622
a 0.0422775315376747
===== Specifikace programu pro rozpoznávání jazyků =====
Program se jmenuje ''rjaz.pl'' a volá se takto (příklad):
rjaz.pl -f ~/frq -i . -o ../roztrideno [-xdN|-xpN|-xwN]
rjaz.pl -f ~/frq < vstup > vystup [-xdN|-xpN|-xwN]
První volání znamená: 1. Ve složce ''~/frq'' najdi všechny soubory, jejichž název končí příponou ''.frq'', a načti z nich frekvenční charakteristiky známých jazyků. Za název jazyka se považuje název souboru po odtržení cesty a přípony ''.frq''. Např. soubor ''cs.iso-8859-2.frq'' obsahuje charakteristiku jazyka "cs.iso-8859-2". 2. Postupně načítej soubory ze složky ''.'' (aktuální složka), pro každý z nich urči jazyk. Pokud je podobnost dokumentu všem známým jazykům příliš malá, prohlaš jazyk za neznámý (''unknown''). 3. Kopii načteného a rozpoznaného dokumentu ulož do ''../roztrideno'' do podsložky, která se jmenuje stejně jako jazyk dokumentu. (Pokud taková podsložka ještě neexistuje, vytvoř ji.)
Není-li zadána volba ''-i'' (jako ve druhém příkladu), čte se jediný dokument ze standardního vstupu. Na **standardní chybový výstup (STDERR)** se vypíše vyhodnocení jazyka celého dokumentu, tj. seznam známých jazyků, spolu s číselným vyjádřením podobnosti dokumentu každému jazyku, seřazený sestupně podle podobnosti. Pokud dokument není žádnému známému jazyku podobný dostatečně, před seznam se ještě napíše upozornění, že jde pravděpodobně o neznámý jazyk. Na standardní výstup (STDOUT) se vypíše dokument ze vstupu; to má smysl jen při volbách ''-xd'', ''-xp'' nebo ''-xw''.
==== Volby -xd, -xp a -xw ====
Kterákoli z těchto voleb způsobí, že:
- O vstupním dokumentu se předpokládá, že je tokenizovaný, tj. slova i jiné tokeny (interpunkce) jsou už oddělené mezerami a zalomení řádku odděluje odstavce.
- Na výstupu není dokument pouze opsán, ale je obalen XML značkami podle následujících pravidel:
* Celý dokument je obalen značkami ''
''...''
''. * Každé slovo (token) je obaleno značkami ''
===== Jazyky, které máte umět =====
V zimním semestru 2007-2008 jsou součástí zadání následující jazyky. Samozřejmě můžete svůj program naučit i libovolné další jazyky. Nemáte-li pro dané jazyky trénovací data, sežeňte si je na webu. Trénovací data pro různá kódování získejte překódováním trénovacích dat z UTF-8.
| čeština | utf-8 | iso-8859-2 | cp1250 |
| slovenština | utf-8 | iso-8859-2 | cp1250 |
| slovinština | utf-8 | iso-8859-2 | cp1250 |
| ruština | utf-8 | koi8-r | cp1251 |
| angličtina | utf-8 | iso-8859-1 | cp1252 |
| němčina | utf-8 | iso-8859-1 | cp1252 |
| nizozemština | utf-8 | iso-8859-1 | cp1252 |
| francouzština | utf-8 | iso-8859-1 | cp1252 |
| španělština | utf-8 | iso-8859-1 | cp1252 |
| italština | utf-8 | iso-8859-1 | cp1252 |
===== Další informace =====
Tento úkol (včetně zadání konkrétního jazyka) si můžete zarezervovat vyplněním formuláře na http://quest.ms.mff.cuni.cz/cgi-bin/zeman/zapoctaky/rezervace_ukolu.pl (pokud ještě není rozebrán).
Pokud se individuálně nedohodneme jinak, termín odevzdání je konec listopadu. Při některé prosincové přednášce program předvedete ostatním.