1. Z obou datových souborů načtěte texty k analýze. Pro každý text zvlášť odhadněte pravděpodobnosti znaků (symbolů včetně mezery), které se v textech vyskytují. Výsledné pravděpodobnosti graficky znázorněte.
Data a parametry
Reprezentant - Bogdan Buliakov
Parametry úlohy byly spočtěny následovně:
K = den narození reprezentanta skupiny - 23 L = počet písmen v příjmení reprezentanta - 8 (BULIAKOV)
Podle uvedeného vzorce jsme definovali datový soubor č. 1, jako soubor 013.txt a datový soubor č. 2, jako 014.txt
Nastavení
Pomocí těchto funkcí získáme výsledky.
Výsledky pro první text
Nejčastějším znakem, který se objevuje, je samozřejmě ' ' – protože se díváme na text a jako znak bereme v úvahu i mezery.Tady vidíme,že se nejčastěji vyskytující písmeno je 'e'. Následuje 'a', 't' a 'i'.
Nejméně často se vyskytující písmeno je 'z' . Mezi další zřídka se vyskytující písmena patří 'j' a 'q'.
Celkově se distribuce zdá být poněkud podobná typické distribuci písmen v anglickém textu (https://en.wikipedia.org/wiki/Letter_frequency).
Výsledky pro druhý text
Distribuce znaků ve druhém textu se příliš neliší od distribuce znaků v prvním textu. Zde můžeme říci, že k těm nejčastějším přibyla písmena 'o' a 'n'.
Můžeme si taky všimnout, že v obou textech se vyskytuje každý znak anglické abecedy,takže nemusíme provádět žádné úpravy.
2. Pro každý text zvlášť spočtěte entropii odhadnutého rozdělení znaků.
Pomocí výše uvedené funkce (entropy) se podívejme na výsledky.
Výsledky pro první text
Můžeme si to ověřit i pomocí původního vzorce uvedeného na přednáškách. (Entropie diskrétní náhodné veliciny, Přednáška 5)
Výsledky pro druhý text
Ověřim i pomocí původního vzorce uvedeného na přednáškách.
3. Nalezněte optimální binární instantní kód C pro kódování znaků prvního z textů.
Jak již víme z přednášek (Věta 6.17, Přednáška 6) Huffmanův kód je optimální, proto použijeme Algoritmus sestrojení binárního Huffmanova kódu (6.6 Huffmanovo kódování, Přednáška 6):
Realizace
Vytvořme si Huffmanovu třídu, která bude obsahovat všechny potřebné funkce pro splnění našeho úkolu.
Zde můžeme vidět, jak tvoříme nová slova (new letter) z kombinací existujících slov, jejich indexy (letter number) , indexy slov, která tvoří nové slovo(indices united), a jak se sčítají jejich pravděpodobnosti (probability).
K implementaci výše uvedeného algoritmu budeme potřebovat: array - probabilities ve funkci create_code s číslem písmena (slova) a jeho pravděpodobností, který použijeme k uspořádání jejich pravděpodobností a hledání nejméně pravděpodobných slov.
letters_dict ve funkci create_code toto je struktura (dictionary) pro uložení stromu, kam budeme přidávat nové uzly (prvky): key tady bude písmeno (slovo), které jsme měli předtím a pak tam přidáme slova, která byla získána, jako výsledek vytváření nových uzlů jak value uložíme číslo slova, jeho pravděpodobnost (v případě nového slova součet pravděpodobností, ze kterých se skládá), сísla slov, ze kterých nové slovo bylo složeno, a kod, který bude vygenerován v _fill_code indices_for_union používáme pro uspořádání a výběru 2 (Darnost = 2, protože potřebujeme binární kod) nejméně pravděpodobných prvků (slov) v probabilities.
_fill_code funkce funguje tak, že vytvořený strom uvažujeme od konce. V kořeni máme prvek s pravděpodobností 1 a to je slovo sestávající ze všech slov, která jsme měli. Toto slovo "hrcmseovpwgnildatjxzqkbufy" bude mít kódové slovo prázdný řetězec= " ". Dále začneme zvažovat, jak ze kterých prvků byl získán a jejich pravděpodobnosti, prvku s nejvyšší pravděpodobností bude přiřazeno kódové slovo "0", s menší pravděpodobností"1".
Například, jak můžete vidět výše, slovo - "hrcmseovpwgnildatjxzqkbufy" bylo získáno kombinací 50 = "hrcmseovpwg" a 51 = "nildatjxzqkbufy " slov, jejich pravděpodobnosti jsou rovna ''hrcmseovpwg" - 0.41634397115769795, "nildatjxzqkbufy " - 0.583656028842302
Proto dáme slovu 'hrcmseovpwg" kód "1" a slovu "nildatjxzqkbufy" - "0" provedeme stejnou operaci pro každého potomka a vytvoříme jeho kódová slova, jak jsme to udělali nyní (přidáním "0" nebo "1" k předchozímu kódovému slovu, v závislosti na jejich pravděpodobnosti)
Binární Huffmanův kód
Takto vypadá náš kód získaný použitím Huffmanova algoritmu.
4. Pro každý text zvlášť spočtěte střední délku kódu C a porovnejte ji s entropií rozdělení znaků. Je kód C optimální i pro druhý text?
Střední délka kódu C s rozdělením p(x) definujeme jako, kde l (x) je délka kódového slova příslušejícího prvku x ∈ X .
Nutná podmínka pro optimalitu (entropie <= střední délka kódu < entropie +1)
Podíváme se na náš kód pro první text. Můžeme si všimnout, že délka kódu je řazena podle pravděpodobností.
Podíváme se ted' na druhý text. Vidíme, že u druhého textu tomu tak není.
Zkusme seřadit a nahradít navzájem odpovídající kódy a uvidíme, co se stane se střední délkou kódu.
Pak dostaneme:
Vidíme, že jsme dostali nižší hodnotu, než byla. Můžeme tedy usoudit, že předchozí kód С nebyl pro druhý text optimální.
Můžeme se také podivat, jakou střední délku kódu získáme, pokud pro druhý text, jestli použijeme Huffmanův algoritmus.
Vidíme, že se střední délka kódu zmenšila, což může opět potvrdit, že předchozí kód C nebyl pro druhý text optimální.