aitech-moj-2023/cw/03_Entropia.ipynb

12 KiB

Logo 1

Ekstrakcja informacji

3. Entropia [ćwiczenia]

Jakub Pokrywka (2022)

Logo 2

!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 skompresowany + 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 skompresowany + 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 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