25. května 2002

Pavel Halabala

Úvod

Firma zabývající se výrobou aut značky ”Jedeto” má mateřské sídlo v Německu a další pobočky v Čechách. Pro činnost firmy je nutná vzájemná spolupráce všech poboček a komunikace se zákazníky, to se děje prostřednictvím e-mailů. Protože zdaleka ne všichni zaměstnanci umí česky i německy, je třeba řešit situaci, kdy například osoba neoplývající znalostí češtiny dostane e-mail v češtině a naopak. Dosud dotyčný člověk musel e-mail přeposlat někomu schopnějšímu, kdo by jej přeložil a poslal zpět. Zmatek s posíláním e-mailů rostl s objemem firmy, proto se vedení rozhodlo pro radikální řešení. Ředitel, fanda do počítačů, najal programátora, který dostal následující úkol: Napsat program, který bude text e-mailů automaticky konvertovat do jazyka, který adresát ovládá. Programátor se bránil, ale proti tvrzením typu ”v dnešní době jde přece všechno” byl krátký. Nakonec ředitel přece jen uznal, že konvertor asi nebude snadná záležitost a místo něj najal komando překladatelek. Zbývalo napsat program, který by uměl detekovat jazyk e-mailu a při případném nesouladu s jazykovými dovednostmi adresáta automaticky přeposlat na dosud nejméně vytíženou překladatelku. Zmíněný programátor, obohacený znalostmi statistiky již z vysoké školy, se zamyslel a práci přijal s tím, že není jisté, zda pro průměrnou délku textu e-mailu existuje spolehlivé řešení.

 

 

 

Zadání

Najít délku textu*, pro který budeme moci alespoň s 95% přesností určit, zda je psán v češtině nebo v němčině. Rozpoznávání se bude provádět pouze na základě četnosti písmen v obou abecedách.

*) Protože se vychází z textu e-mailu, je dobrým zvykem v češtině nepoužívat interpunkci a v němčině se provádí následující změny: ä=ae, ö=oe, ü=ue, ß=ss. Tyto konvence se musí dodržet i v testovacích datech, oba jazyky pak budou mít stejnou abecedu.

 

 

 

Řešení

Nejdříve bylo potřeba zjistit relativní četnosti písmen v obou jazycích. Pro tento účel jsem si napsal program, který analyzuje vstup a vypíše výsledek, přičemž v úvahu se berou pouze platné znaky, tj. znaky z množiny X = { a, b, c, …, z }, ostatní se ignorují. Délky textů by měly být pokud možno co největší, protože přesnost výsledku je velmi důležitá pro další práci. Německý text měl kolem 1 miliónu platných znaků (román od Karla Maye) a český text měl asi 0,5 miliónu platných znaků ( povídky Miloslava Šimka + různé texty z internetu ). Tyto texty jsem upravil tak, aby splňovaly kritéria ze zadání. Jak bylo později zjištěno, stačily by i mnohem kratší texty a výsledek by byl velmi podobný. Pro hrubou orientaci v rozdílech mezi oběma jazyky uvádím následující graf.

 

 

Nejdříve něco o vlastnostech ”rozdělení”. Protože bylo vybíráno z dost velkého souboru dat, dovolil bych si rozptyl četností jednotlivých písmen v obou jazycích položit nule (tzn. přesně odpovídající realitě), aby bylo možné tento graf považovat za skutečné rozdělení a ne realizaci náhodného výběru. Tento krok by se dal přirovnat k situaci, kdy provedu milión hodů kostkou a spočtené pravděpodobnosti budu považovat za rozdělení. O oprávněnosti tohoto kroku by se dalo ještě polemizovat. Například četnost některých písmen (q,x) byla téměř nulová v obou jazycích, a protože byl analyzován v případě němčiny 1 román, mohlo by dojít k odchylkám v závislosti na volbě jmen hlavních postav. (Co by se třeba stalo, kdyby se hlavní hrdina jmenoval Xaver? ) Na druhou stranu si myslím, že ani tyto odchylky by příliš nevadily, protože písmen je mnoho a odchylka v jednom neznamená markantní změnu. Máme před sebou tedy rozdělení písmen abecedy použitých v textu, vypovídající o vlastnostech obou jazyků. Na první pohled je vidět, že se v některých případech četnosti mnohonásobně liší (např. f,g,j,w,y), to je velmi výhodné. Toto rozdělení je samozřejmě diskrétní.

Nyní je třeba si rozmyslet metodu, jakou budu postupovat. Mé úvahy by se daly shrnout do následujícího algoritmu:

1a) Uloží se do paměti zmíněné 2 dlouhé české a německé texty

1b) Bude se postupně měnit délka od 1 znaku až po x, kde x se stanoví parametrem

2a) Následující část 3 se provede y-krát, kde y bude hodně velké (zvolil jsem 10 000 )

3a) Vybere se náhodně úsek textu o dané délce z náhodného textu (českého nebo německého)

3b) Spočítají se relativní četnosti písmen v tomto úseku

3c) Pomocí nějaké metody se rozhodne o jazyku textu a do proměnné se uloží zda bylo rozhodnutí správné nebo ne

2b) Vypočítá se procento úspěšnosti při dané délce a vypíše se výsledek, pokračuje se v části 1b

 

Výstup tohoto programu je vlastně vše co potřebuji k vyřešení této úlohy. Při volbě dostatečně velkého y lze výsledky považovat za pravděpodobnost rozlišení mezi jazyky pro libovolný text. Pak stačí pouze najít kolik písmen postačuje k tomu, aby bylo procento úspěšnosti vyšší než 95%.

Zbývá určit metodu z bodu 3c, která bude na základě obdržené tabulky četností písmen z náhodně vybraného textu rozhodovat o jazyku. Jde o to zjistit, kterému rozdělení je tento text bližší. Napadlo mě porovnat něco jako vzdálenosti vektorů četností z náhodného výběru a obou jazyků.

kde σi je četnost písmene i v náhodně vybraném textu a Rpi ,resp. Spi jsou četnosti písmene i v češtině resp. v němčině. Část tohoto vzorečku byla vyňata z přednášek z kapitoly χ2 test dobré shody. Protože nejde o zamítnutí či potvrzení příslušnosti k jednomu rozdělení, nýbrž o výběr mezi dvěma rozděleními a jedno z nich to jistě je, stačí pouze porovnat uvedené sumy. Rozumím tomu tak, že součet kvadrátů rozdílu četností v čitateli by byl klasickým výpočtem vzdálenosti dvou vektorů. V každém sčítanci se provádí korekce vydělením četností písmene v daném jazyce, což je v podstatě váha, kterou čitatel přispívá k výsledku. Například váha rozdílu četností 0.2 a 0.1 není to stejná jako u 0.10001 a 0.00001.

Zde je výsledek:

Domnívám se, že tabulku ke grafu není potřeba uvádět. Uvedu pouze zajímavé výsledky.

Odpověď na otázku položenou v zadání je: Rozlišení s 95% přesností lze pomocí uvedené metody dosáhnout už u textu s délkou okolo 22 znaků a větší.

Zajímavé hodnoty jsou i na okrajích intervalu. Například pro náhodný výběr 1 znaku vychází pravděpodobnost okolo 63%. 99% přesnosti dosáhneme pro 47 znaků a po zaokrouhlení na 4 desetinná místa vychází 100% přesnost okolo 250 znaků.

Závěr

Dosažené výsledky možná nemusí přesně odpovídat realitě. Jsou zde okolnosti, které jsem zanedbal. Pro zjištění četností a následný výpočet pravděpodobností odlišení byly použity stejné texty, což by se asi správně nemělo. Domnívám se ale, že skladba slov jazyka a jejich složení do smysluplného textu má takový charakter, že je možné při těchto výpočtech abstrahovat od obsahu textu a výsledky by byly velmi podobné (pokud má ovšem daný text patřičnou délku). Smysluplnost má určitě také svůj význam. Asi nelze vybírat náhodně slova ze slovníku, protože by zde nebyla zachycena frekvence použití slov ve skutečném textu. Smysluplnost byla částečně porušena při náhodném výběru úseku textu o dané délce, kde tento text nemusel začínat prvním písmenem prvního slova a končit posledním písmenem posledního slova, ale třeba někde uprostřed. Tento fakt je významný zejména u velmi krátkých textů a nelze proto výsledky v těchto mezích brát příliš vážně. Je těžké odhadnout jak moc je tímto ovlivněn text o délce kolem 20 znaků.

V uvedeném řešení byla použita metoda hrubé síly. Přemýšlel jsem o analytickém odhadu, jenže ten by byl opravdu nesnadný, ne-li nemožný. Asi bych potřeboval spočítat průměrné četnosti písmen pro různé délky textu a rozptyl. K tomu bych opět musel použít hrubou sílu. Nakonec by stejně záleželo na metodě, která se ve skutečnosti použije pro odlišení textů, a tak jsem ji přímo implementoval a na jejím základě spočítal výsledek. Je také možné, že existuje ještě lepší metoda než ta kterou jsem použil. Předtím jsem zkoušel použít stejný vzorec, ale bez členů ve jmenovateli. Výsledek byl o něco horší, ale s narůstající délkou textu se účinnost obou metod vyrovnávala.

Závěrem je třeba konstatovat, že průměrná délka e-mailu rozhodně několikanásobně překračuje hranici potřebnou pro ”poměrně dobré” rozpoznání češtiny a němčiny a tato metoda by se dala použít.