aitech-moj-2023/wyk/06_Zanurzenia_slow.ipynb

1 line
8.4 KiB
Plaintext
Raw Normal View History

2022-04-09 21:06:11 +02:00
{"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\nsłowo jest traktowane w izolacji. W, powiedzmy, bigramowym modelu\njęzyka każda wartość $P(w_2|w_1)$ jest estymowana osobno, nawet dla —\nw 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\nw 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\nMożna wskazać trzy sposoby określania podobieństwa słów: odległość\nedycyjna 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\nMożemy zastosować tutaj **odległość Lewensztajna**, czyli minimalną liczbę operacji edycyjnych, które\nsą potrzebne, aby przekształcić jedno słowo w drugie. Zazwyczaj jako elementarne operacje edycyjne\ndefiniuje się:\n\n- usunięcie znaku,\n- dodanie znaku,\n- zamianu znaku.\n\nNa przykład odległość edycyjna między słowami *domkiem* i *domostwem*\nwynosi 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\nLevenshtein.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\nPowierzchowne podobieństwo słów łączy się zazwyczaj z relacjami\n**fleksyjnymi** i **słowotwórczymi** (choć też nie zawsze, por. np. pary\nsłó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\nraczej bytów przez nie denotowanych (słowa oznaczające zwierzęta\nnależące do gromady ptaków chcemy traktować jako, w jakiejś mierze przynajmnie, podobne)?\n\nDodajmy jeszcze, że w miejsce odległości Lewensztajna warto czasami\nuż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\nLevenshtein.jaro_winkler('domu', 'domowy')\nLevenshtein.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.\nSłowa należące do jednej klasy będą