12 KiB
12 KiB
Ekstrakcja informacji
3. Entropia [ćwiczenia]
Jakub Pokrywka (2022)
!pip install dahuffman
Requirement already satisfied: dahuffman in /home/kuba/anaconda3/lib/python3.8/site-packages (0.4.1)
import random
from collections import Counter
from dahuffman import HuffmanCodec
NR_INDEKSU = 375985
Wprowadzenie
tekst = 'Ala ma kota. Jarek ma psa'
codec = HuffmanCodec.from_data(tekst)
Counter(tekst)
Counter({'A': 1, 'l': 1, 'a': 6, ' ': 5, 'm': 2, 'k': 2, 'o': 1, 't': 1, '.': 1, 'J': 1, 'r': 1, 'e': 1, 'p': 1, 's': 1})
codec.print_code_table()
Bits Code Value Symbol 2 00 0 ' ' 2 01 1 'a' 4 1000 8 't' 5 10010 18 _EOF 5 10011 19 '.' 5 10100 20 'A' 5 10101 21 'J' 5 10110 22 'e' 5 10111 23 'l' 4 1100 12 'k' 4 1101 13 'm' 5 11100 28 'o' 5 11101 29 'p' 5 11110 30 'r' 5 11111 31 's'
codec.get_code_table()
{' ': (2, 0), 'a': (2, 1), 't': (4, 8), _EOF: (5, 18), '.': (5, 19), 'A': (5, 20), 'J': (5, 21), 'e': (5, 22), 'l': (5, 23), 'k': (4, 12), 'm': (4, 13), 'o': (5, 28), 'p': (5, 29), 'r': (5, 30), 's': (5, 31)}
encoded = codec.encode(tekst)
"{:08b}".format(int(encoded.hex(),16))
'1010010111010011010100110011100100001100110010101011111010110110000110101001110111111011'
A l a
101001 10111 01
codec.decode(encoded)
'Ala ma kota. Jarek ma psa'
len(tekst)
25
len(encoded)
11
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 | |
losowy tekst (jednostajny) | |
losowy tekst (geometryczny) | |
losowy tekst (dwupunktowy 0.5) | |
losowy tekst (dwupunktowy 0.9) |
Wielkości w bitach:
Plik nieskompresowany | Plik skompresowany (zip, tar,.. ) | Plik zakodowany + tablica kodowa | |
---|---|---|---|
tekst w jęz. naturalnym | |||
losowy tekst (jednostajny) | |||
losowy tekst (geometryczny) | |||
losowy tekst (dwupunktowy 0.5) | |||
losowy tekst (dwupunktowy 0.9) |
Wnioski:
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 | |
losowy tekst (dyskretny) | |
losowy tekst (geometryczny) |
Wielkości w bitach:
Plik nieskompresowany | Plik skompresowany (zip, tar,.. ) | Plik zakodowany + tablica kodowa | |
---|---|---|---|
tekst w jęz. naturalnym | |||
losowy tekst (jednostajny) | |||
losowy tekst (geometryczny) |
Wnioski:
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(123)
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
'ldddmpprphhopd'
Start zadania
Koniec zadania
WYKONANIE ZADAŃ
Zgodnie z instrukcją 01_Kodowanie_tekstu.ipynb