moj-2024/lab/03_Entropia.ipynb
Paweł Skórzewski b108941612 Daty
2024-05-15 11:44:56 +02:00

525 lines
12 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Modelowanie języka laboratoria\n",
"### 20 marca 2024\n",
"# 3. Entropia"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Defaulting to user installation because normal site-packages is not writeable\n",
"Collecting dahuffman\n",
" Downloading dahuffman-0.4.1-py2.py3-none-any.whl (18 kB)\n",
"Installing collected packages: dahuffman\n",
"Successfully installed dahuffman-0.4.1\n"
]
}
],
"source": [
"!pip install dahuffman"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"from collections import Counter\n",
"from dahuffman import HuffmanCodec"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"NR_INDEKSU = 375985"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wprowadzenie"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"tekst = 'Ala ma kota. Jarek ma psa'"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"codec = HuffmanCodec.from_data(tekst)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Counter({'A': 1,\n",
" 'l': 1,\n",
" 'a': 6,\n",
" ' ': 5,\n",
" 'm': 2,\n",
" 'k': 2,\n",
" 'o': 1,\n",
" 't': 1,\n",
" '.': 1,\n",
" 'J': 1,\n",
" 'r': 1,\n",
" 'e': 1,\n",
" 'p': 1,\n",
" 's': 1})"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Counter(tekst)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bits Code Value Symbol\n",
" 2 00 0 ' '\n",
" 2 01 1 'a'\n",
" 4 1000 8 't'\n",
" 5 10010 18 _EOF\n",
" 5 10011 19 '.'\n",
" 5 10100 20 'A'\n",
" 5 10101 21 'J'\n",
" 5 10110 22 'e'\n",
" 5 10111 23 'l'\n",
" 4 1100 12 'k'\n",
" 4 1101 13 'm'\n",
" 5 11100 28 'o'\n",
" 5 11101 29 'p'\n",
" 5 11110 30 'r'\n",
" 5 11111 31 's'\n"
]
}
],
"source": [
"codec.print_code_table()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{' ': (2, 0),\n",
" 'a': (2, 1),\n",
" 't': (4, 8),\n",
" _EOF: (5, 18),\n",
" '.': (5, 19),\n",
" 'A': (5, 20),\n",
" 'J': (5, 21),\n",
" 'e': (5, 22),\n",
" 'l': (5, 23),\n",
" 'k': (4, 12),\n",
" 'm': (4, 13),\n",
" 'o': (5, 28),\n",
" 'p': (5, 29),\n",
" 'r': (5, 30),\n",
" 's': (5, 31)}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codec.get_code_table()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"encoded = codec.encode(tekst)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1010010111010011010100110011100100001100110010101011111010110110000110101001110111111011'"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"{:08b}\".format(int(encoded.hex(),16))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A l a"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"101001 10111 01"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Ala ma kota. Jarek ma psa'"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codec.decode(encoded)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"25"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(tekst)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"11"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(encoded)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie 1 (15 punktów)\n",
"\n",
"Weź teksty:\n",
"- z poprzednich zajęć (lub dowolny inny) w języku naturalnym i obetnij do długości 100_000 znaków\n",
"- wygenerowany losowo zgodnie z rozkładem jednostajnym dyskretnym z klasy [a-zA-Z0-9 ] o długości 100_000 znaków\n",
"- 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\n",
"- wygenerowany losowo zgodnie z rozkładem jednostajnym dwupunktowym p=0.5 z klasy [01] o długości 100_000 znaków\n",
"- wygenerowany losowo zgodnie z rozkładem jednostajnym dwupunktowym p=0.9 z klasy [01] o długości 100_000 znaków\n",
"\n",
"Następnie dla każdego z tekstów trakując je po znakach:\n",
"- skompresuj plik za pomocą dowolnego progrmu (zip, tar lub inny)\n",
"- policz entropię\n",
"- wytrenuj kodek Huffmana i zakoduj cały tekst\n",
"- zakodowany tekst zapisz do pliku binarnego, zapisz również tablicę kodową\n",
"- porównaj wielkość pliku tekstowego, skompresowanego pliku tekstowego (zip, ...) oraz pliku skompresowanego kodem Hufmmana (wraz z kodekiem)\n",
"\n",
"Uzupełnij poniższe tabelki oraz wnioski (conajmniej 5 zdań).\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### START ZADANIA"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Entropia\n",
" \n",
"| | Entropia |\n",
"| ----------- | ----------- |\n",
"| tekst w jęz. naturalnym | |\n",
"| losowy tekst (jednostajny) | |\n",
"| losowy tekst (geometryczny)| |\n",
"| losowy tekst (dwupunktowy 0.5) | |\n",
"| losowy tekst (dwupunktowy 0.9) | |\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wielkości w bitach:\n",
" \n",
"| | Plik nieskompresowany | Plik skompresowany (zip, tar,.. ) | Plik skompresowany (Huffman + tablica kodowa) |\n",
"| ----------- | ----------- |-----------|----------- |\n",
"| tekst w jęz. naturalnym | | | |\n",
"| losowy tekst (jednostajny) | | | |\n",
"| losowy tekst (geometryczny)| | | |\n",
"| losowy tekst (dwupunktowy 0.5)| | | |\n",
"| losowy tekst (dwupunktowy 0.9)| | | |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Wnioski:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### KONIEC ZADANIA"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie 2 (10 punktów)\n",
"\n",
"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.\n",
" \n",
"Do wniosków dopisz koniecznie porównanie między kodowaniem Huffmann znaków i słów.\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### START ZADANIA"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Entropia\n",
" \n",
"| | Entropia |\n",
"| ----------- | ----------- |\n",
"| tekst w jęz. naturalnym | |\n",
"| losowy tekst (dyskretny) | |\n",
"| losowy tekst (geometryczny)| |\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wielkości w bitach:\n",
" \n",
"| | Plik nieskompresowany | Plik skompresowany (Huffman + tablica kodowa) |\n",
"| ----------- | ----------- |----------- |\n",
"| tekst w jęz. naturalnym | | |\n",
"| losowy tekst (jednostajny) | | |\n",
"| losowy tekst (geometryczny)| | |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Wnioski:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### KONIEC ZADANIA"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie 3 (20 punktów)\n",
"\n",
"Stwórz ręcznie drzewo Huffmana (zrób rysunki na kartce i załącz je jako obrazek) oraz zakoduj poniższy tekst "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"random.seed(123)\n",
"\n",
"tekst = list('abcdefghijklmnoprst')\n",
"\n",
"random.shuffle(tekst)\n",
"\n",
"tekst = tekst[: 5 + random.randint(1,5)]\n",
"\n",
"tekst = [a*random.randint(1,4) for a in tekst]\n",
"\n",
"tekst = [item for sublist in tekst for item in sublist]\n",
"\n",
"''.join(tekst)\n",
"\n",
"random.shuffle(tekst)\n",
"\n",
"tekst = ''.join(tekst)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'ldddmpprphhopd'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tekst"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Start zadania"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Koniec zadania"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## WYKONANIE ZADAŃ\n",
"Zgodnie z instrukcją 01_Kodowanie_tekstu.ipynb"
]
}
],
"metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
},
"subtitle": "0.Informacje na temat przedmiotu[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}