moj-2024/lab/03_Entropia.ipynb

12 KiB

Modelowanie języka

3. Entropia [ćwiczenia]

!pip install dahuffman
Defaulting to user installation because normal site-packages is not writeable
Collecting dahuffman
  Downloading dahuffman-0.4.1-py2.py3-none-any.whl (18 kB)
Installing collected packages: dahuffman
Successfully installed dahuffman-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
  • zakodowany tekst zapisz do pliku binarnego, zapisz również tablicę kodową
  • porównaj wielkość pliku tekstowego, skompresowanego pliku tekstowego (zip, ...) oraz pliku skompresowanego kodem Hufmmana (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 skompresowany (Huffman + 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 potraktuj 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 Huffmann 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 (Huffman + 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