Fix 02
This commit is contained in:
parent
f85fbdbad8
commit
59edef32fa
@ -2,7 +2,7 @@
|
||||
|
||||
Jakim rozkładom statystycznym podlegają języki?
|
||||
|
||||
** Język naturalny albo „Pan Tedeusz” w liczbach
|
||||
** Język naturalny albo „Pan Tadeusz” w liczbach
|
||||
|
||||
Przygotujmy najpierw „infrastrukturę” do /segmentacji/ tekstu na różnego rodzaju jednostki.
|
||||
Używać będziemy generatorów.
|
||||
@ -58,7 +58,7 @@ Powrót pani
|
||||
Counter({' ': 63444, 'a': 30979, 'i': 29353, 'e': 25343, 'o': 23050, 'z': 22741, 'n': 15505, 'r': 15328, 's': 15255, 'w': 14625, 'c': 14153, 'y': 13732, 'k': 12362, 'd': 11465, '\r': 10851, '\n': 10851, 't': 10757, 'm': 10269, 'ł': 10059, ',': 9130, 'p': 8031, 'u': 7699, 'l': 6677, 'j': 6586, 'b': 5753, 'ę': 5534, 'ą': 4794, 'g': 4775, 'h': 3915, 'ż': 3334, 'ó': 3097, 'ś': 2524, '.': 2380, 'ć': 1956, ';': 1445, 'P': 1265, 'W': 1258, ':': 1152, '!': 1083, 'S': 1045, 'T': 971, 'I': 795, 'N': 793, 'Z': 785, 'J': 729, '—': 720, 'A': 698, 'K': 683, 'ń': 651, 'M': 585, 'B': 567, 'O': 567, 'C': 556, 'D': 552, '«': 540, '»': 538, 'R': 489, '?': 441, 'ź': 414, 'f': 386, 'G': 358, 'L': 316, 'H': 309, 'Ż': 219, 'U': 184, '…': 157, '*': 150, '(': 76, ')': 76, 'Ś': 71, 'F': 47, 'é': 43, '-': 33, 'Ł': 24, 'E': 23, '/': 19, 'Ó': 13, '8': 10, '9': 8, '2': 6, 'v': 5, 'Ź': 4, '1': 4, '3': 3, 'x': 3, 'V': 3, '7': 2, '4': 2, '5': 2, 'q': 2, 'æ': 2, 'à': 1, 'Ć': 1, '6': 1, '0': 1})
|
||||
:end:
|
||||
|
||||
Napiszmy pomocniczą funkcję, która zwraca /listę frekwencyjną/.
|
||||
Napiszmy pomocniczą funkcję, która zwraca *listę frekwencyjną*.
|
||||
|
||||
#+RESULTS:
|
||||
:results:
|
||||
@ -96,6 +96,8 @@ OrderedDict([(' ', 63444), ('a', 30979), ('i', 29353), ('e', 25343), ('o', 23050
|
||||
freq = freq_list(g, top)
|
||||
|
||||
plt.figure(figsize=(12, 3))
|
||||
plt.ylabel('liczba wystąpień')
|
||||
|
||||
plt.bar(freq.keys(), freq.values())
|
||||
|
||||
fname = f'{name}.png'
|
||||
@ -108,11 +110,11 @@ OrderedDict([(' ', 63444), ('a', 30979), ('i', 29353), ('e', 25343), ('o', 23050
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS:
|
||||
[[file:pt-chars.png]]
|
||||
[[file:]]
|
||||
|
||||
*** Słowa
|
||||
|
||||
Co rozumiemy pod pojęciem słowa czy wyrazu, nie jest oczywiste. W praktyce zależy to od wyboru /tokenizatora/.
|
||||
Co rozumiemy pod pojęciem słowa czy wyrazu, nie jest oczywiste. W praktyce zależy to od wyboru *tokenizatora*.
|
||||
|
||||
Załóżmy, że przez wyraz rozumieć będziemy nieprzerwany ciąg liter bądź cyfr (oraz gwiazdek
|
||||
— to za chwilę ułatwi nam analizę pewnego tekstu…).
|
||||
@ -198,7 +200,7 @@ najpierw tylko do współrzędnej y.
|
||||
|
||||
Z poprzedniego wykresu możemy odczytać, że ok. 2/3 wyrazów wystąpiło
|
||||
dokładnie 1 raz. Słowa występujące jeden raz w danym korpusie noszą
|
||||
nazwę /hapax legomena/ (w liczbie pojedycznej /hapax legomenon/, ἅπαξ
|
||||
nazwę /hapax legomena/ (w liczbie pojedynczej /hapax legomenon/, ἅπαξ
|
||||
λεγόμενον, „raz powiedziane”, żargonowo: „hapaks”).
|
||||
|
||||
„Prawdziwe” hapax legomena, słowa, które wystąpiły tylko raz w /całym/
|
||||
@ -274,15 +276,16 @@ rozmiarze $n$.
|
||||
|
||||
Na przykład /digramy/ (/bigramy/) to zbitki dwóch jednostek, np. liter albo wyrazów.
|
||||
|
||||
|$n$| | nazwa |
|
||||
|---+---------+---------------+
|
||||
|$n$| $n$-gram| nazwa |
|
||||
|---+---------+---------------|
|
||||
| 1 | 1-gram | unigram |
|
||||
| 2 | 2-gram | digram/bigram |
|
||||
| 3 | 3-gram | trigram |
|
||||
| 4 | 4-gram | tetragram |
|
||||
| 5 | 5-gram | pentagram |
|
||||
|
||||
**Pytanie** Jak nazywa się 6-gram?
|
||||
|
||||
*Pytanie:* Jak nazywa się 6-gram?
|
||||
|
||||
Jak widać, dla symetrii mówimy czasami o unigramach, jeśli operujemy
|
||||
po prostu na jednostkach, nie na ich podciągach.
|
||||
@ -310,7 +313,7 @@ Statystyki, które policzyliśmy dla pojedynczych liter czy wyrazów możemy pow
|
||||
|
||||
Zauważmy, że policzyliśmy wszystkie n-gramy, również częściowo pokrywające się.
|
||||
|
||||
Zawsze powinniśmy się upewnić, że jest jasne, czy chodzi o n-gramy znakowe czy wyrazowe
|
||||
Zawsze powinniśmy się upewnić, czy jest jasne, czy chodzi o n-gramy znakowe czy wyrazowe
|
||||
|
||||
*** 3-gramy znakowe
|
||||
|
||||
@ -341,7 +344,7 @@ jedną z największych zagadek historii (i lingwistyki).
|
||||
Sami zbadajmy statystyczne własności tekstu manuskryptu. Użyjmy
|
||||
transkrypcji Vnow, gdzie poszczególne znaki tajemniczego alfabetu
|
||||
zamienione na litery alfabetu łacińskiego, cyfry i gwiazdkę. Jak
|
||||
transkrybować Manuskrypt, pozostaje sprawą dyskusyjną, natomiast wybór
|
||||
transkrybować manuskrypt, pozostaje sprawą dyskusyjną, natomiast wybór
|
||||
takiego czy innego systemu transkrypcji nie powinien wpływać
|
||||
dramatycznie na analizę statystyczną.
|
||||
|
||||
@ -495,7 +498,7 @@ trypletu STOP (_ powyżej). Taka sekwencja to /gen/.
|
||||
|
||||
*Entropia* ($E$) to miara nieuporządkowania, niepewności, niewiedzy. Im
|
||||
większa entropia, tym mniej wiemy. Pojęcie to pierwotnie wywodzi się z
|
||||
termodynamiki, później znaleziono wiele zaskakujących zastosowań w
|
||||
termodynamiki, później znaleziono wiele zaskakujących analogii i zastosowań w
|
||||
innych dyscyplinach nauki.
|
||||
|
||||
*** Entropia w fizyce
|
||||
@ -511,7 +514,7 @@ a uporządkowanie się zmniejszy.
|
||||
|
||||
[[./02_Jezyki/gas-high-entropy.drawio.png]]
|
||||
|
||||
Innymi słowy, zwiększy się stopień uporządkowania układu, czyli właśnie entropia.
|
||||
Innymi słowy, zwiększy się stopień nieuporządkowania układu, czyli właśnie entropia.
|
||||
|
||||
*** II prawo termodynamiki
|
||||
|
||||
@ -539,6 +542,8 @@ losowania do odbiorcy $O$ używając zer i jedynek (bitów).
|
||||
Teorioinformacyjną entropię można zdefiniować jako średnią liczbę
|
||||
bitów wymaganych do przesłania komunikatu.
|
||||
|
||||
[[./02_Jezyki/communication.drawio.png]]
|
||||
|
||||
*** Obliczanie entropii — proste przykłady
|
||||
|
||||
Załóżmy, że nadawca chce przekazać odbiorcy informację o wyniku rzutu monetą.
|
||||
@ -546,13 +551,12 @@ Entropia wynosi wówczas rzecz jasna 1 — na jedno losowanie wystarczy jeden bi
|
||||
(informację o tym, że wypadł orzeł, możemy zakodować na przykład za pomocą zera,
|
||||
zaś to, że wypadła reszka — za pomocą jedynki).
|
||||
|
||||
Rozpatrzmy przypadek, gdy nadawca ośmiościenną kością. Aby przekazać
|
||||
Rozpatrzmy przypadek, gdy nadawca rzuca ośmiościenną kością. Aby przekazać
|
||||
wynik, potrzebuje wówczas 3 bity (a więc entropia ośmiościennej kości
|
||||
wynosi 3 bity). Przykładowe kodowanie może mieć następującą postać.
|
||||
wynosi 3 bity). Przykładowe kodowanie może mieć następującą postać:
|
||||
|
||||
+-------+-----------+
|
||||
| Wynik | Kodowanie |
|
||||
+-------+-----------+
|
||||
|-------+-----------|
|
||||
| 1 | 001 |
|
||||
| 2 | 010 |
|
||||
| 3 | 011 |
|
||||
@ -561,38 +565,34 @@ wynosi 3 bity). Przykładowe kodowanie może mieć następującą postać.
|
||||
| 6 | 110 |
|
||||
| 7 | 111 |
|
||||
| 8 | 000 |
|
||||
+-------+-----------+
|
||||
|
||||
*** Obliczenie entropii — trudniejszy przykład
|
||||
|
||||
Załóżmy, że $\Sigma = \{A, B, C, D\}$, natomiast poszczególne komunikaty
|
||||
są losowane zgodnie z następujących rozkładem prawdopodobieństwa:
|
||||
są losowane zgodnie z następującym rozkładem prawdopodobieństwa:
|
||||
$P(A)=1/2$, $P(B)=1/4$, $P(C)=1/8$, $P(D)=1/8$. Ile wynosi entropia w
|
||||
takim przypadku? Można by sądzić, że 2, skoro wystarczą 2 bity do
|
||||
przekazania wyniku losowania przy zastosowaniu następującego kodowania:
|
||||
|
||||
+-------+-----------+
|
||||
| Wynik | Kodowanie |
|
||||
+-------+-----------+
|
||||
|-------+-----------|
|
||||
| A | 00 |
|
||||
| B | 01 |
|
||||
| C | 10 |
|
||||
| D | 11 |
|
||||
+-------+-----------+
|
||||
|
||||
Problem w tym, że w rzeczywistości nie jest to /optymalne/ kodowanie.
|
||||
Możemy sprytnie zmniejszyć średnią liczbę bitów wymaganych do
|
||||
przekazania losowego wyniku przypisując częstszym wynikom krótsze
|
||||
kody, rzadszym zaś — dłuższe. Oto takie optymalne kodowanie:
|
||||
|
||||
+-------+-----------+
|
||||
| Wynik | Kodowanie |
|
||||
+-------+-----------+
|
||||
|-------+-----------|
|
||||
| A | 0 |
|
||||
| B | 10 |
|
||||
| C | 110 |
|
||||
| D | 111 |
|
||||
+-------+-----------+
|
||||
|
||||
|
||||
Używając takiego kodowanie średnio potrzebujemy:
|
||||
|
||||
@ -604,14 +604,12 @@ bita. Innymi słowy, entropia takiego źródła wynosi 1,75 bita.
|
||||
|
||||
Można by sądzić, że da się stworzyć jeszcze krótsze kodowanie dla omawianego rozkładu nierównomiernego:
|
||||
|
||||
+-------+-----------+
|
||||
| Wynik | Kodowanie |
|
||||
+-------+-----------+
|
||||
|-------+-----------|
|
||||
| A | 0 |
|
||||
| B | 1 |
|
||||
| C | 01 |
|
||||
| D | 11 |
|
||||
+-------+-----------+
|
||||
|
||||
Niestety, nie jest to właściwe rozwiązanie — kodowanie musi być
|
||||
jednoznaczne nie tylko dla pojedynczego komunikatu, lecz dla całej sekwencji.
|
||||
@ -626,7 +624,7 @@ Na podstawie poprzedniego przykładu można dojść do intuicyjnego wniosku, że
|
||||
optymalny kod dla wyniku o prawdopodobieństwie $p$ ma długość $-\log_2(p)$, a zatem ogólnie
|
||||
entropia źródła o rozkładzie prawdopodobieństwa $\{p_1,\ldots,p_|\Sigma|\}$ wynosi:
|
||||
|
||||
$$E = -\Sum_{i=1}^{|\Sigma|} p_i\log_2(p_i)$$.
|
||||
$$E = -\sum_{i=1}^{|\Sigma|} p_i\log_2(p_i)$$.
|
||||
|
||||
Zauważmy, że jest to jeden z nielicznych przypadków, gdy w nauce naturalną
|
||||
podstawą logarytmu jest 2 zamiast… podstawy logarytmu naturalnego ($e$).
|
||||
@ -636,7 +634,7 @@ Teoretycznie można mierzyć entropię używając logarytmu naturalnego
|
||||
niewiele to jednak zmienia i jest mniej poręczne i trudniejsze do interpretacji
|
||||
(przynajmniej w kontekście informatyki) niż operowanie na bitach.
|
||||
|
||||
**Pytanie** Ile wynosi entropia sześciennej kostki? Jak wygląda
|
||||
**Pytanie** Ile wynosi entropia zwykłej sześciennej kostki? Jak wygląda
|
||||
optymalne kodowanie wyników rzutu taką kostką?
|
||||
|
||||
*** Entropia dla próby Bernoulliego
|
||||
@ -654,6 +652,8 @@ Wiemy już, że entropia dla rzutu monetą wynosi 1 bit. A jaki będzie wynik dl
|
||||
x = list(np.arange(0.001,1,0.001))
|
||||
y = [binomial_entropy(x) for x in x]
|
||||
plt.figure().clear()
|
||||
plt.xlabel('prawdopodobieństwo wylosowania orła')
|
||||
plt.ylabel('entropia')
|
||||
plt.plot(x, y)
|
||||
|
||||
fname = f'binomial-entropy.png'
|
||||
@ -711,7 +711,7 @@ by policzyć liczbę wszystkich znaków…
|
||||
Przypomnijmy sobie jednak, że rozkład jednostek języka jest zawsze
|
||||
skrajnie nierównomierny! Jeśli uwzględnić ten nierównomierny rozkład
|
||||
znaków, można opracować o wiele efektywniejszy sposób zakodowania znaków składających się na „Pana Tadeusza”
|
||||
(częste litery, np. „a” i „e” powinny mieć krótkie kody, a rzadkie, np. „ź” — dłuższe kody).
|
||||
(częste litery, np. „a” i „e” powinny mieć krótkie kody, a rzadkie, np. „ź” — dłuższe).
|
||||
|
||||
Policzmy entropię przy takim założeniu:
|
||||
|
||||
@ -733,6 +733,8 @@ Policzmy entropię przy takim założeniu:
|
||||
4.938605272823633
|
||||
:end:
|
||||
|
||||
(Jak dowiemy się na kolejnym wykładzie, zastosowaliśmy tutaj *unigramowy model języka*).
|
||||
|
||||
*** Ile wynosi entropia rękopisu Wojnicza?
|
||||
|
||||
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||
@ -753,15 +755,16 @@ generowany przecież według rozkładu wielomianowego. Istnieją rzecz
|
||||
jasna pewne zależności między znakami, np. niemożliwe, żeby po „ń”
|
||||
wystąpiły litera „a” czy „e”. Na poziomie wyrazów zależności mogę mieć
|
||||
jeszcze bardziej skrajny charakter, np. po wyrazie „przede” prawie na
|
||||
pewno wystąpi „wszystkim”, co oznacza w takiej sytuacji słowo
|
||||
pewno wystąpi „wszystkim”, co oznacza, że w takiej sytuacji słowo
|
||||
„wszystkim” może zostać zakodowane za pomocą 0 (!) bitów.
|
||||
|
||||
Można uwzględnić takie zależności i uzyskać jeszcze lepsze kodowanie,
|
||||
a co za tym idzie lepsze oszacowanie entropii.
|
||||
a co za tym idzie lepsze oszacowanie entropii. (Jak wkrótce się
|
||||
dowiemy, oznacza to użycie digramowego, trigramowego, etc. modelu języka).
|
||||
|
||||
*** Rozmiar skompresowanego pliku jako przybliżenie entropii
|
||||
|
||||
Cele algorytmów kompresji jest właściwie wyznaczanie efektywnych
|
||||
Celem algorytmów kompresji jest właściwie wyznaczanie efektywnych
|
||||
sposobów kodowania danych. Możemy więc użyć rozmiaru skompresowanego pliku w bitach
|
||||
(po podzieleniu przez oryginalną długość) jako dobrego przybliżenia entropii.
|
||||
|
||||
|
1
wyk/02_Jezyki/communication.drawio
Normal file
1
wyk/02_Jezyki/communication.drawio
Normal file
@ -0,0 +1 @@
|
||||
<mxfile host="app.diagrams.net" modified="2022-03-05T13:05:15.969Z" agent="5.0 (X11)" etag="T1jv8GjlxjBRy82UXK3g" version="16.2.2" type="device"><diagram id="E-zPRpFz5prVeiZgI5WF" name="Page-1">1VbbcpswEP0aHpMxEGznMbFzmTZtPc1Dk0cZrUGJ0LpC2JCvrwTC3OzcO9P6waM9klbsObtaOf4sya8kWcffkAJ3vBHNHX/ueN7piav/DVBUQOAFFRBJRivIbYBb9gQWHFk0YxTSzkKFyBVbd8EQhYBQdTAiJW67y1bIu6euSQQD4DYkfIj+YlTFFTr1Jg1+DSyK65Pd8Wk1k5B6sY0kjQnFbQvyLxx/JhFVNUryGXDDXc1Lte/ywOzuwyQI9ZoNX6X3O78fXS/phv3kIss2X7wj62VDeGYD/k4o2YbEfrMqaiL056/NMEv4WahQOv75BqRimqobsgS+wJQphkIvWaJSmLQWnHEWmQmFa43GKuHacPUQM8WZgNlOvJEG7SfpvZAfjNXdMagzDzABJQu9xG7wTizpRc/eNhr6Fopb8o0tRmzWRDvPDbF6YLl9A88nA55/0CVD+b8THfj/GNHBgOiDBK845GfmitBUgKB2OA85SVMWdvmTmAkKtEMc0MHV8SJtLVqCPbTUmAROFNt03e/jyp6wQKYPbtJ/2lNl0qM7xUyGYHe174yeo8B7wZEiMgI1cFRKtwv7/WqOB2o+EkGcWeBMDf6ISSbYIwkf2EBlo05ZL10hia2QUCsFck/pJIxS4+NcQsqeyLL0Z0RfmyDLsINzJ5g/Vz+2GdnNTQtoJ8jh7D1YbEejY7dun+/NkHoJrlYp/BXNpnuluLUmShVjhILwiwbtlVez5gbNRVYK9wBKFfZ9QDKFXVkhZ+rObD8OrHXfmpnn1nNpFLUhdKB3beO+9OD3fvVs46W0Om4WIJkmzmTUm24IzVNZis/waV8aVaW91MqHufPqRPnQtTsZFOoVCJDE9C8dY5EskQ9r9ON9rb7LdTov9FPM9reyaXZzKq0yp8qPT2h8bu+F4U6GjW/8OY1Pm80rsarS5qntX/wB</diagram></mxfile>
|
BIN
wyk/02_Jezyki/communication.drawio.png
Normal file
BIN
wyk/02_Jezyki/communication.drawio.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
Loading…
Reference in New Issue
Block a user