Split 6 cntd.
This commit is contained in:
parent
f2c0dc31dd
commit
fa25bcc34d
@ -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
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user