From fa25bcc34d18df1148237cc6ef7ae0399774fc55 Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Fri, 22 Apr 2022 20:23:25 +0200 Subject: [PATCH] Split 6 cntd. --- wyk/06_Zanurzenia_slow.ipynb | 332 ----------------------------------- 1 file changed, 332 deletions(-) delete mode 100644 wyk/06_Zanurzenia_slow.ipynb diff --git a/wyk/06_Zanurzenia_slow.ipynb b/wyk/06_Zanurzenia_slow.ipynb deleted file mode 100644 index b12167c..0000000 --- a/wyk/06_Zanurzenia_slow.ipynb +++ /dev/null @@ -1,332 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Zanurzenia słów\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Słabości $n$-gramowych modeli języka\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Podstawowa słabość $n$-gramowych modeli języka polega na tym, że każde\n", - "słowo jest traktowane w izolacji. W, powiedzmy, bigramowym modelu\n", - "języka każda wartość $P(w_2|w_1)$ jest estymowana osobno, nawet dla —\n", - "w jakimś sensie podobnych słów. Na przykład:\n", - "\n", - "- $P(\\mathit{zaszczekał}|\\mathit{pies})$, $P(\\mathit{zaszczekał}|\\mathit{jamnik})$, $P(\\mathit{zaszczekał}|\\mathit{wilczur})$ są estymowane osobno,\n", - "- $P(\\mathit{zaszczekał}|\\mathit{pies})$, $P(\\mathit{zamerdał}|\\mathit{pies})$, $P(\\mathit{ugryzł}|\\mathit{pies})$ są estymowane osobno,\n", - "- dla każdej pary $u$, $v$, gdzie $u$ jest przyimkiem (np. *dla*), a $v$ — osobową formą czasownika (np. *napisał*) model musi się uczyć, że $P(v|u)$ powinno mieć bardzo niską wartość.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Podobieństwo słów jako sposób na słabości $n$-gramowych modeli języka?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Intuicyjnie wydaje się, że potrzebujemy jakiegoś sposobu określania podobieństwa słów, tak aby\n", - "w naturalny sposób, jeśli słowa $u$ i $u'$ oraz $v$ i $v'$ są bardzo podobne, wówczas\n", - "$P(u|v) \\approx P(u'|v')$.\n", - "\n", - "Można wskazać trzy sposoby określania podobieństwa słów: odległość\n", - "edycyjna Lewensztajna, hierarchie słów i odległość w przestrzeni wielowymiarowej.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Odległość Lewensztajna\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Słowo *dom* ma coś wspólnego z *domem*, *domkiem*, *domostwem*,\n", - " *domownikami*, *domowym* i *udomowieniem* (?? — tu już można mieć\n", - " wątpliwości). Więc może oprzeć podobieństwa na powierzchownym\n", - " podobieństwie?\n", - "\n", - "Możemy zastosować tutaj **odległość Lewensztajna**, czyli minimalną liczbę operacji edycyjnych, które\n", - "są potrzebne, aby przekształcić jedno słowo w drugie. Zazwyczaj jako elementarne operacje edycyjne\n", - "definiuje się:\n", - "\n", - "- usunięcie znaku,\n", - "- dodanie znaku,\n", - "- zamianu znaku.\n", - "\n", - "Na przykład odległość edycyjna między słowami *domkiem* i *domostwem*\n", - "wynosi 4: zamiana *k* na *o*, *i* na *s*, dodanie *t*, dodanie *w*.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4" - ] - } - ], - "source": [ - "import Levenshtein\n", - "Levenshtein.distance('domkiem', 'domostwem')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Niestety, to nie jest tak, że słowa są podobne wtedy i tylko wtedy, gdy *wyglądają* podobnie:\n", - "\n", - "- *tapet* nie ma nic wspólnego z *tapetą*,\n", - "- słowo *sowa* nie wygląda jak *ptak*, *puszczyk*, *jastrząb*, *kura* itd.\n", - "\n", - "Powierzchowne podobieństwo słów łączy się zazwyczaj z relacjami\n", - "**fleksyjnymi** i **słowotwórczymi** (choć też nie zawsze, por. np. pary\n", - "słów będące przykładem **supletywizmu**: *człowiek*-*ludzie*,\n", - "*brać*-*zwiąć*, *rok*-*lata*). A co z innymi własnościami wyrazów czy\n", - "raczej bytów przez nie denotowanych (słowa oznaczające zwierzęta\n", - "należące do gromady ptaków chcemy traktować jako, w jakiejś mierze przynajmnie, podobne)?\n", - "\n", - "Dodajmy jeszcze, że w miejsce odległości Lewensztajna warto czasami\n", - "używać podobieństwa Jaro-Winklera, które mniejszą wagę przywiązuje do zmian w końcówkach wyrazów:\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.6626984126984127" - ] - } - ], - "source": [ - "import Levenshtein\n", - "Levenshtein.jaro_winkler('domu', 'domowy')\n", - "Levenshtein.jaro_winkler('domowy', 'maskowy')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Klasy i hierarchie słów\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Innym sposobem określania podobieństwa między słowami jest zdefiniowanie klas słów.\n", - "Słowa należące do jednej klasy będą podobne, do różnych klas — niepodobne.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Klasy gramatyczne\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Klasy mogą odpowiadać standardowym kategoriom gramatycznym znanym z\n", - "językoznawstwa, na przykład **częściom mowy** (rzeczownik, przymiotnik,\n", - "czasownik itd.). Wiele jest niejednoznacznych jeśli chodzi o kategorię części mowy:\n", - "\n", - "- *powieść* — rzeczownik czy czasownik?\n", - "- *komputerowi* — rzeczownik czy przymiotnik?\n", - "- *lecz* — spójnik, czasownik (!) czy rzeczownik (!!)?\n", - "\n", - "Oznacza to, że musimy dysponować narzędziem, które pozwala\n", - "automatycznie, na podstawie kontekstu, tagować tekst częściami mowy\n", - "(ang. *POS tagger*). Takie narzędzia pozwalają na osiągnięcie wysokiej\n", - "dokładności, niestety zawsze wprowadzają jakieś błędy, które mogą\n", - "propagować się dalej.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Klasy indukowane automatycznie\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Zamiast z góry zakładać klasy wyrazów można zastosować metody uczenia\n", - "nienadzorowanego (podobne do analizy skupień) w celu **wyindukowanie**\n", - "automatycznie klas (tagów) z korpusu.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Użycie klas słów w modelu języka\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Najprostszy sposób uwzględnienia klas słów w $n$-gramowym modelowaniu\n", - "języka polega stworzeniu dwóch osobnych modeli:\n", - "\n", - "- tradycyjnego modelu języka $M_W$ operującego na słowach,\n", - "- modelu języka $M_T$ wyuczonego na klasach słów (czy to częściach\n", - " mowy, czy klasach wyindukowanych automatycznie).\n", - "\n", - "Zauważmy, że rząd modelu $M_T$ ($n_T$) może dużo większy niż rząd modelu $M_W$ ($n_W$) — klas będzie\n", - "dużo mniej niż wyrazów, więc problem rzadkości danych jest dużo mniejszy i można rozpatrywać dłuższe\n", - "$n$-gramy.\n", - "\n", - "Dwa modele możemy połączyć za pomocą prostej kombinacji liniowej sterowanej hiperparametrem $\\lambda$:\n", - "\n", - "$$P(w_i|w_{i-n_T}+1\\ldots w_{i-1}) = \\lambda P_{M_T}(w_i|w_{i-n_W}+1\\ldots w_{i-1}) + (1 - \\lambda) P_{M_W}(w_i|w_{i-n_T}+1\\ldots w_{i-1}).$$\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Hierarchie słów\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Zamiast płaskiej klasyfikacji słów można zbudować hierarchię słów czy\n", - "pojęć. Taka hierarchia może dotyczyć właściwości gramatycznych\n", - "(na przykład rzeczownik w liczbie pojedynczej w dopełniaczu będzie podklasą\n", - "rzeczownika) lub własności denotowanych bytów.\n", - "\n", - "Niekiedy dość łatwo stworzyć hierarchie (taksonomię) pojęć. Na\n", - "przykład jamnik jest rodzajem psa (słowo *jamnik* jest **hiponimem**\n", - "słowa *pies*, zaś słowo *pies* hiperonimem słowa *jamnik*), pies —\n", - "ssaka, ssak — zwierzęcia, zwierzę — organizmu żywego, organizm — bytu\n", - "materialnego.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###### Analityczny język Johna Wilkinsa\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Już od dawna filozofowie myśleli o stworzenie języka uniwersalnego, w\n", - "którym hierarchia bytów jest ułożona w „naturalny” sposób.\n", - "\n", - "Przykładem jest angielski uczony John Wilkins (1614-1672). W dziele\n", - "*An Essay towards a Real Character and a Philosophical Language*\n", - "zaproponował on rozbudowaną hierarchię bytów.\n", - "\n", - "![img](./06_Zanurzenia_slow/wilkins.png \"Fragment dzieła Johna Wilkinsa\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###### Słowosieci\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Współczesnym odpowiednik hierarchii Wilkinsa są **słowosieci** (ang. /wordnets).\n", - "Przykłady:\n", - "\n", - "- dla języka polskiego: [Słowosieć](http://plwordnet.pwr.wroc.pl),\n", - "- dla języka angielskiego: [Princeton Wordnet](https://wordnet.princeton.edu/) (i Słowosieć!)\n", - "\n", - "![img](./06_Zanurzenia_slow/slowosiec.png \"Fragment Słowosieci\")\n", - "\n", - "W praktyce stosowalność słowosieci okazała się zaskakująco\n", - "ograniczona. Większy przełom w przetwarzaniu języka naturalnego przyniosły\n", - "wielowymiarowe reprezentacje słów, inaczej: zanurzenia słów.\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "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.2" - }, - "org": null - }, - "nbformat": 4, - "nbformat_minor": 1 -}