diff --git a/wyk/05_Wygladzanie.ipynb b/wyk/07_Wygladzanie.ipynb similarity index 66% rename from wyk/05_Wygladzanie.ipynb rename to wyk/07_Wygladzanie.ipynb index d3fb5f9..2515fa2 100644 --- a/wyk/05_Wygladzanie.ipynb +++ b/wyk/07_Wygladzanie.ipynb @@ -1,5 +1,20 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n", + "
\n", + "

Modelowanie języka

\n", + "

07. Wygładzanie w n-gramowych modelach języka [wykład]

\n", + "

Filip Graliński (2022)

\n", + "
\n", + "\n", + "![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)\n", + "\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -54,7 +69,7 @@ "Rozpatrzmy przykład z 3 kolorami (wiemy, że w urnie mogą być kule\n", "żółte, zielone i czerwone, tj. $m=3$) i 4 losowaniami ($T=4$):\n", "\n", - "![img](./05_Wygladzanie/urna.drawio.png)\n", + "![img](./07_Wygladzanie/urna.drawio.png)\n", "\n", "Gdybyśmy w prosty sposób oszacowali prawdopodobieństwa, doszlibyśmy do\n", "wniosku, że prawdopodobieństwo wylosowania kuli czerwonej wynosi 3/4, żółtej — 1/4,\n", @@ -168,7 +183,7 @@ "$k_i$ to ile razy w zbiorze uczącym pojawił się $i$-ty wyraz słownika,\n", "$T$ — długość zbioru uczącego.\n", "\n", - "![img](./05_Wygladzanie/urna-wyrazy.drawio.png)\n", + "![img](./07_Wygladzanie/urna-wyrazy.drawio.png)\n", "\n", "A zatem przy użyciu wygładzania +1 w następujący sposób estymować\n", "będziemy prawdopodobieństwo słowa $w$:\n", @@ -303,113 +318,11 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "['',\n", - " 'lubisz',\n", - " 'curry',\n", - " ',',\n", - " 'prawda',\n", - " '?',\n", - " '',\n", - " '',\n", - " 'nałożę',\n", - " 'ci',\n", - " 'więcej',\n", - " '.',\n", - " '',\n", - " '',\n", - " 'hey',\n", - " '!',\n", - " '',\n", - " '',\n", - " 'smakuje',\n", - " 'ci',\n", - " '?',\n", - " '',\n", - " '',\n", - " 'hey',\n", - " ',',\n", - " 'brzydalu',\n", - " '.',\n", - " '',\n", - " '',\n", - " 'spójrz',\n", - " 'na',\n", - " 'nią',\n", - " '.',\n", - " '',\n", - " '',\n", - " '-',\n", - " 'wariatka',\n", - " '.',\n", - " '',\n", - " '',\n", - " '-',\n", - " 'zadałam',\n", - " 'ci',\n", - " 'pytanie',\n", - " '!',\n", - " '',\n", - " '',\n", - " 'no',\n", - " ',',\n", - " 'tak',\n", - " 'lepiej',\n", - " '!',\n", - " '',\n", - " '',\n", - " '-',\n", - " 'wygląda',\n", - " 'dobrze',\n", - " '!',\n", - " '',\n", - " '',\n", - " '-',\n", - " 'tak',\n", - " 'lepiej',\n", - " '!',\n", - " '',\n", - " '',\n", - " 'pasuje',\n", - " 'jej',\n", - " '.',\n", - " '',\n", - " '',\n", - " '-',\n", - " 'hey',\n", - " '.',\n", - " '',\n", - " '',\n", - " '-',\n", - " 'co',\n", - " 'do',\n", - " '...?',\n", - " '',\n", - " '',\n", - " 'co',\n", - " 'do',\n", - " 'cholery',\n", - " 'robisz',\n", - " '?',\n", - " '',\n", - " '',\n", - " 'zejdź',\n", - " 'mi',\n", - " 'z',\n", - " 'oczu',\n", - " ',',\n", - " 'zdziro',\n", - " '.',\n", - " '',\n", - " '',\n", - " 'przestań',\n", - " 'dokuczać']" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "['', 'lubisz', 'curry', ',', 'prawda', '?', '', '', 'nałożę', 'ci', 'więcej', '.', '', '', 'hey', '!', '', '', 'smakuje', 'ci', '?', '', '', 'hey', ',', 'brzydalu', '.', '', '', 'spójrz', 'na', 'nią', '.', '', '', '-', 'wariatka', '.', '', '', '-', 'zadałam', 'ci', 'pytanie', '!', '', '', 'no', ',', 'tak', 'lepiej', '!', '', '', '-', 'wygląda', 'dobrze', '!', '', '', '-', 'tak', 'lepiej', '!', '', '', 'pasuje', 'jej', '.', '', '', '-', 'hey', '.', '', '', '-', 'co', 'do', '...?', '', '', 'co', 'do', 'cholery', 'robisz', '?', '', '', 'zejdź', 'mi', 'z', 'oczu', ',', 'zdziro', '.', '', '', 'przestań', 'dokuczać']" + ] } ], "source": [ @@ -448,7 +361,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -459,18 +372,15 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "48113" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "48113" + ] } ], "source": [ @@ -479,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -518,18 +428,15 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "926594" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "926594" + ] } ], "source": [ @@ -553,128 +460,25 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
liczba tokenówśrednia częstość w części Bestymacje +1estymacje +0.01
03883341.9004950.9935860.009999
14038700.5927701.9871721.009935
21175291.5658092.9807592.009870
3628002.5142683.9743453.009806
4408563.5049444.9679314.009741
5294434.4540985.9615175.009677
6227095.2320236.9551036.009612
7182556.1579297.9486897.009548
8150767.3080398.9422768.009483
9128598.0456499.9358629.009418
\n", - "
" - ], - "text/plain": [ - " liczba tokenów średnia częstość w części B estymacje +1 estymacje +0.01\n", - "0 388334 1.900495 0.993586 0.009999\n", - "1 403870 0.592770 1.987172 1.009935\n", - "2 117529 1.565809 2.980759 2.009870\n", - "3 62800 2.514268 3.974345 3.009806\n", - "4 40856 3.504944 4.967931 4.009741\n", - "5 29443 4.454098 5.961517 5.009677\n", - "6 22709 5.232023 6.955103 6.009612\n", - "7 18255 6.157929 7.948689 7.009548\n", - "8 15076 7.308039 8.942276 8.009483\n", - "9 12859 8.045649 9.935862 9.009418" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "liczba tokenów średnia częstość w części B estymacje +1 estymacje +0.01\n", + "0 388334 1.900495 0.993586 0.009999\n", + "1 403870 0.592770 1.987172 1.009935\n", + "2 117529 1.565809 2.980759 2.009870\n", + "3 62800 2.514268 3.974345 3.009806\n", + "4 40856 3.504944 4.967931 4.009741\n", + "5 29443 4.454098 5.961517 5.009677\n", + "6 22709 5.232023 6.955103 6.009612\n", + "7 18255 6.157929 7.948689 7.009548\n", + "8 15076 7.308039 8.942276 8.009483\n", + "9 12859 8.045649 9.935862 9.009418" + ] } ], "source": [ @@ -716,128 +520,25 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
liczba tokenówśrednia częstość w części Bestymacje +1Good-Turing
03883341.9004950.9935861.040007
14038700.5927701.9871720.582014
21175291.5658092.9807591.603009
3628002.5142683.9743452.602293
4408563.5049444.9679313.603265
5294434.4540985.9615174.627721
6227095.2320236.9551035.627064
7182556.1579297.9486896.606847
8150767.3080398.9422767.676506
9128598.0456499.9358628.557431
\n", - "
" - ], - "text/plain": [ - " liczba tokenów średnia częstość w części B estymacje +1 Good-Turing\n", - "0 388334 1.900495 0.993586 1.040007\n", - "1 403870 0.592770 1.987172 0.582014\n", - "2 117529 1.565809 2.980759 1.603009\n", - "3 62800 2.514268 3.974345 2.602293\n", - "4 40856 3.504944 4.967931 3.603265\n", - "5 29443 4.454098 5.961517 4.627721\n", - "6 22709 5.232023 6.955103 5.627064\n", - "7 18255 6.157929 7.948689 6.606847\n", - "8 15076 7.308039 8.942276 7.676506\n", - "9 12859 8.045649 9.935862 8.557431" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "liczba tokenów średnia częstość w części B estymacje +1 Good-Turing\n", + "0 388334 1.900495 0.993586 1.040007\n", + "1 403870 0.592770 1.987172 0.582014\n", + "2 117529 1.565809 2.980759 1.603009\n", + "3 62800 2.514268 3.974345 2.602293\n", + "4 40856 3.504944 4.967931 3.603265\n", + "5 29443 4.454098 5.961517 4.627721\n", + "6 22709 5.232023 6.955103 5.627064\n", + "7 18255 6.157929 7.948689 6.606847\n", + "8 15076 7.308039 8.942276 7.676506\n", + "9 12859 8.045649 9.935862 8.557431" + ] } ], "source": [ @@ -1008,18 +709,15 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "[('k', 'o', 't'), ('o', 't', 'e'), ('t', 'e', 'k')]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "[('k', 'o', 't'), ('o', 't', 'e'), ('t', 'e', 'k')]" + ] } ], "source": [ @@ -1036,7 +734,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -1048,23 +746,13 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "321" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "len(histories['jork'])\n", - "len(histories['zielony'])" + "len(histories['zielony'])\n", + "histories['jork']" ] }, { @@ -1112,7 +800,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![img](./05_Wygladzanie/size-perplexity.gif \"Perplexity dla różnych rozmiarów zbioru testowego\")\n", + "![img](./07_Wygladzanie/size-perplexity.gif \"Perplexity dla różnych rozmiarów zbioru testowego\")\n", "\n" ] }, @@ -1128,7 +816,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![img](./05_Wygladzanie/size-perplexity2.gif \"Perplexity dla różnych rozmiarów zbioru uczącego\")\n", + "![img](./07_Wygladzanie/size-perplexity2.gif \"Perplexity dla różnych rozmiarów zbioru uczącego\")\n", "\n" ] }, @@ -1144,7 +832,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![img](./05_Wygladzanie/order-perplexity.gif \"Perplexity dla różnych wartości rządu modelu\")\n", + "![img](./07_Wygladzanie/order-perplexity.gif \"Perplexity dla różnych wartości rządu modelu\")\n", "\n" ] } @@ -1165,7 +853,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.2" + "version": "3.10.5" }, "org": null }, diff --git a/wyk/05_Wygladzanie.org b/wyk/07_Wygladzanie.org similarity index 94% rename from wyk/05_Wygladzanie.org rename to wyk/07_Wygladzanie.org index e636ec7..4128060 100644 --- a/wyk/05_Wygladzanie.org +++ b/wyk/07_Wygladzanie.org @@ -25,7 +25,7 @@ $$p_i = \frac{k_i}{T}.$$ Rozpatrzmy przykład z 3 kolorami (wiemy, że w urnie mogą być kule żółte, zielone i czerwone, tj. $m=3$) i 4 losowaniami ($T=4$): -[[./05_Wygladzanie/urna.drawio.png]] +[[./07_Wygladzanie/urna.drawio.png]] Gdybyśmy w prosty sposób oszacowali prawdopodobieństwa, doszlibyśmy do wniosku, że prawdopodobieństwo wylosowania kuli czerwonej wynosi 3/4, żółtej — 1/4, @@ -85,7 +85,7 @@ losowania kul z urny: $m$ to liczba wszystkich wyrazów (czyli rozmiar słownika $k_i$ to ile razy w zbiorze uczącym pojawił się $i$-ty wyraz słownika, $T$ — długość zbioru uczącego. -[[./05_Wygladzanie/urna-wyrazy.drawio.png]] +[[./07_Wygladzanie/urna-wyrazy.drawio.png]] A zatem przy użyciu wygładzania +1 w następujący sposób estymować będziemy prawdopodobieństwo słowa $w$: @@ -173,7 +173,7 @@ Stwórzmy generator, który będzie wczytywał słowa z pliku, dodatkowo: - dodamy specjalne tokeny na początek i koniec zdania (~~ i ~~). -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer from itertools import islice import regex as re import sys @@ -200,7 +200,7 @@ Stwórzmy generator, który będzie wczytywał słowa z pliku, dodatkowo: Zobaczmy, ile razy, średnio w drugiej połówce korpusu występują wyrazy, które w pierwszej wystąpiły określoną liczbę razy. -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer from collections import Counter counterA = Counter(get_words_from_file('opensubtitlesA.pl.txt')) @@ -210,7 +210,7 @@ wyrazy, które w pierwszej wystąpiły określoną liczbę razy. :results: :end: -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer counterA['taki'] #+END_SRC @@ -219,7 +219,7 @@ counterA['taki'] 48113 :end: -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer max_r = 10 buckets = {} @@ -251,7 +251,7 @@ counterA['taki'] Policzmy teraz jakiej liczby wystąpień byśmy oczekiwali, gdyby użyć wygładzania +1 bądź +0.01. (Uwaga: zwracamy liczbę wystąpień, a nie względną częstość, stąd przemnażamy przez rozmiar całego korpusu). -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer def plus_alpha_smoothing(alpha, m, t, k): return t*(k + alpha)/(t + alpha * m) @@ -275,7 +275,7 @@ Policzmy teraz jakiej liczby wystąpień byśmy oczekiwali, gdyby użyć wygład 926594 :end: -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer import pandas as pd pd.DataFrame(data, columns=["liczba tokenów", "średnia częstość w części B", "estymacje +1", "estymacje +0.01"]) @@ -309,7 +309,7 @@ $$p(w) = \frac{\# w + 1}{|C|}\frac{N_{r+1}}{N_r}.$$ **** Przykład -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer good_turing_counts = [(ix+1)*nb_of_types[ix+1]/nb_of_types[ix] for ix in range(0, max_r)] data2 = list(zip(nb_of_types, empirical_counts, plus_one_counts, good_turing_counts)) @@ -415,7 +415,7 @@ W metodzie Knesera-Neya w następujący sposób estymujemy prawdopodobieństwo u $$P(w) = \frac{N_{1+}(\bullet w)}{\sum_{w_j} N_{1+}(\bullet w_j)}.$$ -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer def ngrams(iter, size): ngram = [] for item in iter: @@ -433,7 +433,7 @@ $$P(w) = \frac{N_{1+}(\bullet w)}{\sum_{w_j} N_{1+}(\bullet w_j)}.$$ :end: -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer histories = { } for prev_token, token in ngrams(get_words_from_file('opensubtitlesA.pl.txt'), 2): histories.setdefault(token, set()) @@ -444,7 +444,7 @@ $$P(w) = \frac{N_{1+}(\bullet w)}{\sum_{w_j} N_{1+}(\bullet w_j)}.$$ :results: :end: -#+BEGIN_SRC python :session mysession :exports both :results raw drawer +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer len(histories['jork']) len(histories['zielony']) histories['jork'] @@ -472,15 +472,15 @@ Knesera-Neya połączone z *przycinaniem* słownika n-gramów (wszystkie **** Zmiana perplexity przy zwiększaniu zbioru testowego #+CAPTION: Perplexity dla różnych rozmiarów zbioru testowego -[[./05_Wygladzanie/size-perplexity.gif]] +[[./07_Wygladzanie/size-perplexity.gif]] **** Zmiana perplexity przy zwiększaniu zbioru uczącego #+CAPTION: Perplexity dla różnych rozmiarów zbioru uczącego -[[./05_Wygladzanie/size-perplexity2.gif]] +[[./07_Wygladzanie/size-perplexity2.gif]] **** Zmiana perplexity przy zwiększaniu rządu modelu #+CAPTION: Perplexity dla różnych wartości rządu modelu -[[./05_Wygladzanie/order-perplexity.gif]] +[[./07_Wygladzanie/order-perplexity.gif]] diff --git a/wyk/05_Wygladzanie/order-perplexity.gif b/wyk/07_Wygladzanie/order-perplexity.gif similarity index 100% rename from wyk/05_Wygladzanie/order-perplexity.gif rename to wyk/07_Wygladzanie/order-perplexity.gif diff --git a/wyk/05_Wygladzanie/size-perplexity.gif b/wyk/07_Wygladzanie/size-perplexity.gif similarity index 100% rename from wyk/05_Wygladzanie/size-perplexity.gif rename to wyk/07_Wygladzanie/size-perplexity.gif diff --git a/wyk/05_Wygladzanie/size-perplexity2.gif b/wyk/07_Wygladzanie/size-perplexity2.gif similarity index 100% rename from wyk/05_Wygladzanie/size-perplexity2.gif rename to wyk/07_Wygladzanie/size-perplexity2.gif diff --git a/wyk/05_Wygladzanie/urna-wyrazy.drawio b/wyk/07_Wygladzanie/urna-wyrazy.drawio similarity index 100% rename from wyk/05_Wygladzanie/urna-wyrazy.drawio rename to wyk/07_Wygladzanie/urna-wyrazy.drawio diff --git a/wyk/05_Wygladzanie/urna-wyrazy.drawio.png b/wyk/07_Wygladzanie/urna-wyrazy.drawio.png similarity index 100% rename from wyk/05_Wygladzanie/urna-wyrazy.drawio.png rename to wyk/07_Wygladzanie/urna-wyrazy.drawio.png diff --git a/wyk/05_Wygladzanie/urna.drawio b/wyk/07_Wygladzanie/urna.drawio similarity index 100% rename from wyk/05_Wygladzanie/urna.drawio rename to wyk/07_Wygladzanie/urna.drawio diff --git a/wyk/05_Wygladzanie/urna.drawio.png b/wyk/07_Wygladzanie/urna.drawio.png similarity index 100% rename from wyk/05_Wygladzanie/urna.drawio.png rename to wyk/07_Wygladzanie/urna.drawio.png