aitech-moj/wyk/07_Zanurzenia_slow.ipynb

19 lines
13 KiB
Plaintext
Raw Normal View History

2022-04-23 12:43:32 +02:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Modelowanie języka</h1>\n",
"<h2> 7. <i>Zanurzenia słów</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2022)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)\n",
"\n"
]
},
{"cell_type":"markdown","metadata":{},"source":["## Zanurzenia słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W praktyce stosowalność słowosieci okazała się zaskakująco\nograniczona. Większy przełom w przetwarzaniu języka naturalnego przyniosły\nwielowymiarowe reprezentacje słów, inaczej: zanurzenia słów.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### „Wymiary” słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Moglibyśmy zanurzyć (ang. *embed*) w wielowymiarowej przestrzeni, tzn. zdefiniować odwzorowanie\n$E \\colon V \\rightarrow \\mathcal{R}^m$ dla pewnego $m$ i określić taki sposób estymowania\nprawdopodobieństw $P(u|v)$, by dla par $E(v)$ i $E(v')$ oraz $E(u)$ i $E(u')$ znajdujących się w pobliżu\n(według jakiejś metryki odległości, na przykład zwykłej odległości euklidesowej):\n\n$$P(u|v) \\approx P(u'|v').$$\n\n$E(u)$ nazywamy zanurzeniem (embeddingiem) słowa.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Wymiary określone z góry?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Można by sobie wyobrazić, że $m$ wymiarów mogłoby być z góry\nokreślonych przez lingwistę. Wymiary te byłyby związane z typowymi\n„osiami” rozpatrywanymi w językoznawstwie, na przykład:\n\n- czy słowo jest wulgarne, pospolite, potoczne, neutralne czy książkowe?\n- czy słowo jest archaiczne, wychodzące z użycia czy jest neologizmem?\n- czy słowo dotyczy kobiet, czy mężczyzn (w sensie rodzaju gramatycznego i/lub\n socjolingwistycznym)?\n- czy słowo jest w liczbie pojedynczej czy mnogiej?\n- czy słowo jest rzeczownikiem czy czasownikiem?\n- czy słowo jest rdzennym słowem czy zapożyczeniem?\n- czy słowo jest nazwą czy słowem pospolitym?\n- czy słowo opisuje konkretną rzecz czy pojęcie abstrakcyjne?\n- …\n\nW praktyce okazało się jednak, że lepiej, żeby komputer uczył się sam\nmożliwych wymiarów — z góry określamy tylko $m$ (liczbę wymiarów).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Bigramowy model języka oparty na zanurzeniach\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Zbudujemy teraz najprostszy model język oparty na zanurzeniach. Będzie to właściwie najprostszy\n**neuronowy model języka**, jako że zbudowany model można traktować jako prostą sieć neuronową.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Słownik\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W typowym neuronowym modelu języka rozmiar słownika musi być z góry\nograniczony. Zazwyczaj jest to liczba rzędu kilkudziesięciu wyrazów —\npo prostu będziemy rozpatrywać $|V|$ najczęstszych wyrazów, pozostałe zamienimy\nna specjalny token `<unk>` reprezentujący nieznany (*unknown*) wyraz.\n\nAby utworzyć taki słownik użyjemy gotowej klasy `Vocab` z pakietu torchtext:\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"16"}],"source":["from itertools import islice\nimport regex as re\nimport sys\nfrom torchtext.vocab import build_vocab_from_iterator\n\n\ndef get_words_from_line(line):\n line = line.rstrip()\n yield '<s>'\n for m in re.finditer(r'[\\p{L}0-9\\*]+|\\p{P}+', line):\n yield m.group(0).lower()\n yield '</s>'\n\n\ndef get_word_lines_from_file(file_name):\n with open(file_name, 'r') as fh:\n for line in fh:\n yield get_words_from_line(line)\n\nvocab_size = 20000\n\nvocab = build_vocab_from_iterator(\n get_word_lines_from_file('opensubtitlesA.pl.txt'),\n max_tokens = vocab_size,\n specials = ['<unk>'])\n\nvocab['jest']"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"['<unk>', '</s>', '<s>', 'w', 'wierzyli']"}],"source":["vocab.lookup_tokens([0, 1, 2, 10, 12345])"]},{"cell_type":"markdown","metadata":{},"source":["#### Definicja sieci\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Naszą prostą sieć neuronową zaimplementujemy używając frameworku PyTor