1 line
8.4 KiB
Plaintext
1 line
8.4 KiB
Plaintext
{"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ą 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\njęzykoznawstwa, na przykład **częściom mowy** (rzeczownik, przymiotnik,\nczasownik 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\nOznacza to, że musimy dysponować narzędziem, które pozwala\nautomatycznie, na podstawie kontekstu, tagować tekst częściami mowy\n(ang. *POS tagger*). Takie narzędzia pozwalają na osiągnięcie wysokiej\ndokładności, niestety zawsze wprowadzają jakieś błędy, które mogą\npropagować 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\nnienadzorowanego (podobne do analizy skupień) w celu **wyindukowanie**\nautomatycznie 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\nję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\nZauważ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\nduż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\nDwa 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\npojęć. Taka hierarchia może dotyczyć właściwości gramatycznych\n(na przykład rzeczownik w liczbie pojedynczej w dopełniaczu będzie podklasą\nrzeczownika) lub własności denotowanych bytów.\n\nNiekiedy dość łatwo stworzyć hierarchie (taksonomię) pojęć. Na\nprzykład jamnik jest rodzajem psa (słowo *jamnik* jest **hiponimem**\nsłowa *pies*, zaś słowo *pies* hiperonimem słowa *jamnik*), pies —\nssaka, ssak — zwierzęcia, zwierzę — organizmu żywego, organizm — bytu\nmaterialnego.\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\nktórym hierarchia bytów jest ułożona w „naturalny” sposób.\n\nPrzykładem jest angielski uczony John Wilkins (1614-1672). W dziele\n*An Essay towards a Real Character and a Philosophical Language*\nzaproponował 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).\nPrzykł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\nW 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"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","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.5.2"}},"nbformat":4,"nbformat_minor":0} |