This commit is contained in:
Filip Gralinski 2022-03-05 14:20:23 +01:00
parent f85fbdbad8
commit 59edef32fa
3 changed files with 37 additions and 33 deletions

View File

@ -2,7 +2,7 @@
Jakim rozkładom statystycznym podlegają języki? 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. Przygotujmy najpierw „infrastrukturę” do /segmentacji/ tekstu na różnego rodzaju jednostki.
Używać będziemy generatorów. 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}) 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: :end:
Napiszmy pomocniczą funkcję, która zwraca /listę frekwencyjną/. Napiszmy pomocniczą funkcję, która zwraca *listę frekwencyjną*.
#+RESULTS: #+RESULTS:
:results: :results:
@ -96,6 +96,8 @@ OrderedDict([(' ', 63444), ('a', 30979), ('i', 29353), ('e', 25343), ('o', 23050
freq = freq_list(g, top) freq = freq_list(g, top)
plt.figure(figsize=(12, 3)) plt.figure(figsize=(12, 3))
plt.ylabel('liczba wystąpień')
plt.bar(freq.keys(), freq.values()) plt.bar(freq.keys(), freq.values())
fname = f'{name}.png' fname = f'{name}.png'
@ -108,11 +110,11 @@ OrderedDict([(' ', 63444), ('a', 30979), ('i', 29353), ('e', 25343), ('o', 23050
#+END_SRC #+END_SRC
#+RESULTS: #+RESULTS:
[[file:pt-chars.png]] [[file:]]
*** Słowa *** 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 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…). — 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 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ą 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”). λεγόμενον, „raz powiedziane”, żargonowo: „hapaks”).
„Prawdziwe” hapax legomena, słowa, które wystąpiły tylko raz w /całym/ „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. 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 | | 1 | 1-gram | unigram |
| 2 | 2-gram | digram/bigram | | 2 | 2-gram | digram/bigram |
| 3 | 3-gram | trigram | | 3 | 3-gram | trigram |
| 4 | 4-gram | tetragram | | 4 | 4-gram | tetragram |
| 5 | 5-gram | pentagram | | 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 Jak widać, dla symetrii mówimy czasami o unigramach, jeśli operujemy
po prostu na jednostkach, nie na ich podciągach. 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ę. 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 *** 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 Sami zbadajmy statystyczne własności tekstu manuskryptu. Użyjmy
transkrypcji Vnow, gdzie poszczególne znaki tajemniczego alfabetu transkrypcji Vnow, gdzie poszczególne znaki tajemniczego alfabetu
zamienione na litery alfabetu łacińskiego, cyfry i gwiazdkę. Jak 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ć takiego czy innego systemu transkrypcji nie powinien wpływać
dramatycznie na analizę statystyczną. 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 *Entropia* ($E$) to miara nieuporządkowania, niepewności, niewiedzy. Im
większa entropia, tym mniej wiemy. Pojęcie to pierwotnie wywodzi się z 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. innych dyscyplinach nauki.
*** Entropia w fizyce *** Entropia w fizyce
@ -511,7 +514,7 @@ a uporządkowanie się zmniejszy.
[[./02_Jezyki/gas-high-entropy.drawio.png]] [[./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 *** 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ę Teorioinformacyjną entropię można zdefiniować jako średnią liczbę
bitów wymaganych do przesłania komunikatu. bitów wymaganych do przesłania komunikatu.
[[./02_Jezyki/communication.drawio.png]]
*** Obliczanie entropii — proste przykłady *** Obliczanie entropii — proste przykłady
Załóżmy, że nadawca chce przekazać odbiorcy informację o wyniku rzutu monetą. 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, (informację o tym, że wypadł orzeł, możemy zakodować na przykład za pomocą zera,
zaś to, że wypadła reszka — za pomocą jedynki). 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 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 | | Wynik | Kodowanie |
+-------+-----------+ |-------+-----------|
| 1 | 001 | | 1 | 001 |
| 2 | 010 | | 2 | 010 |
| 3 | 011 | | 3 | 011 |
@ -561,38 +565,34 @@ wynosi 3 bity). Przykładowe kodowanie może mieć następującą postać.
| 6 | 110 | | 6 | 110 |
| 7 | 111 | | 7 | 111 |
| 8 | 000 | | 8 | 000 |
+-------+-----------+
*** Obliczenie entropii — trudniejszy przykład *** Obliczenie entropii — trudniejszy przykład
Załóżmy, że $\Sigma = \{A, B, C, D\}$, natomiast poszczególne komunikaty 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 $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 takim przypadku? Można by sądzić, że 2, skoro wystarczą 2 bity do
przekazania wyniku losowania przy zastosowaniu następującego kodowania: przekazania wyniku losowania przy zastosowaniu następującego kodowania:
+-------+-----------+
| Wynik | Kodowanie | | Wynik | Kodowanie |
+-------+-----------+ |-------+-----------|
| A | 00 | | A | 00 |
| B | 01 | | B | 01 |
| C | 10 | | C | 10 |
| D | 11 | | D | 11 |
+-------+-----------+
Problem w tym, że w rzeczywistości nie jest to /optymalne/ kodowanie. Problem w tym, że w rzeczywistości nie jest to /optymalne/ kodowanie.
Możemy sprytnie zmniejszyć średnią liczbę bitów wymaganych do Możemy sprytnie zmniejszyć średnią liczbę bitów wymaganych do
przekazania losowego wyniku przypisując częstszym wynikom krótsze przekazania losowego wyniku przypisując częstszym wynikom krótsze
kody, rzadszym zaś — dłuższe. Oto takie optymalne kodowanie: kody, rzadszym zaś — dłuższe. Oto takie optymalne kodowanie:
+-------+-----------+
| Wynik | Kodowanie | | Wynik | Kodowanie |
+-------+-----------+ |-------+-----------|
| A | 0 | | A | 0 |
| B | 10 | | B | 10 |
| C | 110 | | C | 110 |
| D | 111 | | D | 111 |
+-------+-----------+
Używając takiego kodowanie średnio potrzebujemy: 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: Można by sądzić, że da się stworzyć jeszcze krótsze kodowanie dla omawianego rozkładu nierównomiernego:
+-------+-----------+
| Wynik | Kodowanie | | Wynik | Kodowanie |
+-------+-----------+ |-------+-----------|
| A | 0 | | A | 0 |
| B | 1 | | B | 1 |
| C | 01 | | C | 01 |
| D | 11 | | D | 11 |
+-------+-----------+
Niestety, nie jest to właściwe rozwiązanie — kodowanie musi być Niestety, nie jest to właściwe rozwiązanie — kodowanie musi być
jednoznaczne nie tylko dla pojedynczego komunikatu, lecz dla całej sekwencji. 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 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: 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ą Zauważmy, że jest to jeden z nielicznych przypadków, gdy w nauce naturalną
podstawą logarytmu jest 2 zamiast… podstawy logarytmu naturalnego ($e$). 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 niewiele to jednak zmienia i jest mniej poręczne i trudniejsze do interpretacji
(przynajmniej w kontekście informatyki) niż operowanie na bitach. (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ą? optymalne kodowanie wyników rzutu taką kostką?
*** Entropia dla próby Bernoulliego *** 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)) x = list(np.arange(0.001,1,0.001))
y = [binomial_entropy(x) for x in x] y = [binomial_entropy(x) for x in x]
plt.figure().clear() plt.figure().clear()
plt.xlabel('prawdopodobieństwo wylosowania orła')
plt.ylabel('entropia')
plt.plot(x, y) plt.plot(x, y)
fname = f'binomial-entropy.png' 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 Przypomnijmy sobie jednak, że rozkład jednostek języka jest zawsze
skrajnie nierównomierny! Jeśli uwzględnić ten nierównomierny rozkład 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” 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: Policzmy entropię przy takim założeniu:
@ -733,6 +733,8 @@ Policzmy entropię przy takim założeniu:
4.938605272823633 4.938605272823633
:end: :end:
(Jak dowiemy się na kolejnym wykładzie, zastosowaliśmy tutaj *unigramowy model języka*).
*** Ile wynosi entropia rękopisu Wojnicza? *** Ile wynosi entropia rękopisu Wojnicza?
#+BEGIN_SRC python :session mysession :exports both :results raw drawer #+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 „ń” 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ć 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 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. „wszystkim” może zostać zakodowane za pomocą 0 (!) bitów.
Można uwzględnić takie zależności i uzyskać jeszcze lepsze kodowanie, 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 *** 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 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. (po podzieleniu przez oryginalną długość) jako dobrego przybliżenia entropii.

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB