9.5 KiB
9.5 KiB
Modelowanie Języka
3. Entropia [ćwiczenia]
Jakub Pokrywka (2022)
Zadanie 1 ( 15 punktów)
Weź teksty:
- z poprzednich zajęć (lub dowolny inny) w języku naturalnym i obetnij do długości 100_000 znaków
- wygenerowany losowo zgodnie z rozkładem jednostajnym dyskretnym z klasy [a-zA-Z0-9 ] o długości 100_000 znaków
- wygenerowany losowo zgodnie z rozkładem geometrycznym (wybierz p między 0.2 a 0.8) z klasy [a-zA-Z0-9 ] o długości 100_000 znaków
- wygenerowany losowo zgodnie z rozkładem jednostajnym dwupunktowym p=0.5 z klasy [01] o długości 100_000 znaków
- wygenerowany losowo zgodnie z rozkładem jednostajnym dwupunktowym p=0.9 z klasy [01] o długości 100_000 znaków
Następnie dla każdego z tekstów trakując je po znakach:
- skompresuj plik za pomocą dowolnego progrmu (zip, tar lub inny)
- policz entropię
- wytrenuj kodek huffmana i zakoduj cały tekst
- zdekoduj pierwsze 3 znaki (jako zera i jedynki) wypisz je (z oddzieleniem na znaki)
- zakodowany tekst zapisz do pliku binarnego, zapisz również tablicę kodową
- porównaj wielkość pliku tekstowego, skompresowanego pliku tekstowego (zip, ...) oraz pliku skompresowanego hofmmanem (wraz z kodekiem)
Uzupełnij poniższe tabelki oraz wnioski (conajmniej 5 zdań).
START ZADANIA
Entropia
Entropia | |
---|---|
tekst w jęz. naturalnym | 4.490477053022786 |
losowy tekst (jednostajny) | 5.976797776033915 |
losowy tekst (geometryczny) | 2.9384661505927614 |
losowy tekst (dwupunktowy 0.5) | 0.9999992786523595 |
losowy tekst (dwupunktowy 0.9) | 0.4672814931728006 |
Wielkości w bitach:
Plik nieskompresowany | Plik skompresowany (zip, tar,.. ) | Plik skompresowany + tablica kodowa) | |
---|---|---|---|
tekst w jęz. naturalnym | 100766 *8 | 36084 *8 | (56413 + 1131) *8 |
losowy tekst (jednostajny) | 100000 *8 | 76560 *8 | (74976 + 790) *8 |
losowy tekst (geometryczny) | 100000 *8 | 38744 *8 | (36964 + 491) *8 |
losowy tekst (dwupunktowy 0.5) | 100000 *8 | 14292 *8 | (18740 + 180) *8 |
losowy tekst (dwupunktowy 0.9) | 100000 *8 | 7764 *8 | (13750 + 180) *8 |
Wnioski:
- W tekście w języku naturalnym wystąpiły znaki o ponad przeciętnej długosci bitowej
- W tekście w języku naturalnym skompresowanie narzędziem
xz
bardziej się opłaciło - Korpusy z mniejszą entropią jest łatwiej kompresować.
- Losowy tekst (jednostajny) ma większą entropię niż tekst w języku naturalnym
- Czym większy alfabet tym większa tablica kodowa
KONIEC ZADANIA
Zadanie 2 (10 punktów)
Powtórz kroki z zadania 1, tylko potraktuje wiadomości jako słowa (oddzielone spacją). Jeżeli występują więcej niż jedna spacja równocześnie- usuń je.
Do wniosków dopisz koniecznie porównanie między kodowaniem hoffmana znaków i słów.
START ZADANIA
Entropia
Entropia | |
---|---|
tekst w jęz. naturalnym | 10.188508379298268 |
losowy tekst (dyskretny) | 10.629740889027198 |
losowy tekst (geometryczny) | 0 |
Wielkości w bitach:
Plik nieskompresowany | Plik skompresowany (zip, tar,.. ) | Plik skompresowany + tablica kodowa) | |
---|---|---|---|
tekst w jęz. naturalnym | 100766 *8 | 36084 *8 | (20495 + 91497) *8 |
losowy tekst (jednostajny) | 100000 *8 | 76560 *8 | (2130 + 114214) *8 |
losowy tekst (geometryczny) | 100000 *8 | 38744 *8 | (1 + 100164) *8 |
losowy tekst (dwupunktowy 0.5) | 100000 *8 | 14292 *8 | (1 + 100164) *8 |
losowy tekst (dwupunktowy 0.9) | 100000 *8 | 7764 *8 | (1 + 100164) *8 |
Wnioski:
- korpusy bez spacji mają tylko jeden bajt
- Korpusy bez spacji mają większą tablice kodową niż nieskompresowany plik
- Kompresowanie huffmanem na słowach dla plików z jednym wyrazem nie ma sesnu
- Kompresowanie na wyrazach wydaję się być gorsze niż na znakach z powodu ogromnej tablicy kodowej
- W jęzuku naturalbym częściej występują te same wyrazy niż w losowym tekście (jednostajnym)
KONIEC ZADANIA
Zadanie 3 (20 punktów)
stwórz ręcznie drzewo Huffmana (zrób rysunki na kartce i załącz je jako obrazek) oraz zakoduj poniższy tekst
random.seed(444463) # <- Mój numer indeksu
tekst = list('abcdefghijklmnoprst')
random.shuffle(tekst)
tekst = tekst[: 5 + random.randint(1,5)]
tekst = [a*random.randint(1,4) for a in tekst]
tekst = [item for sublist in tekst for item in sublist]
''.join(tekst)
random.shuffle(tekst)
tekst = ''.join(tekst)
tekst
'kkehsoaefokjsnodjoj'
len(list('abcdefghijklmnoprst'))
19
Counter('kkehsoaefokjsnodjoj')
Counter({'k': 3, 'e': 2, 'h': 1, 's': 2, 'o': 4, 'a': 1, 'f': 1, 'j': 3, 'n': 1, 'd': 1})
Start zadania
Koniec zadania
WYKONANIE ZADAŃ
Zgodnie z instrukcją 01_Kodowanie_tekstu.ipynb