Compare commits

...

32 Commits

Author SHA1 Message Date
72db2aa687 Drobne poprawki w wykładzie 2021-10-05 21:44:46 +02:00
Jakub Pokrywka
f804311da1 reformat 2021-10-05 15:28:02 +02:00
Jakub Pokrywka
3c0223d434 reformat 2021-10-05 15:04:58 +02:00
Jakub Pokrywka
0f34dcdeb4 Merge git.wmi.amu.edu.pl:filipg/aitech-eks 2021-09-28 09:13:36 +02:00
Jakub Pokrywka
5acffc0265 add 03 2021-09-27 14:02:30 +02:00
Jakub Pokrywka
4437a7f71b add ipynb to md conversion 2021-09-27 13:29:40 +02:00
Jakub Pokrywka
ad34aaeae0 add metadata to cw 2021-09-27 12:34:44 +02:00
1836dc18c1 Remove too long text material 2021-09-27 08:10:10 +02:00
fedffd5456 Add metadata 2021-09-27 07:57:37 +02:00
9a61b2c06c Add helper script 2021-09-27 07:43:02 +02:00
22f1e74aef Fixes 2021-09-27 07:42:48 +02:00
72c6fbcbf6 Fixes 2021-09-27 07:36:37 +02:00
a45fd570e5 Merge branch 'master' of git.wmi.amu.edu.pl:filipg/aitech-eks 2021-09-27 06:42:33 +02:00
Jakub Pokrywka
cc675a8591 Merge git.wmi.amu.edu.pl:filipg/aitech-eks 2021-07-12 12:44:57 +02:00
Jakub Pokrywka
93ea351350 split to 14 and 15 2021-07-12 12:44:24 +02:00
kubapok
2cd5bef0a0 Merge git.wmi.amu.edu.pl:filipg/aitech-eks 2021-06-23 10:08:36 +02:00
kubapok
d3c996511c add bbc news train 2021-06-23 10:08:23 +02:00
kubapok
f3db74bfd3 add bbc news train 2021-06-23 10:07:07 +02:00
kubapok
691dd36092 Merge branch 'master' of git.wmi.amu.edu.pl:filipg/aitech-eks-pub 2021-06-23 10:02:16 +02:00
kubapok
2a031bc8d8 add similarity search 2021-06-23 10:01:55 +02:00
077c2b6f90 Merge branch 'master' of git.wmi.amu.edu.pl:filipg/aitech-eks 2021-06-22 21:16:11 +02:00
97d92d38e8 15 2021-06-22 21:15:58 +02:00
Jakub Pokrywka
9d96c9ec4f Merge branch 'master' of git.wmi.amu.edu.pl:filipg/aitech-eks 2021-06-16 15:14:53 +02:00
Jakub Pokrywka
f1bc633468 add transformery2 2021-06-16 15:14:42 +02:00
78fb510cba 14 2021-06-14 15:39:15 +02:00
edf3811cd7 new 2021-06-14 08:23:02 +02:00
89155edea0 Up 2021-06-12 15:47:37 +02:00
Jakub Pokrywka
0ea752f091 add transformers 2021-06-09 12:46:15 +02:00
0d10bc2fca Merge branch 'master' of git.wmi.amu.edu.pl:filipg/aitech-eks 2021-06-09 12:43:37 +02:00
429caef49c Atencja 2021-06-09 12:43:29 +02:00
aebba6c18b Merge branch 'master' of git.wmi.amu.edu.pl:filipg/aitech-eks 2021-06-08 21:14:04 +02:00
98012914c4 bpe 2021-06-08 21:13:39 +02:00
61 changed files with 12581 additions and 18867 deletions

49
add-metadata.py Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env python3
#procedura napisywania plików ipynb (generowanie nagłówka i metadanych)
import json
import sys
import re
def modjup(filen,numer,tytul,typ,author,email,lang,title,year):
zerocell=['![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> %s </h1>\n'%(title),
'<h2> %s. <i>%s</i> [%s]</h2> \n'%(numer,tytul,typ),
'<h3> %s (%s)</h3>\n'%(author,year),
'</div>\n',
'\n',
'![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)']
zerodict={'cell_type': 'markdown','metadata': {'collapsed': False},'source': zerocell}
with open(filen, 'r+',encoding='utf-8') as f:
ll=json.load(f)
ll["metadata"]["author"]=author
ll["metadata"]["email"]=email
ll["metadata"]["lang"]=lang
subtitle="%s.%s[%s]"%(numer,tytul,typ)
ll["metadata"]["subtitle"]=subtitle
ll["metadata"]["title"]=title
ll["metadata"]["year"]=year
if not(ll['cells'][0]['source'][0]==zerocell[0]):
ll['cells'].insert(0,zerodict)
else:
ll['cells'][0]=zerodict
f.seek(0)
json.dump(ll,f,indent=4)
#zmodyfikuj te dane
filen=sys.argv[1]
numer=re.match(r'^(?:\D+/)?0*(\d+)', filen).group(1)
tytul=sys.argv[2]
typ="wykład"
author="Filip Graliński"
email="filipg@amu.edu.pl"
lang= "pl"
title="Ekstrakcja informacji"
year="2021"
#uruchom procedurę
modjup(filen,numer,tytul,typ,author,email,lang,title,year)

7
convert_ipynb_to_md.sh Normal file
View File

@ -0,0 +1,7 @@
set -ex
FILEIPYNB=$1
jupyter nbconvert --to script $1
FILEPY=$(echo $FILEIPYNB | sed 's/.ipynb$/.py/')
FILEMD=$(echo $FILEIPYNB | sed 's/.ipynb$/.md/')
python convert_python_to_markdown.py "$FILEPY" "$FILEMD"

View File

@ -0,0 +1,13 @@
import sys
from bs4 import BeautifulSoup
from markdown import markdown
with open(sys.argv[1]) as f_in, open(sys.argv[2],'w') as f_out:
for i, line in enumerate(f_in):
if i in (1,2):
continue
if line[:2] == "# " and line[:5] != "# In[":
text = line[:2]
f_out.write(line[2:])

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 0. <i>Informacje na temat przedmiotu</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -57,21 +71,17 @@
"\n", "\n",
"**Żeby zaliczyć przedmiot należy pojawiać się na laboratoriach. Maksymalna liczba nieobecności to 3. Obecność będę sprawdzał poprzez panel MS TEAMS, czyli będę sprawdzał czy ktoś jest wdzwoniony na ćwiczenia. Jeżeli kogoś nie będzie więcej niż 3 razy, to nie będzie miał zaliczonego przedmiotu** \n" "**Żeby zaliczyć przedmiot należy pojawiać się na laboratoriach. Maksymalna liczba nieobecności to 3. Obecność będę sprawdzał poprzez panel MS TEAMS, czyli będę sprawdzał czy ktoś jest wdzwoniony na ćwiczenia. Jeżeli kogoś nie będzie więcej niż 3 razy, to nie będzie miał zaliczonego przedmiotu** \n"
] ]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -83,7 +93,10 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.3" "version": "3.8.3"
} },
"subtitle": "0.Informacje na temat przedmiotu[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,181 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Opracować w języku Haskell wyspecjalizowanego robota pobierającego dane z konkretnego serwisu.\n",
"\n",
"Punkty: 80 (domyślnie - niektóre zadanie są trudniejsze, wówczas podaję osobno liczbę punktów)\n",
"\n",
"Ogólne zasady:\n",
"\n",
"* pobieramy informacje (metadane) o plikach PDF, DjVU, JPG itp, ale nie same pliki,\n",
"* nie pobierajmy całego serwisu, tylko tyle, ile trzeba, by pobrać metadane o interesujących nas zasobach,\n",
"* interesują nas tylko teksty polskie, jeśli nie jest to trudne, należy odfiltrować publikacje obcojęzyczne,\n",
"* staramy się ustalać datę z możliwie dużą dokładnością.\n",
"\n",
"Sposób pracy:\n",
"\n",
"0. Pobrać Haskell Stack\n",
"\n",
"~~~\n",
"curl -sSL https://get.haskellstack.org/ | sh -s - -d ~/bin\n",
"~~~\n",
"\n",
"Na fizycznych komputerach wydziałowych są błędnie ustawione prawa dostępu na dyskach sieciowych, Haskell Stack musi działać na fizycznym dysku:\n",
"\n",
"~~~\n",
"rm -rf /mnt/poligon/.stack\n",
"mkdir /mnt/poligon/.stack\n",
"mv ~/.stack ~/.stack-bak # gdyby już był... proszę się nie przejmować błędem\n",
"ln -s /mnt/poligon/.stack ~/.stack\n",
"~~~\n",
"\n",
"1. Pobrać repozytorium:\n",
"\n",
"~~~\n",
"git clone https://git.wmi.amu.edu.pl/filipg/twilight-library.git\n",
"~~~\n",
"\n",
"2. Wypchnąć na początek do swojego repozytorium (trzeba sobie najpierw założyć to repozytorium na <https://git.wmi.amu.edu.pl>)\n",
"\n",
"~~~\n",
"cd twilight-library\n",
"git remote set-url origin git@git.wmi.amu.edu.pl:YOURID/twilight-library\n",
"git push origin master\n",
"git remote add mother git://gonito.net/twilight-library\n",
"~~~\n",
"\n",
"3. Zobacz, czy przykładowy robot dla strony z „Alamanachem Muszyny” działa:\n",
"\n",
"~~~\n",
"~/bin/stack install # może trwać długo za pierwszym razem\n",
"~/bin/stack exec almanachmuszyny\n",
"~~~\n",
"\n",
"\n",
"W razie problemów z instalacją:\n",
"\n",
"~~~\n",
"sudo apt install libpcre3 libpcre3-dev\n",
"~~~\n",
"\n",
"3. Opracuj swojego robota wzorując się na pliku `almanachmuszyny.hs`.\n",
" (Ale dodaj swój plik, nie zmieniaj `almanachmuszyny.hs`!)\n",
"\n",
"4. Dopisz specyfikację swojego robota do `shadow-library.cabal`.\n",
"\n",
"5. Pracuj nad swoim robotem, uruchamiaj go w następujący sposób:\n",
"\n",
"~~~\n",
"~/bin/stack install\n",
"~/bin/stack exec mojrobot\n",
"~~~\n",
"\n",
"(Tzn. nie nazywaj go „mojrobot”, tylko użyj jakieś sensownej nazwy.)\n",
"\n",
"6. Jeśli publikacja (np. pojedynczy numer gazety) składa się z wielu plików, powinien zostać wygenerowany jeden\n",
"rekord, w `finalUrl` powinny znaleźć się URL do poszczególnych stron (np. plików JPR) oddzielone ` // `.\n",
"\n",
"7. Po zakończeniu prac prześlij mejla do prowadzącego zajęcia z URL-em do swojego repozytorium.\n",
"\n",
"Lista serwisów do wyboru (na każdy serwis 1 osoba):\n",
"\n",
"1. [Teksty Drugie](http://tekstydrugie.pl)\n",
"2. [Archiwum Inspektora Pracy](https://www.pip.gov.pl/pl/inspektor-pracy/66546,archiwum-inspektora-pracy-.html)\n",
"3. [Medycyna Weterynaryjna](http://www.medycynawet.edu.pl/archives) — również historyczne zasoby od 1945 roku, **120 punktów**\n",
"4. [Polskie Towarzystwo Botaniczne](https://pbsociety.org.pl/default/dzialalnosc-wydawnicza/) — wszystkie dostępne zdigitalizowane publikacje!, **130 punktow**\n",
"5. [Wieści Pepowa](http://archiwum2019.pepowo.pl/news/c-10/gazeta) — nie pominąć strony nr 2 z wynikami, **110 punktów**\n",
"6. [Czasopismo Kosmos](http://kosmos.icm.edu.pl/)\n",
"7. [Czasopismo Wszechświat](http://www.ptpk.org/archiwum.html)\n",
"8. [Czasopisma polonijne we Francji](https://argonnaute.parisnanterre.fr/ark:/14707/a011403267917yQQFAS) — najlepiej w postaci PDF-ów, jak np. [https://argonnaute.parisnanterre.fr/medias/customer_3/periodique/immi_pol_lotmz1_pdf/BDIC_GFP_2929_1945_039.pdf](), **220 punktów**\n",
"9. [Muzeum Sztuki — czasopisma](https://zasoby.msl.org.pl/mobjects/show), **220 punktów**, publikacje, teksty, czasopisma, wycinki\n",
"10. [Wiadomości Urzędu Patentowego](https://grab.uprp.pl/sites/Wydawnictwa/WydawnictwaArchiwum/WydawnictwaArchiwum/Forms/AllItems.aspx)\n",
"11. [Czas, czasopismo polonijne](https://digitalcollections.lib.umanitoba.ca/islandora/object/uofm:2222545), **140 punktów** S.G.\n",
"12. [Stenogramy Okrągłego Stołu](http://okragly-stol.pl/stenogramy/), **110 punktów**\n",
"13. [Nasze Popowice](https://smpopowice.pl/index.php/numery-archiwalne)\n",
"14. [Czasopisma entomologiczne](http://pte.au.poznan.pl/)\n",
"15. [Wiadomości matematyczne](https://wydawnictwa.ptm.org.pl/index.php/wiadomosci-matematyczne/issue/archive?issuesPage=2), **120 punktow**\n",
"16. [Alkoholizm i Narkomania](http://www.ain.ipin.edu.pl/archiwum-starsze.html)\n",
"17. [Czasopismo Etyka](https://etyka.uw.edu.pl/tag/etyka-562018/), O.K.\n",
"18. [Skup makulatury](https://chomikuj.pl/skup.makulatury.prl), **250 punktów**\n",
"19. [Hermes](https://chomikuj.pl/hermes50-1) i https://chomikuj.pl/hermes50-2, **250 punktów**\n",
"20. [E-dziennik Województwa Mazowieckiego](https://edziennik.mazowieckie.pl/actbymonths) **150 punktów**\n",
"21. [Czasopismo Węgiel Brunatny](http://www.ppwb.org.pl/wegiel_brunatny)\n",
"22. [Gazeta GUM](https://gazeta.gumed.edu.pl/61323.html)\n",
"23. [Nowiny Andrychowskie](https://radioandrychow.pl/nowiny/)\n",
"24. [Kawęczyniak](http://bip.kaweczyn.pl/kaweczyn/pl/dla-mieszkanca/publikacje/archiwalne-numery-kaweczyniaka-rok-1995-2005/kaweczyniaki-rok-1997.html)\n",
"25. [Zbór Chrześcijański w Bielawia](http://zborbielawa.pl/archiwum/)\n",
"26. [Gazeta Rytwiańska](http://www.rytwiany.com.pl/index.php?sid=5)\n",
"27. [Nasze Popowice](https://smpopowice.pl/gazeta/2005_12_nasze-popowice-nr_01.pdf)\n",
"28. [Echo Chełmka](http://moksir.chelmek.pl/o-nas/echo-chelmka)\n",
"29. [Głos Świdnika](http://s.bibliotekaswidnik.pl/index.php/archwium/116-glos-swidnika) **100 punktów**\n",
"30. [Aneks](https://aneks.kulturaliberalna.pl/archiwum-aneksu/) **90 punktów**\n",
"31. [Teatr Lalel](http://polunima.pl/teatr-lalek)\n",
"32. [Biuletyn Bezpieczna Chemia](https://www.pipc.org.pl/publikacje/biuletyn-bezpieczna-chemia)\n",
"33. [Głos Maszynisty](https://zzm.org.pl/glos-maszynisty/)\n",
"34. [Kultura Paryska](https://www.kulturaparyska.com/pl/index), całe archiwum z książkami i innymi czasopismami, **180 punktów**\n",
"35. [Gazeta Fabryczna - Kraśnik](https://80lat.flt.krasnik.pl/index.php/gazeta-fabryczna/) **120 punktów**\n",
"36. [Artykuły o Jujutsu](http://www.kobudo.pl/artykuly_jujutsu.html)\n",
"37. [Wycinki o Taekwon-Do](https://www2.pztkd.lublin.pl/archpras.html#z1996)\n",
"38. [Materiały o kolejnictwie](https://enkol.pl/Strona_g%C5%82%C3%B3wna) **180 punktów**\n",
"39. [Centralny Instytut Ochrony Pracy](http://archiwum.ciop.pl/), znaleźć wszystkie publikacje typu <http://archiwum.ciop.pl/44938>, wymaga trochę sprytu **130 punktów**\n",
"40. [Biblioteka Sejmowa - Zasoby Cyfrowe](https://biblioteka.sejm.gov.pl/zasoby_cyfrowe/), **200 punktów**\n",
"41. [Elektronika Praktyczna](https://ep.com.pl/archiwum), te numery, które dostępne w otwarty sposób, np. rok 1993\n",
"42. [Litewska Akademia Nauk](http://www.mab.lt/), tylko materiały w jęz. polskim, takie jak np.\n",
" <https://elibrary.mab.lt/handle/1/840>, **170 punktów**\n",
"43. [Litewska Biblioteka Cyfrowa](https://www.epaveldas.lt), wyłuskać tylko materiały w jęz. polskim, **190 punktów**\n",
"44. [Czasopisma Geologiczne](https://geojournals.pgi.gov.pl), **120 punktów**\n",
"45. [Czasopisma PTTK](https://www.czasopisma.centralnabibliotekapttk.pl/index.php?i3), **120 punktów**\n",
"46. [Czasopisma Polskiego Towarzystwa Dendrologicznego](https://www.ptd.pl/?page_id=7), **100 punktów**\n",
"47. [Kilka przedwojennych książek](https://dziemiela.com/documents.htm)\n",
"48. [Historia polskiej informatyki](http://klio.spit.iq.pl/a4-wyroby-polskiej-informatyki/a4-2-sprzet/) - wyjątkowo bez datowania\n",
"49. [Zeszyty Formacyjne Katolickiego Stowarzyszenia „Civitas Christania”](http://podkarpacki.civitaschristiana.pl/formacja/zeszyty-formacyjne/), tylko niektóre pliki można zdatować\n",
"50. [Józef Piłsudski Institute of America](https://archiwa.pilsudski.org/) - **220 punktów**\n",
"51. [Prasa podziemna — Częstochowa](http://www.podziemie.com.pl), również ulotki i inne materiały skanowane - **180 punktów**\n",
"52. [Tajemnica Atari](http://krap.pl/mirrorz/atari/horror.mirage.com.pl/pixel/), plik ZIP z DjVu\n",
"\n",
"\n",
"### F.A.Q.\n",
"\n",
"**P: Nie działają strony z protokołem https, co zrobić?**\n",
"\n",
"O: Trzeba użyć modułu opartego na bibliotece curl. Paczka Ubuntu została zainstalowana na komputerach wydziałowych. Na\n",
"swoim komputerze możemy zainstalować paczkę libcurl4-openssl-dev, a\n",
"następnie można sobie ściągnąć wersję twilight-library opartą na libcurl:\n",
"\n",
" git fetch git://gonito.net/twilight-library withcurl\n",
" git merge FETCH_HEAD\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"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.9.1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 1. <i>Wyszukiwarki wprowadzenie</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -234,11 +248,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -249,8 +266,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "1.Wyszukiwarki wprowadzenie[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 2. <i>Wyszukiwarki roboty</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -262,21 +276,17 @@
"67. [Instytut Techniki Górniczej - wycinki](http://www.komag.gliwice.pl/archiwum/historia-komag)\n", "67. [Instytut Techniki Górniczej - wycinki](http://www.komag.gliwice.pl/archiwum/historia-komag)\n",
"\n" "\n"
] ]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -287,8 +297,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.9.1" "version": "3.8.3"
} },
"subtitle": "2.Wyszukiwarki roboty[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 3. <i>tfidf (1)</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -1065,21 +1079,17 @@
"$|D|$ - ilość dokumentów w korpusie\n", "$|D|$ - ilość dokumentów w korpusie\n",
"$|\\{d : t_i \\in d \\}|$ - ilość dokumentów w korpusie, gdzie dany term występuje chociaż jeden raz" "$|\\{d : t_i \\in d \\}|$ - ilość dokumentów w korpusie, gdzie dany term występuje chociaż jeden raz"
] ]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -1091,7 +1101,10 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.3" "version": "3.8.3"
} },
"subtitle": "3.tfidf (1)[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 3. <i>tfidf (1)</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 1,
@ -46,11 +60,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -62,7 +79,10 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.3" "version": "3.8.3"
} },
"subtitle": "3.tfidf (1)[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 3. <i>tfidf (2)</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -434,217 +448,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 21, "execution_count": null,
"metadata": { "metadata": {
"scrolled": false "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"From: ray@netcom.com (Ray Fischer)\n",
"Subject: Re: x86 ~= 680x0 ?? (How do they compare?)\n",
"Organization: Netcom. San Jose, California\n",
"Distribution: usa\n",
"Lines: 36\n",
"\n",
"dhk@ubbpc.uucp (Dave Kitabjian) writes ...\n",
">I'm sure Intel and Motorola are competing neck-and-neck for \n",
">crunch-power, but for a given clock speed, how do we rank the\n",
">following (from 1st to 6th):\n",
"> 486\t\t68040\n",
"> 386\t\t68030\n",
"> 286\t\t68020\n",
"\n",
"040 486 030 386 020 286\n",
"\n",
">While you're at it, where will the following fit into the list:\n",
"> 68060\n",
"> Pentium\n",
"> PowerPC\n",
"\n",
"060 fastest, then Pentium, with the first versions of the PowerPC\n",
"somewhere in the vicinity.\n",
"\n",
">And about clock speed: Does doubling the clock speed double the\n",
">overall processor speed? And fill in the __'s below:\n",
"> 68030 @ __ MHz = 68040 @ __ MHz\n",
"\n",
"No. Computer speed is only partly dependent of processor/clock speed.\n",
"Memory system speed play a large role as does video system speed and\n",
"I/O speed. As processor clock rates go up, the speed of the memory\n",
"system becomes the greatest factor in the overall system speed. If\n",
"you have a 50MHz processor, it can be reading another word from memory\n",
"every 20ns. Sure, you can put all 20ns memory in your computer, but\n",
"it will cost 10 times as much as the slower 80ns SIMMs.\n",
"\n",
"And roughly, the 68040 is twice as fast at a given clock\n",
"speed as is the 68030.\n",
"\n",
"-- \n",
"Ray Fischer \"Convictions are more dangerous enemies of truth\n",
"ray@netcom.com than lies.\" -- Friedrich Nietzsche\n",
"\n",
"0.4778416465020907\n",
"----------------------------------------------------------------------------------------------------\n",
"----------------------------------------------------------------------------------------------------\n",
"----------------------------------------------------------------------------------------------------\n",
"From: rvenkate@ux4.cso.uiuc.edu (Ravikuma Venkateswar)\n",
"Subject: Re: x86 ~= 680x0 ?? (How do they compare?)\n",
"Distribution: usa\n",
"Organization: University of Illinois at Urbana\n",
"Lines: 59\n",
"\n",
"ray@netcom.com (Ray Fischer) writes:\n",
"\n",
">dhk@ubbpc.uucp (Dave Kitabjian) writes ...\n",
">>I'm sure Intel and Motorola are competing neck-and-neck for \n",
">>crunch-power, but for a given clock speed, how do we rank the\n",
">>following (from 1st to 6th):\n",
">> 486\t\t68040\n",
">> 386\t\t68030\n",
">> 286\t\t68020\n",
"\n",
">040 486 030 386 020 286\n",
"\n",
"How about some numbers here? Some kind of benchmark?\n",
"If you want, let me start it - 486DX2-66 - 32 SPECint92, 16 SPECfp92 .\n",
"\n",
">>While you're at it, where will the following fit into the list:\n",
">> 68060\n",
">> Pentium\n",
">> PowerPC\n",
"\n",
">060 fastest, then Pentium, with the first versions of the PowerPC\n",
">somewhere in the vicinity.\n",
"\n",
"Numbers? Pentium @66MHz - 65 SPECint92, 57 SPECfp92 .\n",
"\t PowerPC @66MHz - 50 SPECint92, 80 SPECfp92 . (Note this is the 601)\n",
" (Alpha @150MHz - 74 SPECint92,126 SPECfp92 - just for comparison)\n",
"\n",
">>And about clock speed: Does doubling the clock speed double the\n",
">>overall processor speed? And fill in the __'s below:\n",
">> 68030 @ __ MHz = 68040 @ __ MHz\n",
"\n",
">No. Computer speed is only partly dependent of processor/clock speed.\n",
">Memory system speed play a large role as does video system speed and\n",
">I/O speed. As processor clock rates go up, the speed of the memory\n",
">system becomes the greatest factor in the overall system speed. If\n",
">you have a 50MHz processor, it can be reading another word from memory\n",
">every 20ns. Sure, you can put all 20ns memory in your computer, but\n",
">it will cost 10 times as much as the slower 80ns SIMMs.\n",
"\n",
"Not in a clock-doubled system. There isn't a doubling in performance, but\n",
"it _is_ quite significant. Maybe about a 70% increase in performance.\n",
"\n",
"Besides, for 0 wait state performance, you'd need a cache anyway. I mean,\n",
"who uses a processor that runs at the speed of 80ns SIMMs? Note that this\n",
"memory speed corresponds to a clock speed of 12.5 MHz.\n",
"\n",
">And roughly, the 68040 is twice as fast at a given clock\n",
">speed as is the 68030.\n",
"\n",
"Numbers?\n",
"\n",
">-- \n",
">Ray Fischer \"Convictions are more dangerous enemies of truth\n",
">ray@netcom.com than lies.\" -- Friedrich Nietzsche\n",
"-- \n",
"Ravikumar Venkateswar\n",
"rvenkate@uiuc.edu\n",
"\n",
"A pun is a no' blessed form of whit.\n",
"\n",
"0.44292082969477664\n",
"----------------------------------------------------------------------------------------------------\n",
"----------------------------------------------------------------------------------------------------\n",
"----------------------------------------------------------------------------------------------------\n",
"From: ray@netcom.com (Ray Fischer)\n",
"Subject: Re: x86 ~= 680x0 ?? (How do they compare?)\n",
"Organization: Netcom. San Jose, California\n",
"Distribution: usa\n",
"Lines: 30\n",
"\n",
"rvenkate@ux4.cso.uiuc.edu (Ravikuma Venkateswar) writes ...\n",
">ray@netcom.com (Ray Fischer) writes:\n",
">>040 486 030 386 020 286\n",
">\n",
">How about some numbers here? Some kind of benchmark?\n",
"\n",
"Benchmarks are for marketing dweebs and CPU envy. OK, if it will make\n",
"you happy, the 486 is faster than the 040. BFD. Both architectures\n",
"are nearing then end of their lifetimes. And especially with the x86\n",
"architecture: good riddance.\n",
"\n",
">Besides, for 0 wait state performance, you'd need a cache anyway. I mean,\n",
">who uses a processor that runs at the speed of 80ns SIMMs? Note that this\n",
">memory speed corresponds to a clock speed of 12.5 MHz.\n",
"\n",
"The point being the processor speed is only one of many aspects of a\n",
"computers performance. Clock speed, processor, memory speed, CPU\n",
"architecture, I/O systems, even the application program all contribute \n",
"to the overall system performance.\n",
"\n",
">>And roughly, the 68040 is twice as fast at a given clock\n",
">>speed as is the 68030.\n",
">\n",
">Numbers?\n",
"\n",
"Look them up yourself.\n",
"\n",
"-- \n",
"Ray Fischer \"Convictions are more dangerous enemies of truth\n",
"ray@netcom.com than lies.\" -- Friedrich Nietzsche\n",
"\n",
"0.3491800997095306\n",
"----------------------------------------------------------------------------------------------------\n",
"----------------------------------------------------------------------------------------------------\n",
"----------------------------------------------------------------------------------------------------\n",
"From: mb4008@cehp11 (Morgan J Bullard)\n",
"Subject: Re: speeding up windows\n",
"Keywords: speed\n",
"Organization: University of Illinois at Urbana\n",
"Lines: 30\n",
"\n",
"djserian@flash.LakeheadU.Ca (Reincarnation of Elvis) writes:\n",
"\n",
">I have a 386/33 with 8 megs of memory\n",
"\n",
">I have noticed that lately when I use programs like WpfW or Corel Draw\n",
">my computer \"boggs\" down and becomes really sluggish!\n",
"\n",
">What can I do to increase performance? What should I turn on or off\n",
"\n",
">Will not loading wallpapers or stuff like that help when it comes to\n",
">the running speed of windows and the programs that run under it?\n",
"\n",
">Thanx in advance\n",
"\n",
">Derek\n",
"\n",
"1) make sure your hard drive is defragmented. This will speed up more than \n",
" just windows BTW. Use something like Norton's or PC Tools.\n",
"2) I _think_ that leaving the wall paper out will use less RAM and therefore\n",
" will speed up your machine but I could very will be wrong on this.\n",
"There's a good chance you've already done this but if not it may speed things\n",
"up. good luck\n",
"\t\t\t\tMorgan Bullard mb4008@coewl.cen.uiuc.edu\n",
"\t\t\t\t\t or mjbb@uxa.cso.uiuc.edu\n",
"\n",
">--\n",
">$_ /|$Derek J.P. Serianni $ E-Mail : djserian@flash.lakeheadu.ca $ \n",
">$\\'o.O' $Sociologist $ It's 106 miles to Chicago,we've got a full tank$\n",
">$=(___)=$Lakehead University $ of gas, half a pack of cigarettes,it's dark,and$\n",
">$ U $Thunder Bay, Ontario$ we're wearing sunglasses. -Elwood Blues $ \n",
"\n",
"0.26949927393886913\n",
"----------------------------------------------------------------------------------------------------\n",
"----------------------------------------------------------------------------------------------------\n",
"----------------------------------------------------------------------------------------------------\n"
]
}
],
"source": [ "source": [
"for i in range (1,5):\n", "for i in range (1,5):\n",
" print(newsgroups[similarities.argsort()[0][-i]])\n", " print(newsgroups[similarities.argsort()[0][-i]])\n",
@ -685,11 +493,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -701,7 +512,10 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.3" "version": "3.8.3"
} },
"subtitle": "3.tfidf (2)[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 4. <i>Wyszukiwarki</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -71,21 +85,17 @@
" * proszę zaznaczyć w MS TEAMS, że Państwo zrobili zadanie w assigments\n", " * proszę zaznaczyć w MS TEAMS, że Państwo zrobili zadanie w assigments\n",
" * zdawanie zadania będzie na zajęciach. Proszę przygotować prezentację do 5 minut" " * zdawanie zadania będzie na zajęciach. Proszę przygotować prezentację do 5 minut"
] ]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -96,8 +106,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.9.1" "version": "3.8.3"
} },
"subtitle": "4.wyszukiwarki[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 5. <i>Ekstrakcja informacji z dokumentów</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -213,11 +227,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -229,7 +246,10 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.3" "version": "3.8.3"
} },
"subtitle": "5.ekEtrakcja informacji z dokumentCCow[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 6. <i>Klasyfikacja</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -253,104 +267,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"['New_York',\n",
" 'New_York',\n",
" 'Delaware',\n",
" 'Massachusetts',\n",
" 'Delaware',\n",
" 'Washington',\n",
" 'Delaware',\n",
" 'New_Jersey',\n",
" 'New_York',\n",
" 'NONE',\n",
" 'NONE',\n",
" 'Delaware',\n",
" 'Delaware',\n",
" 'Delaware',\n",
" 'New_York',\n",
" 'Massachusetts',\n",
" 'Minnesota',\n",
" 'California',\n",
" 'New_York',\n",
" 'California',\n",
" 'Iowa',\n",
" 'California',\n",
" 'Virginia',\n",
" 'North_Carolina',\n",
" 'Arizona',\n",
" 'Indiana',\n",
" 'New_Jersey',\n",
" 'California',\n",
" 'Delaware',\n",
" 'Georgia',\n",
" 'New_York',\n",
" 'New_York',\n",
" 'California',\n",
" 'Minnesota',\n",
" 'California',\n",
" 'Kentucky',\n",
" 'Minnesota',\n",
" 'Ohio',\n",
" 'Michigan',\n",
" 'California',\n",
" 'Minnesota',\n",
" 'California',\n",
" 'Delaware',\n",
" 'Illinois',\n",
" 'Minnesota',\n",
" 'Texas',\n",
" 'New_Jersey',\n",
" 'Delaware',\n",
" 'Washington',\n",
" 'NONE',\n",
" 'Delaware',\n",
" 'Oregon',\n",
" 'Delaware',\n",
" 'Delaware',\n",
" 'Delaware',\n",
" 'Massachusetts',\n",
" 'California',\n",
" 'NONE',\n",
" 'Delaware',\n",
" 'Illinois',\n",
" 'Idaho',\n",
" 'Washington',\n",
" 'New_York',\n",
" 'New_York',\n",
" 'California',\n",
" 'Utah',\n",
" 'Delaware',\n",
" 'Washington',\n",
" 'Virginia',\n",
" 'New_York',\n",
" 'New_York',\n",
" 'Illinois',\n",
" 'California',\n",
" 'Delaware',\n",
" 'NONE',\n",
" 'Texas',\n",
" 'California',\n",
" 'Washington',\n",
" 'Delaware',\n",
" 'Washington',\n",
" 'New_York',\n",
" 'Washington',\n",
" 'Illinois']"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"dev_expected_jurisdiction" "dev_expected_jurisdiction"
] ]
@ -942,11 +863,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -958,7 +882,10 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.3" "version": "3.8.3"
} },
"subtitle": "6.Klasyfikacja[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 6. <i>Klasyfikacja</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -253,104 +267,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"['New_York',\n",
" 'New_York',\n",
" 'Delaware',\n",
" 'Massachusetts',\n",
" 'Delaware',\n",
" 'Washington',\n",
" 'Delaware',\n",
" 'New_Jersey',\n",
" 'New_York',\n",
" 'NONE',\n",
" 'NONE',\n",
" 'Delaware',\n",
" 'Delaware',\n",
" 'Delaware',\n",
" 'New_York',\n",
" 'Massachusetts',\n",
" 'Minnesota',\n",
" 'California',\n",
" 'New_York',\n",
" 'California',\n",
" 'Iowa',\n",
" 'California',\n",
" 'Virginia',\n",
" 'North_Carolina',\n",
" 'Arizona',\n",
" 'Indiana',\n",
" 'New_Jersey',\n",
" 'California',\n",
" 'Delaware',\n",
" 'Georgia',\n",
" 'New_York',\n",
" 'New_York',\n",
" 'California',\n",
" 'Minnesota',\n",
" 'California',\n",
" 'Kentucky',\n",
" 'Minnesota',\n",
" 'Ohio',\n",
" 'Michigan',\n",
" 'California',\n",
" 'Minnesota',\n",
" 'California',\n",
" 'Delaware',\n",
" 'Illinois',\n",
" 'Minnesota',\n",
" 'Texas',\n",
" 'New_Jersey',\n",
" 'Delaware',\n",
" 'Washington',\n",
" 'NONE',\n",
" 'Delaware',\n",
" 'Oregon',\n",
" 'Delaware',\n",
" 'Delaware',\n",
" 'Delaware',\n",
" 'Massachusetts',\n",
" 'California',\n",
" 'NONE',\n",
" 'Delaware',\n",
" 'Illinois',\n",
" 'Idaho',\n",
" 'Washington',\n",
" 'New_York',\n",
" 'New_York',\n",
" 'California',\n",
" 'Utah',\n",
" 'Delaware',\n",
" 'Washington',\n",
" 'Virginia',\n",
" 'New_York',\n",
" 'New_York',\n",
" 'Illinois',\n",
" 'California',\n",
" 'Delaware',\n",
" 'NONE',\n",
" 'Texas',\n",
" 'California',\n",
" 'Washington',\n",
" 'Delaware',\n",
" 'Washington',\n",
" 'New_York',\n",
" 'Washington',\n",
" 'Illinois']"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"dev_expected_jurisdiction" "dev_expected_jurisdiction"
] ]
@ -462,18 +383,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 17, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/kuba/anaconda3/lib/python3.8/site-packages/gensim/similarities/__init__.py:15: UserWarning: The gensim.similarities.levenshtein submodule is disabled, because the optional Levenshtein package <https://pypi.org/project/python-Levenshtein/> is unavailable. Install Levenhstein (e.g. `pip install python-Levenshtein`) to suppress this warning.\n",
" warnings.warn(msg)\n"
]
}
],
"source": [ "source": [
"from sklearn.datasets import fetch_20newsgroups\n", "from sklearn.datasets import fetch_20newsgroups\n",
"# https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html\n", "# https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html\n",
@ -1088,11 +1000,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -1104,7 +1019,10 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.3" "version": "3.8.3"
} },
"subtitle": "6.Klasyfikacja[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 7. <i>Regresja liniowa</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -443,28 +457,28 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/1.png)" "![regresja liniowa 1](obrazki/1.png)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/2.png)" "![regresja liniowa 2](obrazki/2.png)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/3.png)" "![regresja liniowa 3](obrazki/3.png)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/4.png)" "![regresja liniowa 4](obrazki/4.png)"
] ]
}, },
{ {
@ -559,14 +573,14 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/6.png)" "![RMSE 2](obrazki/6.png)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/5.png)" "![RMSE 2](obrazki/5.png)"
] ]
}, },
{ {
@ -1015,9 +1029,9 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/9.png)\n", "![RMSE 3](obrazki/9.png)\n",
"\n", "\n",
"![a](obrazki/10.png)" "![RMSE 4](obrazki/10.png)"
] ]
}, },
{ {
@ -1046,11 +1060,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -1061,8 +1078,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "7.Regresja liniowa[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 7. <i>Regresja liniowa</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -442,28 +456,28 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/1.png)" "![regresja liniowa 1](obrazki/1.png)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/2.png)" "![regresja liniowa 2](obrazki/2.png)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/3.png)" "![regresja liniowa 3](obrazki/3.png)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/4.png)" "![regresja liniowa 4](obrazki/4.png)"
] ]
}, },
{ {
@ -602,7 +616,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/6.png)" "![RMSE 1](obrazki/6.png)"
] ]
}, },
{ {
@ -777,9 +791,9 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/7.png)\n", "![RMSE 2](obrazki/7.png)\n",
"\n", "\n",
"![a](obrazki/8.png)\n", "![RMSE 3](obrazki/8.png)\n",
"\n" "\n"
] ]
}, },
@ -1323,9 +1337,9 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![a](obrazki/9.png)\n", "![RMSE 5](obrazki/9.png)\n",
"\n", "\n",
"![a](obrazki/10.png)" "![6](obrazki/10.png)"
] ]
}, },
{ {
@ -1354,11 +1368,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -1369,8 +1386,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "7.Regresja liniowa[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 8. <i>Regresja logistyczna</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -16,20 +30,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"/media/kuba/ssdsam/anaconda3/lib/python3.8/site-packages/gensim/similarities/__init__.py:15: UserWarning: The gensim.similarities.levenshtein submodule is disabled, because the optional Levenshtein package <https://pypi.org/project/python-Levenshtein/> is unavailable. Install Levenhstein (e.g. `pip install python-Levenshtein`) to suppress this warning.\n",
" warnings.warn(msg)\n"
]
}
],
"source": [ "source": [
"import numpy as np\n", "import numpy as np\n",
"import gensim\n", "import gensim\n",
@ -1024,11 +1029,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -1039,8 +1047,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "8.Regresja logistyczna[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 8. <i>Regresja logistyczna</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -16,20 +30,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"/media/kuba/ssdsam/anaconda3/lib/python3.8/site-packages/gensim/similarities/__init__.py:15: UserWarning: The gensim.similarities.levenshtein submodule is disabled, because the optional Levenshtein package <https://pypi.org/project/python-Levenshtein/> is unavailable. Install Levenhstein (e.g. `pip install python-Levenshtein`) to suppress this warning.\n",
" warnings.warn(msg)\n"
]
}
],
"source": [ "source": [
"import numpy as np\n", "import numpy as np\n",
"import gensim\n", "import gensim\n",
@ -1216,11 +1221,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -1231,8 +1239,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "8.Regresja logistyczna[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 9. <i>Sequence labeling</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -908,11 +922,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -923,8 +940,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "9.Sequence labeling[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 10. <i>CRF</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -404,11 +418,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -419,8 +436,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "10.CRF[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 11. <i>NER RNN</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -9,18 +23,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"/media/kuba/ssdsam/anaconda3/lib/python3.8/site-packages/gensim/similarities/__init__.py:15: UserWarning: The gensim.similarities.levenshtein submodule is disabled, because the optional Levenshtein package <https://pypi.org/project/python-Levenshtein/> is unavailable. Install Levenhstein (e.g. `pip install python-Levenshtein`) to suppress this warning.\n",
" warnings.warn(msg)\n"
]
}
],
"source": [ "source": [
"import numpy as np\n", "import numpy as np\n",
"import gensim\n", "import gensim\n",
@ -46,19 +51,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": { "metadata": {
"scrolled": false "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"Reusing dataset conll2003 (/home/kuba/.cache/huggingface/datasets/conll2003/conll2003/1.0.0/40e7cb6bcc374f7c349c83acd1e9352a4f09474eb691f64f364ee62eb65d0ca6)\n"
]
}
],
"source": [ "source": [
"dataset = load_dataset(\"conll2003\")" "dataset = load_dataset(\"conll2003\")"
] ]
@ -418,227 +415,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 26, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": false
}, },
"outputs": [ "outputs": [],
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "75184b632ce54ae690b3444778f44651",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "74a55a414fa948a3b251b89f780564d0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.5068524970963996, 0.5072649075903755, 0.5070586184860281)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0c9c580076fb4ec48b7ea2f300878594",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0be8681c67f64aca95ce5d3c44f10538",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.653649243957614, 0.6381494827385795, 0.6458063757205035)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2dec403004bb4ae298bc73553ea3f4bc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "eebed0407ba343e29cf8c2d607f631dc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.7140486069946651, 0.7001046146693014, 0.7070078647728607)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "70792f22eea343c8916bcfcf9215c298",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5d400bf1b656433ba2091cf750ec2d78",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.756327964151629, 0.725909566430315, 0.7408066429418744)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "604c4fa13c03435d81bf68be37977d74",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2f78871f366f4fd1b7de6c4be5303906",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.7963248522230789, 0.7203301174009067, 0.7564235581324383)\n"
]
}
],
"source": [ "source": [
"for i in range(NUM_EPOCHS):\n", "for i in range(NUM_EPOCHS):\n",
" lstm.train()\n", " lstm.train()\n",
@ -805,11 +586,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -820,8 +604,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "11.NER RNN[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 11. <i>NER RNN</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -9,18 +23,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"/media/kuba/ssdsam/anaconda3/lib/python3.8/site-packages/gensim/similarities/__init__.py:15: UserWarning: The gensim.similarities.levenshtein submodule is disabled, because the optional Levenshtein package <https://pypi.org/project/python-Levenshtein/> is unavailable. Install Levenhstein (e.g. `pip install python-Levenshtein`) to suppress this warning.\n",
" warnings.warn(msg)\n"
]
}
],
"source": [ "source": [
"import numpy as np\n", "import numpy as np\n",
"import gensim\n", "import gensim\n",
@ -46,26 +51,18 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": { "metadata": {
"scrolled": false "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"Reusing dataset conll2003 (/home/kuba/.cache/huggingface/datasets/conll2003/conll2003/1.0.0/40e7cb6bcc374f7c349c83acd1e9352a4f09474eb691f64f364ee62eb65d0ca6)\n"
]
}
],
"source": [ "source": [
"dataset = load_dataset(\"conll2003\")" "dataset = load_dataset(\"conll2003\")"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -78,7 +75,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -87,47 +84,25 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"23627"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"len(vocab.itos)" "len(vocab.itos)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"15"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"vocab['on']" "vocab['on']"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -137,7 +112,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -147,7 +122,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -156,7 +131,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -165,7 +140,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -174,7 +149,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
@ -185,7 +160,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 13, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -194,7 +169,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -203,82 +178,36 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 15, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"tensor([ 2, 966, 22409, 238, 773, 9, 4588, 212, 7686, 4,\n",
" 3])"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"train_tokens_ids[0]" "train_tokens_ids[0]"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 16, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"{'chunk_tags': [11, 21, 11, 12, 21, 22, 11, 12, 0],\n",
" 'id': '0',\n",
" 'ner_tags': [3, 0, 7, 0, 0, 0, 7, 0, 0],\n",
" 'pos_tags': [22, 42, 16, 21, 35, 37, 16, 21, 7],\n",
" 'tokens': ['EU',\n",
" 'rejects',\n",
" 'German',\n",
" 'call',\n",
" 'to',\n",
" 'boycott',\n",
" 'British',\n",
" 'lamb',\n",
" '.']}"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"dataset['train'][0]" "dataset['train'][0]"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 17, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"tensor([0, 3, 0, 7, 0, 0, 0, 7, 0, 0, 0])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"train_labels[0]" "train_labels[0]"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 18, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -326,7 +255,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 19, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -335,7 +264,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 20, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -359,7 +288,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 21, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -368,7 +297,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 22, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -377,7 +306,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 23, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -386,7 +315,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 24, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -409,7 +338,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 25, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -418,227 +347,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 26, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "75184b632ce54ae690b3444778f44651",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "74a55a414fa948a3b251b89f780564d0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.5068524970963996, 0.5072649075903755, 0.5070586184860281)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0c9c580076fb4ec48b7ea2f300878594",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0be8681c67f64aca95ce5d3c44f10538",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.653649243957614, 0.6381494827385795, 0.6458063757205035)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2dec403004bb4ae298bc73553ea3f4bc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "eebed0407ba343e29cf8c2d607f631dc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.7140486069946651, 0.7001046146693014, 0.7070078647728607)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "70792f22eea343c8916bcfcf9215c298",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5d400bf1b656433ba2091cf750ec2d78",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.756327964151629, 0.725909566430315, 0.7408066429418744)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "604c4fa13c03435d81bf68be37977d74",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2f78871f366f4fd1b7de6c4be5303906",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.7963248522230789, 0.7203301174009067, 0.7564235581324383)\n"
]
}
],
"source": [ "source": [
"for i in range(NUM_EPOCHS):\n", "for i in range(NUM_EPOCHS):\n",
" lstm.train()\n", " lstm.train()\n",
@ -663,106 +376,31 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 27, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5159f7a61c3a439bab45573f15ea55b2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"text/plain": [
"(0.7963248522230789, 0.7203301174009067, 0.7564235581324383)"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"eval_model(validation_tokens_ids, validation_labels, lstm)" "eval_model(validation_tokens_ids, validation_labels, lstm)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 28, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4b604bbb796f4d4cb99528fad98cfdff",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3453.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"text/plain": [
"(0.7450810185185185, 0.6348619329388561, 0.685569755058573)"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"eval_model(test_tokens_ids, test_labels, lstm)" "eval_model(test_tokens_ids, test_labels, lstm)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 29, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"14041"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"len(train_tokens_ids)" "len(train_tokens_ids)"
] ]
@ -789,7 +427,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 30, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -816,7 +454,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 31, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -825,7 +463,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 32, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -834,7 +472,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 33, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -843,7 +481,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 34, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -852,227 +490,11 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 35, "execution_count": null,
"metadata": { "metadata": {
"scrolled": true "scrolled": true
}, },
"outputs": [ "outputs": [],
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a0b15b129c294730ab2a6035b9a98b47",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b7b3bc93dc7349949b59f97751ebdec2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.6431379891406104, 0.39927932116703474, 0.49268502581755597)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0fa832ed33e3451ebc241046ea299d2e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "953a62a22eb44de4a33b0e1c53a472f0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.6638910917261432, 0.5838660932232942, 0.6213123879027769)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5efce69cb2e246d2adababcc18780083",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cb7cde559dd544b0961fa4c855b856d8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.6697936210131332, 0.7054515866558178, 0.6871603260869565)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d7211ba79faa4de3aeafff4ef39bbaf1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2a8dbd5393fa4ee2a8ee72738efa2a57",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.7091097308488613, 0.7166104847146344, 0.7128403769439787)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "84d0b4b0e1ec4c1a88aff0698836a362",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=14041.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "31a2f0a285e44a55a7b583a81511dbc2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=3250.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"(0.7708963348252087, 0.740788097175404, 0.755542382928275)\n"
]
}
],
"source": [ "source": [
"for i in range(NUM_EPOCHS):\n", "for i in range(NUM_EPOCHS):\n",
" gru.train()\n", " gru.train()\n",
@ -1114,11 +536,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -1129,8 +554,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.5" "version": "3.8.3"
} },
"subtitle": "11.NER RNN[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

690
cw/12_transformery.ipynb Normal file
View File

@ -0,0 +1,690 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 12. <i>Transformery</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# bpe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"pip install tokenizers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://github.com/huggingface/tokenizers/tree/master/bindings/python"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from tokenizers import Tokenizer, models, trainers"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from tokenizers.trainers import BpeTrainer"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = Tokenizer(models.BPE())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"trainer = trainers.BpeTrainer(vocab_size=20000, min_frequency=2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://wolnelektury.pl/media/book/txt/pan-tadeusz.txt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer.train(files = ['/home/kuba/Syncthing/przedmioty/2020-02/ISI/zajecia9_ngramowy_model_jDDezykowy/pan-tadeusz-train.txt'], trainer = trainer)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output = tokenizer.encode(\"Nie śpiewają piosenek: pracują leniwo,\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output.ids"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output.tokens"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer.save(\"./my-bpe.tokenizer.json\", pretty=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ZADANIE\n",
"stworzyć BPE tokenizer na podstawie https://git.wmi.amu.edu.pl/kubapok/lalka-lm/src/branch/master/train/train.tsv\n",
"i stworzyć stokenizowaną listę: \n",
"https://git.wmi.amu.edu.pl/kubapok/lalka-lm/src/branch/master/test-A/in.tsv\n",
"\n",
"wybrać vocab_size = 8k, uwzględnić dodatkowe tokeny: BOS oraz EOS i wpleść je do zbioru testowego"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# transformery"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# pip install transformers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"przykłady pochodzą częściowo z: https://huggingface.co/"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import torch"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import pipeline, set_seed"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import RobertaTokenizer, RobertaModel"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = RobertaTokenizer.from_pretrained('roberta-base')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model = RobertaModel.from_pretrained('roberta-base')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"text = \"Replace me by any text you'd like. Bla Bla\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoded_input = tokenizer(text, return_tensors='pt')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoded_input['input_ids']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoded_input['input_ids']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer.decode([162])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output = model(**encoded_input)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"output"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://huggingface.co/transformers/main_classes/output.html#basemodeloutputwithpoolingandcrossattentionsM"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://arxiv.org/pdf/1907.11692.pdf"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[0].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"\n",
"output[1].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output = model(**encoded_input, output_hidden_states=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output[2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"output[2][0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[2][0].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[2][1].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[2][12].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output = model(**encoded_input, output_attentions=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output[2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[2][0].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"output[2][2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## gotowe api"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### generowanie tekstu"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model = pipeline('text-generation', model='gpt2')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(\"Hello, I'm a computer science student\", max_length=30, num_return_sequences=5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"model(\"I want to contribute to Google's Computer Vision Program, which is doing extensive work on big\", max_length=30, num_return_sequences=5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### sentiment analysis"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import pipeline\n",
"\n",
"model = pipeline(\"sentiment-analysis\", model='distilbert-base-uncased-finetuned-sst-2-english')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(\"I'm very happy. Today is the beatifull weather\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(\"It's raining. What a terrible day...\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## NER"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model = pipeline(\"sentiment-analysis\", model='distilbert-base-uncased-finetuned-sst-2-english')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import pipeline\n",
"model = pipeline(\"ner\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"text = \"George Washington went to Washington\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(text)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### masked language modelling"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ZADANIE (10 minut)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"przewidzieć <mask> token w \"The world <MASK> II started in 1939\"\" wg dowolnego anglojęzycznego modelu"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### text summarization"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"summarizer = pipeline(\"summarization\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ARTICLE = \"\"\" New York (CNN)When Liana Barrientos was 23 years old, she got married in Westchester County, New York.\n",
"A year later, she got married again in Westchester County, but to a different man and without divorcing her first husband.\n",
"Only 18 days after that marriage, she got hitched yet again. Then, Barrientos declared \"I do\" five more times, sometimes only within two weeks of each other.\n",
"In 2010, she married once more, this time in the Bronx. In an application for a marriage license, she stated it was her \"first and only\" marriage.\n",
"Barrientos, now 39, is facing two criminal counts of \"offering a false instrument for filing in the first degree,\" referring to her false statements on the\n",
"2010 marriage license application, according to court documents.\n",
"Prosecutors said the marriages were part of an immigration scam.\n",
"On Friday, she pleaded not guilty at State Supreme Court in the Bronx, according to her attorney, Christopher Wright, who declined to comment further.\n",
"After leaving court, Barrientos was arrested and charged with theft of service and criminal trespass for allegedly sneaking into the New York subway through an emergency exit, said Detective\n",
"Annette Markowski, a police spokeswoman. In total, Barrientos has been married 10 times, with nine of her marriages occurring between 1999 and 2002.\n",
"All occurred either in Westchester County, Long Island, New Jersey or the Bronx. She is believed to still be married to four men, and at one time, she was married to eight men at once, prosecutors say.\n",
"Prosecutors said the immigration scam involved some of her husbands, who filed for permanent residence status shortly after the marriages.\n",
"Any divorces happened only after such filings were approved. It was unclear whether any of the men will be prosecuted.\n",
"The case was referred to the Bronx District Attorney\\'s Office by Immigration and Customs Enforcement and the Department of Homeland Security\\'s\n",
"Investigation Division. Seven of the men are from so-called \"red-flagged\" countries, including Egypt, Turkey, Georgia, Pakistan and Mali.\n",
"Her eighth husband, Rashid Rajput, was deported in 2006 to his native Pakistan after an investigation by the Joint Terrorism Task Force.\n",
"If convicted, Barrientos faces up to four years in prison. Her next court appearance is scheduled for May 18.\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(summarizer(ARTICLE, max_length=130, min_length=30, do_sample=False))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ZADANIE DOMOWE"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- sforkować repozytorium: https://git.wmi.amu.edu.pl/kubapok/paranormal-or-skeptic-ISI-public\n",
"- finetunować klasyfikator bazujący na jakieś pretrenowanej sieć typu transformer (np BERT, Roberta). Można użyć dowolnej biblioteki\n",
" (np hugging face, fairseq)\n",
"- stworzyć predykcje w plikach dev-0/out.tsv oraz test-A/out.tsv\n",
"- wynik accuracy sprawdzony za pomocą narzędzia geval (patrz poprzednie zadanie) powinien wynosić conajmniej 0.67\n",
"- proszę umieścić predykcję oraz skrypty generujące (w postaci tekstowej a nie jupyter) w repo, a w MS TEAMS umieścić link do swojego repo\n",
"termin 22.06, 60 punktów\n"
]
}
],
"metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.8.3"
},
"subtitle": "12.Transformery[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@ -0,0 +1,802 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 12. <i>Transformery</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# bpe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"pip install tokenizers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://github.com/huggingface/tokenizers/tree/master/bindings/python"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from tokenizers import Tokenizer, models, trainers"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from tokenizers.trainers import BpeTrainer"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = Tokenizer(models.BPE())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"trainer = trainers.BpeTrainer(vocab_size=20000, min_frequency=2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://wolnelektury.pl/media/book/txt/pan-tadeusz.txt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer.train(files = ['/home/kuba/Syncthing/przedmioty/2020-02/ISI/zajecia9_ngramowy_model_jDDezykowy/pan-tadeusz-train.txt'], trainer = trainer)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output = tokenizer.encode(\"Nie śpiewają piosenek: pracują leniwo,\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output.ids"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output.tokens"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer.save(\"./my-bpe.tokenizer.json\", pretty=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ZADANIE\n",
"stworzyć BPE tokenizer na podstawie https://git.wmi.amu.edu.pl/kubapok/lalka-lm/src/branch/master/train/train.tsv\n",
"i stworzyć stokenizowaną listę: \n",
"https://git.wmi.amu.edu.pl/kubapok/lalka-lm/src/branch/master/test-A/in.tsv\n",
"\n",
"wybrać vocab_size = 8k, uwzględnić dodatkowe tokeny: BOS oraz EOS i wpleść je do zbioru testowego"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = Tokenizer(models.BPE())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"trainer = trainers.BpeTrainer(vocab_size=8000, special_tokens=[\"[BOS]\", \"[EOS]\"])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer.train(files = ['/home/kuba/Syncthing/przedmioty/2020-02/ISI/zajecia12_transformers/lalka-lm/train/train_with_special_tokens'], trainer = trainer)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"test_path = '/home/kuba/Syncthing/przedmioty/2020-02/ISI/zajecia12_transformers/lalka-lm/train/train.tsv'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with open(test_path, 'r') as test_in:\n",
" test_lines = ['[BOS] ' + x.rstrip('\\n') + ' [EOS]' for x in test_in.readlines()]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"test_lines"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenized = [tokenizer.encode(x) for x in test_lines]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenized"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"tokenized[0].tokens"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenized[0].tokens"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# transformery"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# pip install transformers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"przykłady pochodzą częściowo z: https://huggingface.co/"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import torch"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import pipeline, set_seed"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import RobertaTokenizer, RobertaModel"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = RobertaTokenizer.from_pretrained('roberta-base')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model = RobertaModel.from_pretrained('roberta-base')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"text = \"Replace me by any text you'd like. Bla Bla\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoded_input = tokenizer(text, return_tensors='pt')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoded_input['input_ids']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoded_input['input_ids']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer.decode([162])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output = model(**encoded_input)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"output"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://huggingface.co/transformers/main_classes/output.html#basemodeloutputwithpoolingandcrossattentionsM"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://arxiv.org/pdf/1907.11692.pdf"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[0].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"\n",
"output[1].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output = model(**encoded_input, output_hidden_states=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output[2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"output[2][0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[2][0].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[2][1].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[2][12].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output = model(**encoded_input, output_attentions=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(output[2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"output[2][0].shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"output[2][2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## gotowe api"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### generowanie tekstu"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model = pipeline('text-generation', model='gpt2')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(\"Hello, I'm a computer science student\", max_length=30, num_return_sequences=5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"model(\"I want to contribute to Google's Computer Vision Program, which is doing extensive work on big\", max_length=30, num_return_sequences=5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### sentiment analysis"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import pipeline\n",
"\n",
"model = pipeline(\"sentiment-analysis\", model='distilbert-base-uncased-finetuned-sst-2-english')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(\"I'm very happy. Today is the beatifull weather\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(\"It's raining. What a terrible day...\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## NER"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model = pipeline(\"sentiment-analysis\", model='distilbert-base-uncased-finetuned-sst-2-english')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import pipeline\n",
"model = pipeline(\"ner\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"text = \"George Washington went to Washington\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(text)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### masked language modelling"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"### ZADANIE (10 minut)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"przewidziać <mask> token w \"The world <MASK> II started in 1939\"\" wg dowolnego anglojęzycznego modelu"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model = pipeline(\"fill-mask\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model(f\"The world {model.tokenizer.mask_token} II started in 1939\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### text summarization"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"summarizer = pipeline(\"summarization\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ARTICLE = \"\"\" New York (CNN)When Liana Barrientos was 23 years old, she got married in Westchester County, New York.\n",
"A year later, she got married again in Westchester County, but to a different man and without divorcing her first husband.\n",
"Only 18 days after that marriage, she got hitched yet again. Then, Barrientos declared \"I do\" five more times, sometimes only within two weeks of each other.\n",
"In 2010, she married once more, this time in the Bronx. In an application for a marriage license, she stated it was her \"first and only\" marriage.\n",
"Barrientos, now 39, is facing two criminal counts of \"offering a false instrument for filing in the first degree,\" referring to her false statements on the\n",
"2010 marriage license application, according to court documents.\n",
"Prosecutors said the marriages were part of an immigration scam.\n",
"On Friday, she pleaded not guilty at State Supreme Court in the Bronx, according to her attorney, Christopher Wright, who declined to comment further.\n",
"After leaving court, Barrientos was arrested and charged with theft of service and criminal trespass for allegedly sneaking into the New York subway through an emergency exit, said Detective\n",
"Annette Markowski, a police spokeswoman. In total, Barrientos has been married 10 times, with nine of her marriages occurring between 1999 and 2002.\n",
"All occurred either in Westchester County, Long Island, New Jersey or the Bronx. She is believed to still be married to four men, and at one time, she was married to eight men at once, prosecutors say.\n",
"Prosecutors said the immigration scam involved some of her husbands, who filed for permanent residence status shortly after the marriages.\n",
"Any divorces happened only after such filings were approved. It was unclear whether any of the men will be prosecuted.\n",
"The case was referred to the Bronx District Attorney\\'s Office by Immigration and Customs Enforcement and the Department of Homeland Security\\'s\n",
"Investigation Division. Seven of the men are from so-called \"red-flagged\" countries, including Egypt, Turkey, Georgia, Pakistan and Mali.\n",
"Her eighth husband, Rashid Rajput, was deported in 2006 to his native Pakistan after an investigation by the Joint Terrorism Task Force.\n",
"If convicted, Barrientos faces up to four years in prison. Her next court appearance is scheduled for May 18.\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(summarizer(ARTICLE, max_length=130, min_length=30, do_sample=False))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ZADANIE DOMOWE"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- sforkować repozytorium: https://git.wmi.amu.edu.pl/kubapok/paranormal-or-skeptic-ISI-public\n",
"- finetunować klasyfikator bazujący na jakieś pretrenowanej sieć typu transformer (np BERT, Roberta). Można użyć dowolnej biblioteki\n",
" (np hugging face, fairseq)\n",
"- stworzyć predykcje w plikach dev-0/out.tsv oraz test-A/out.tsv\n",
"- wynik accuracy sprawdzony za pomocą narzędzia geval (patrz poprzednie zadanie) powinien wynosić conajmniej 0.67\n",
"- proszę umieścić predykcję oraz skrypty generujące (w postaci tekstowej a nie jupyter) w repo, a w MS TEAMS umieścić link do swojego repo\n",
"termin 22.06, 60 punktów\n"
]
}
],
"metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.8.3"
},
"subtitle": "12.Transformery[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

243
cw/13_transformery2.ipynb Normal file
View File

@ -0,0 +1,243 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 13. <i>Transformery 2</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wizualizacja atencji\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://github.com/jessevig/bertviz"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"!pip install bertviz"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import AutoTokenizer, AutoModel\n",
"from bertviz import model_view, head_view"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"TEXT = \"This is a sample input sentence for a transformer model\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"MODEL = \"distilbert-base-uncased\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = AutoTokenizer.from_pretrained(MODEL)\n",
"model = AutoModel.from_pretrained(MODEL, output_attentions=True)\n",
"inputs = tokenizer.encode(TEXT, return_tensors='pt')\n",
"outputs = model(inputs)\n",
"attention = outputs[-1]\n",
"tokens = tokenizer.convert_ids_to_tokens(inputs[0]) \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SELF ATTENTION MODELS"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"head_view(attention, tokens)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model_view(attention, tokens)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ENCODER-DECODER MODELS"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"MODEL = \"Helsinki-NLP/opus-mt-en-de\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"TEXT_ENCODER = \"She sees the small elephant.\"\n",
"TEXT_DECODER = \"Sie sieht den kleinen Elefanten.\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = AutoTokenizer.from_pretrained(MODEL)\n",
"model = AutoModel.from_pretrained(MODEL, output_attentions=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoder_input_ids = tokenizer(TEXT_ENCODER, return_tensors=\"pt\", add_special_tokens=True).input_ids\n",
"decoder_input_ids = tokenizer(TEXT_DECODER, return_tensors=\"pt\", add_special_tokens=True).input_ids\n",
"\n",
"outputs = model(input_ids=encoder_input_ids, decoder_input_ids=decoder_input_ids)\n",
"\n",
"encoder_text = tokenizer.convert_ids_to_tokens(encoder_input_ids[0])\n",
"decoder_text = tokenizer.convert_ids_to_tokens(decoder_input_ids[0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"head_view(\n",
" encoder_attention=outputs.encoder_attentions,\n",
" decoder_attention=outputs.decoder_attentions,\n",
" cross_attention=outputs.cross_attentions,\n",
" encoder_tokens= encoder_text,\n",
" decoder_tokens = decoder_text\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"model_view(\n",
" encoder_attention=outputs.encoder_attentions,\n",
" decoder_attention=outputs.decoder_attentions,\n",
" cross_attention=outputs.cross_attentions,\n",
" encoder_tokens= encoder_text,\n",
" decoder_tokens = decoder_text\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie (10 minut)\n",
"\n",
"Za pomocą modelu en-fr przetłumacz dowolne zdanie z angielskiego na język francuski i sprawdź wagi atencji dla tego tłumaczenia"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### PRZYKŁAD: GPT3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ZADANIE DOMOWE - POLEVAL"
]
}
],
"metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.8.3"
},
"subtitle": "13.Transformery 2[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@ -0,0 +1,336 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 13. <i>Transformery 2</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wizualizacja atencji\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://github.com/jessevig/bertviz"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"!pip install bertviz"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import AutoTokenizer, AutoModel\n",
"from bertviz import model_view, head_view"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"TEXT = \"This is a sample input sentence for a transformer model\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"MODEL = \"distilbert-base-uncased\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = AutoTokenizer.from_pretrained(MODEL)\n",
"model = AutoModel.from_pretrained(MODEL, output_attentions=True)\n",
"inputs = tokenizer.encode(TEXT, return_tensors='pt')\n",
"outputs = model(inputs)\n",
"attention = outputs[-1]\n",
"tokens = tokenizer.convert_ids_to_tokens(inputs[0]) \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SELF ATTENTION MODELS"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"head_view(attention, tokens)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model_view(attention, tokens)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ENCODER-DECODER MODELS"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"MODEL = \"Helsinki-NLP/opus-mt-en-de\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"TEXT_ENCODER = \"She sees the small elephant.\"\n",
"TEXT_DECODER = \"Sie sieht den kleinen Elefanten.\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = AutoTokenizer.from_pretrained(MODEL)\n",
"model = AutoModel.from_pretrained(MODEL, output_attentions=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoder_input_ids = tokenizer(TEXT_ENCODER, return_tensors=\"pt\", add_special_tokens=True).input_ids\n",
"decoder_input_ids = tokenizer(TEXT_DECODER, return_tensors=\"pt\", add_special_tokens=True).input_ids\n",
"\n",
"outputs = model(input_ids=encoder_input_ids, decoder_input_ids=decoder_input_ids)\n",
"\n",
"encoder_text = tokenizer.convert_ids_to_tokens(encoder_input_ids[0])\n",
"decoder_text = tokenizer.convert_ids_to_tokens(decoder_input_ids[0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"head_view(\n",
" encoder_attention=outputs.encoder_attentions,\n",
" decoder_attention=outputs.decoder_attentions,\n",
" cross_attention=outputs.cross_attentions,\n",
" encoder_tokens= encoder_text,\n",
" decoder_tokens = decoder_text\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"model_view(\n",
" encoder_attention=outputs.encoder_attentions,\n",
" decoder_attention=outputs.decoder_attentions,\n",
" cross_attention=outputs.cross_attentions,\n",
" encoder_tokens= encoder_text,\n",
" decoder_tokens = decoder_text\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie (10 minut)\n",
"\n",
"Za pomocą modelu en-fr przetłumacz dowolne zdanie z angielskiego na język francuski i sprawdź wagi atencji dla tego tłumaczenia"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"MODEL = \"Helsinki-NLP/opus-mt-en-fr\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"TEXT_ENCODER = \"Although I still have fresh memories of my brother the elder Hamlets death, and though it was proper to mourn him throughout our kingdom, life still goes on—I think its wise to mourn him while also thinking about my own well being.\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import AutoModelWithLMHead, AutoTokenizer\n",
"\n",
"model = AutoModelWithLMHead.from_pretrained(MODEL)\n",
"tokenizer = AutoTokenizer.from_pretrained(MODEL)\n",
"\n",
"inputs = tokenizer.encode(TEXT_ENCODER, return_tensors=\"pt\")\n",
"outputs = model.generate(inputs, max_length=40, num_beams=4, early_stopping=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"TEXT_DECODER = tokenizer.decode(outputs[0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"TEXT_DECODER"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = AutoTokenizer.from_pretrained(MODEL)\n",
"model = AutoModel.from_pretrained(MODEL, output_attentions=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"encoder_input_ids = tokenizer(TEXT_ENCODER, return_tensors=\"pt\", add_special_tokens=True).input_ids\n",
"decoder_input_ids = tokenizer(TEXT_DECODER, return_tensors=\"pt\", add_special_tokens=True).input_ids\n",
"\n",
"outputs = model(input_ids=encoder_input_ids, decoder_input_ids=decoder_input_ids)\n",
"\n",
"encoder_text = tokenizer.convert_ids_to_tokens(encoder_input_ids[0])\n",
"decoder_text = tokenizer.convert_ids_to_tokens(decoder_input_ids[0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"head_view(\n",
" encoder_attention=outputs.encoder_attentions,\n",
" decoder_attention=outputs.decoder_attentions,\n",
" cross_attention=outputs.cross_attentions,\n",
" encoder_tokens= encoder_text,\n",
" decoder_tokens = decoder_text\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### PRZYKŁAD: GPT3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ZADANIE DOMOWE - POLEVAL"
]
}
],
"metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.8.3"
},
"subtitle": "13.Transformery 2[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@ -0,0 +1,212 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 14. <i>Ekstrakcja informacji seq2seq</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SIMILARITY SEARCH\n",
"1. zainstaluj faiss i zrób tutorial: https://github.com/facebookresearch/faiss\n",
"2. wczytaj treści artykułów z BBC News Train.csv\n",
"3. Użyj któregoś z transformerów (możesz użyć biblioteki sentence-transformers) do stworzenia embeddingów dokumentów\n",
"4. wczytaj embeddingi do bazy danych faiss\n",
"5. wyszukaj query 'consumer electronics market'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://www.kaggle.com/avishi/bbc-news-train-data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import pickle\n",
"import numpy as np\n",
"import faiss\n",
"from sklearn.metrics import ndcg_score, dcg_score, average_precision_score"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"!pip install sentence-transformers"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from sentence_transformers import SentenceTransformer\n",
"sentences = [\"Hello World\", \"Hallo Welt\"]\n",
"\n",
"model = SentenceTransformer('LaBSE')\n",
"embeddings = model.encode(sentences)\n",
"print(embeddings)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"r = pd.read_csv('BBC News Train.csv')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"DOCUMENTS = list(r.Text)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"embeddings = model.encode(DOCUMENTS)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"embeddings = model.encode(list(r.Text))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"QUERY_STR = 'consumer electronics market'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"query = model.encode([QUERY_STR])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"index = faiss.IndexFlatL2(embeddings.shape[1]) "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"index.add(np.ascontiguousarray(embeddings))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"D, I = index.search(query, 5) "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"I"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"D"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"DOCUMENTS[1363]"
]
}
],
"metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.8.3"
},
"subtitle": "14.Ekstrakcja informacji seq2seq[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@ -0,0 +1,369 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 15. <i>Similarity search</i> [ćwiczenia]</h2> \n",
"<h3> Jakub Pokrywka (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://arxiv.org/pdf/1910.10683.pdf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://github.com/applicaai/kleister-nda"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import T5Tokenizer, T5ForConditionalGeneration"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"text = \"translate English to French: My name is Azeem and I live in India\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"text = \"summarize: Machine learning involves computers discovering how they can perform tasks without being explicitly programmed to do so. It involves computers learning from data provided so that they carry out certain tasks. For simple tasks assigned to computers, it is possible to program algorithms telling the machine how to execute all steps required to solve the problem at hand; on the computer's part, no learning is needed. For more advanced tasks, it can be challenging for a human to manually create the needed algorithms. In practice, it can turn out to be more effective to help the machine develop its own algorithm, rather than having human programmers specify every needed step.\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"from transformers import T5Tokenizer, T5ForConditionalGeneration\n",
"\n",
"tokenizer = T5Tokenizer.from_pretrained('t5-small')\n",
"\n",
"model = T5ForConditionalGeneration.from_pretrained('t5-small', return_dict=True,).to('cuda')\n",
"\n",
"\n",
"# You can also use \"translate English to French\" and \"translate English to Romanian\"\n",
"input_ids = tokenizer(text, return_tensors=\"pt\").input_ids.to('cuda') # Batch size 1\n",
"\n",
"outputs = model.generate(input_ids)\n",
"\n",
"decoded = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
"\n",
"print(decoded)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"KLEISTER_PATH = '/media/kuba/ssdsam/Syncthing/Syncthing/przedmioty/2020-02/IE/applica/kleister-nda/'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"train_exp_f = open(KLEISTER_PATH + 'train/expected.tsv')\n",
"train_exp = []\n",
"for line in train_exp_f:\n",
" line_splitted = line.strip('\\n').split(' ')\n",
" found = False\n",
" for elem in line_splitted:\n",
" if 'jurisdiction=' in elem:\n",
" train_exp.append('jurisdiction: ' + elem.split('=')[1])\n",
" found = True\n",
" break\n",
" if not found:\n",
" train_exp.append('jurisdiction: NONE')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dev_exp_f = open(KLEISTER_PATH + 'dev-0/expected.tsv')\n",
"dev_exp = []\n",
"for line in dev_exp_f:\n",
" line_splitted = line.strip('\\n').split(' ')\n",
" found = False\n",
" for elem in line_splitted:\n",
" if 'jurisdiction=' in elem:\n",
" dev_exp.append('jurisdiction: ' + elem.split('=')[1])\n",
" found = True\n",
" break\n",
" if not found:\n",
" dev_exp.append('jurisdiction: NONE')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"train_exp"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"train_in_f = open(KLEISTER_PATH + 'train/in.tsv')\n",
"train_in = []\n",
"for line in train_in_f:\n",
" line = line.rstrip('\\n')\n",
" train_in.append(line)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dev_in_f = open(KLEISTER_PATH + 'dev-0/in.tsv')\n",
"dev_in = []\n",
"for line in dev_in_f:\n",
" line = line.rstrip('\\n')\n",
" dev_in.append(line)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"train_in[0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model.device"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"input = train_in[0]\n",
"\n",
"# You can also use \"translate English to French\" and \"translate English to Romanian\"\n",
"input_ids = tokenizer(input, return_tensors=\"pt\").input_ids[:,:512].to('cuda') # Batch size 1\n",
"\n",
"outputs = model.generate(input_ids)\n",
"\n",
"decoded = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
"\n",
"print(decoded)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"input_ids = tokenizer('translate English to German: The house is wonderful.', return_tensors='pt').input_ids.to('cuda')\n",
"labels = tokenizer('Das Haus ist wunderbar.', return_tensors='pt').input_ids.to('cuda')\n",
"# the forward function automatically creates the correct decoder_input_ids\n",
"loss = model(input_ids=input_ids, labels=labels).loss"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"loss"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import AdamW\n",
"\n",
"optimizer = AdamW(model.parameters(), lr=5e-5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model.train()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for line_in, line_exp in zip(train_in, train_exp):\n",
" input_ids = tokenizer(line_in, return_tensors='pt').input_ids[:,:512].to('cuda')\n",
" labels = tokenizer(line_exp, return_tensors='pt').input_ids.to('cuda')\n",
" # the forward function automatically creates the correct decoder_input_ids\n",
" loss = model(input_ids=input_ids, labels=labels).loss\n",
" loss.backward()\n",
" optimizer.step()\n",
" optimizer.zero_grad()\n",
" print(loss.item())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model.eval()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"input = dev_in[0]\n",
"\n",
"input_ids = tokenizer(input, return_tensors=\"pt\").input_ids[:,:512].to('cuda') # Batch size 1\n",
"\n",
"outputs = model.generate(input_ids)\n",
"\n",
"decoded = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
"\n",
"print(decoded)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"dev_exp[0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"input = dev_in[2]\n",
"\n",
"input_ids = tokenizer(input, return_tensors=\"pt\").input_ids[:,:512].to('cuda') # Batch size 1\n",
"\n",
"outputs = model.generate(input_ids)\n",
"\n",
"decoded = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
"\n",
"print(decoded)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dev_exp[2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## pytanie:\n",
"- co można poprawić w istniejącym rozwiązaniu?"
]
}
],
"metadata": {
"author": "Jakub Pokrywka",
"email": "kubapok@wmi.amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.8.3"
},
"subtitle": "15.Similarity search[ćwiczenia]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

1491
cw/BBC News Train.csv Normal file

File diff suppressed because one or more lines are too long

5
run_conversion.sh Normal file
View File

@ -0,0 +1,5 @@
for i in {cw,wyk}/*.ipynb;
do
bash convert_ipynb_to_md.sh $i
echo $i done
done

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 1. <i>Wyszukiwarki — wprowadzenie</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -8,16 +22,19 @@
"\n", "\n",
"## Systemy wyszukiwania informacji (information retrieval systems)\n", "## Systemy wyszukiwania informacji (information retrieval systems)\n",
"\n", "\n",
"![System wyszukiwania informacji](system-wyszukiwania-informacji.png)" "![Schemat systemu wyszukiwania informacji](system-wyszukiwania-informacji.png)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"jp-MarkdownHeadingCollapsed": true,
"tags": []
},
"source": [ "source": [
"## Wyszukiwarki\n", "## Wyszukiwarki\n",
"\n", "\n",
"![Wyszukiwarki](wyszukiwarka-internetowa.png)" "![Schemat wyszukiwarki internetowej](wyszukiwarka-internetowa.png)"
] ]
}, },
{ {
@ -89,7 +106,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Dostępne są też \"ekstrakty\" czystego tekstu - zob. http://data.statmt.org/ngrams/raw/, np. 59 GB czystego tekstu po polsku z 2012 roku." "Dostępne są też „ekstrakty” czystego tekstu — zob. http://data.statmt.org/ngrams/raw/, np. 59 GB czystego tekstu po polsku z 2012 roku."
] ]
}, },
{ {
@ -284,7 +301,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Odpytywać \"pasożytniczo\" inną wyszukiwarkę" "### Odpytywać „pasożytniczo” inną wyszukiwarkę"
] ]
}, },
{ {
@ -293,7 +310,7 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"# see https://hackernoon.com/how-to-scrape-google-with-python-bo7d2tal\n", "# zob. https://hackernoon.com/how-to-scrape-google-with-python-bo7d2tal\n",
"\n", "\n",
"import urllib\n", "import urllib\n",
"import requests\n", "import requests\n",
@ -817,823 +834,7 @@
"User-agent: *\n", "User-agent: *\n",
"Disallow: /*/wyszukaj/\n", "Disallow: /*/wyszukaj/\n",
"Disallow: /*servlet\n", "Disallow: /*servlet\n",
"Disallow: /reloadwww?\n", "...\n",
"Disallow: /dfptools/adview/\n",
"Disallow: /pub/ips/*\n",
"Disallow: /ods?\n",
"Disallow: /getFile.servlet*\n",
"Disallow: /aliasy/blad.jsp\n",
"Disallow: /znajdz.do\n",
"Disallow: /portalSearch.do\n",
"Disallow: /im/ab/b4/10/z17515435Q.jpg\n",
"Disallow: /75224259/\n",
"\n",
"User-agent: Googlebot-News\n",
"Disallow: /nowy/\n",
"Disallow: /mapa_strony\n",
"Disallow: /*/wyszukaj/\n",
"Disallow: /*/51,\n",
"Disallow: /*/55,\n",
"Disallow: /*/2,\n",
"Disallow: /*order=\n",
"Disallow: /*obxx=\n",
"Disallow: /*tag=\n",
"Disallow: /reloadwww?\n",
"Disallow: /ods?\n",
"Disallow: /*servlet\n",
"Disallow: /dfptools/adview/\n",
"\n",
"User-agent: Yandex\n",
"Disallow: /\n",
"\n",
"User-Agent: bingbot\n",
"Disallow: /\n",
"\n",
"User-agent: 008\n",
"Disallow: /\n",
"\n",
"User-agent: 010\n",
"Disallow: /\n",
"\n",
"User-agent: 360Spider\n",
"Disallow: /\n",
"\n",
"User-agent: 80legs\n",
"Disallow: /\n",
"\n",
"User-agent: Aboundex\n",
"Disallow: /\n",
"\n",
"User-agent: accelobot\n",
"Disallow: /\n",
"\n",
"User-agent: Add\\ Catalog\n",
"Disallow: /\n",
"\n",
"User-agent: AhrefsBot\n",
"Disallow: /\n",
"\n",
"User-agent: aiHitBot\n",
"Disallow: /\n",
"\n",
"User-agent: Alexibot\n",
"Disallow: /\n",
"\n",
"User-agent: Aqua_Products\n",
"Disallow: /\n",
"\n",
"User-agent: AskJeeves\n",
"Disallow: /\n",
"\n",
"User-agent: asterias\n",
"Disallow: /\n",
"\n",
"User-agent: awcheckBot\n",
"Disallow: /\n",
"\n",
"User-agent: b2w/0.1\n",
"Disallow: /\n",
"\n",
"User-agent: BackDoorBot/1.0\n",
"Disallow: /\n",
"\n",
"User-agent: BacklinkCrawler\n",
"Disallow: /\n",
"\n",
"User-agent: Baiduspider\n",
"Disallow: /\n",
"\n",
"User-agent: BecomeBot\n",
"Disallow: /\n",
"\n",
"User-agent: BLEXBot\n",
"Disallow: /\n",
"\n",
"User-agent: BlowFish/1.0\n",
"Disallow: /\n",
"\n",
"User-agent: Bookmark search tool\n",
"Disallow: /\n",
"\n",
"User-agent: BotALot\n",
"Disallow: /\n",
"\n",
"User-agent: brandwatch.net\n",
"Disallow: /\n",
"\n",
"User-agent: BuiltBotTough\n",
"Disallow: /\n",
"\n",
"User-agent: Bullseye/1.0\n",
"Disallow: /\n",
"\n",
"User-agent: BunnySlippers\n",
"Disallow: /\n",
"\n",
"User-agent: Butterfly\n",
"Disallow: /\n",
"\n",
"User-agent: CatchBot\n",
"Disallow: /\n",
"\n",
"User-agent: Charlotte\n",
"Disallow: /\n",
"\n",
"User-agent: CheeseBot\n",
"Disallow: /\n",
"\n",
"User-agent: CherryPicker\n",
"Disallow: /\n",
"\n",
"User-agent: CherryPickerElite/1.0\n",
"Disallow: /\n",
"\n",
"User-agent: CherryPickerSE/1.0\n",
"Disallow: /\n",
"\n",
"User-agent: CLIPish\n",
"Disallow: /\n",
"\n",
"User-agent: Cliqzbot\n",
"Disallow: /\n",
"\n",
"User-agent: COMODO\n",
"Disallow: /\n",
"\n",
"User-agent: Comodo-Certificates-Spider\n",
"Disallow: /\n",
"\n",
"User-agent: CompSpyBot\n",
"Disallow: /\n",
"\n",
"User-agent: Copernic\n",
"Disallow: /\n",
"\n",
"User-agent: CopyRightCheck\n",
"Disallow: /\n",
"\n",
"User-agent: cosmos\n",
"Disallow: /\n",
"\n",
"User-agent: crawler\n",
"Disallow: /\n",
"\n",
"User-agent: Crescent\n",
"Disallow: /\n",
"\n",
"User-agent: Crescent Internet ToolPak HTTP OLE Control v.1.0\n",
"Disallow: /\n",
"\n",
"User-agent: Curious\n",
"Disallow: /\n",
"\n",
"User-agent: curl\n",
"Disallow: /\n",
"\n",
"User-agent: dataprovider\\.com\n",
"Disallow: /\n",
"\n",
"User-agent: DinoPing\n",
"Disallow: /\n",
"\n",
"User-agent: discoverybot\n",
"Disallow: /\n",
"\n",
"User-agent: DittoSpyder\n",
"Disallow: /\n",
"\n",
"User-agent: DomainCrawler\n",
"Disallow: /\n",
"\n",
"User-agent: DomainCrawler\n",
"Disallow: /\n",
"\n",
"User-agent: dotbot\n",
"Disallow: /\n",
"\n",
"User-agent: dotnetdotcom\n",
"Disallow: /\n",
"\n",
"User-agent: Dow\\ Jones\\ Searchbot\n",
"Disallow: /\n",
"\n",
"User-agent: dumbot\n",
"Disallow: /\n",
"\n",
"User-agent: EasouSpider\n",
"Disallow: /\n",
"\n",
"User-agent: EmailCollector\n",
"Disallow: /\n",
"\n",
"User-agent: EmailSiphon\n",
"Disallow: /\n",
"\n",
"User-agent: EmailWolf\n",
"Disallow: /\n",
"\n",
"User-agent: Enterprise_Search\n",
"Disallow: /\n",
"\n",
"User-agent: Enterprise_Search/1.0\n",
"Disallow: /\n",
"\n",
"User-agent: EroCrawler\n",
"Disallow: /\n",
"\n",
"User-agent: es\n",
"Disallow: /\n",
"\n",
"User-agent: Exabot\n",
"Disallow: /\n",
"\n",
"User-agent: ExtractorPro\n",
"Disallow: /\n",
"\n",
"User-agent: EzineArticlesLinkScanner\n",
"Disallow: /\n",
"\n",
"User-agent: Ezooms\n",
"Disallow: /\n",
"\n",
"User-agent: FairAd Client\n",
"Disallow: /\n",
"\n",
"User-agent: Flaming AttackBot\n",
"Disallow: /\n",
"\n",
"User-agent: Foobot\n",
"Disallow: /\n",
"\n",
"User-agent: FreeFind\n",
"Disallow: /\n",
"\n",
"User-agent: FTRF\\:\\ Friendly\n",
"Disallow: /\n",
"\n",
"User-agent: Gaisbot\n",
"Disallow: /\n",
"\n",
"User-agent: GetRight/4.2\n",
"Disallow: /\n",
"\n",
"User-agent: gigabot\n",
"Disallow: /\n",
"\n",
"User-agent: grub\n",
"Disallow: /\n",
"\n",
"User-agent: grub-client\n",
"Disallow: /\n",
"\n",
"User-agent: Harvest/1.5\n",
"Disallow: /\n",
"\n",
"User-agent: Hatena Antenna\n",
"Disallow: /\n",
"\n",
"User-agent: hloader\n",
"Disallow: /\n",
"\n",
"User-agent: http://www.SearchEngineWorld.com bot\n",
"Disallow: /\n",
"\n",
"User-agent: http://www.WebmasterWorld.com bot\n",
"Disallow: /\n",
"\n",
"User-agent: HTTP_Request\n",
"Disallow: /\n",
"\n",
"User-agent: HTTP_Request2\n",
"Disallow: /\n",
"\n",
"User-agent: httplib\n",
"Disallow: /\n",
"\n",
"User-agent: humanlinks\n",
"Disallow: /\n",
"\n",
"User-agent: ia_archiver\n",
"Disallow: /\n",
"\n",
"User-agent: ia_archiver\n",
"Disallow: /\n",
"\n",
"User-agent: ia_archiver/1.6\n",
"Disallow: /\n",
"\n",
"User-agent: Indy\\ Library\n",
"Disallow: /\n",
"\n",
"User-agent: InfoNaviRobot\n",
"Disallow: /\n",
"\n",
"User-agent: ip\\-web\\-crawler\\.com\n",
"Disallow: /\n",
"\n",
"User-agent: Iron33/1.0.2\n",
"Disallow: /\n",
"\n",
"User-agent: Jakarta\\ Commons-HttpClient\n",
"Disallow: /\n",
"\n",
"User-agent: Jeeves\n",
"Disallow: /\n",
"\n",
"User-agent: JennyBot\n",
"Disallow: /\n",
"\n",
"User-agent: Jetbot\n",
"Disallow: /\n",
"\n",
"User-agent: Jetbot/1.0\n",
"Disallow: /\n",
"\n",
"User-agent: JikeSpider\n",
"Disallow: /\n",
"\n",
"User-agent: Kenjin Spider\n",
"Disallow: /\n",
"\n",
"User-agent: Keyword Density/0.9\n",
"Disallow: /\n",
"\n",
"User-agent: larbin\n",
"Disallow: /\n",
"\n",
"User-agent: LexiBot\n",
"Disallow: /\n",
"\n",
"User-agent: libWeb/clsHTTP\n",
"Disallow: /\n",
"\n",
"User-agent: libwww-perl\n",
"Disallow: /\n",
"\n",
"User-agent: lindex\\.com\n",
"Disallow: /\n",
"\n",
"User-agent: linkdex\\.com\n",
"Disallow: /\n",
"\n",
"User-agent: linkdexbot\n",
"Disallow: /\n",
"\n",
"User-agent: LinkextractorPro\n",
"Disallow: /\n",
"\n",
"User-agent: LinkScan/8.1a Unix\n",
"Disallow: /\n",
"\n",
"User-agent: LinkWalker\n",
"Disallow: /\n",
"\n",
"User-agent: lipperhey\n",
"Disallow: /\n",
"\n",
"User-agent: LNSpiderguy\n",
"Disallow: /\n",
"\n",
"User-agent: looksmart\n",
"Disallow: /\n",
"\n",
"User-agent: ltbot\n",
"Disallow: /\n",
"\n",
"User-agent: lwp-trivial\n",
"Disallow: /\n",
"\n",
"User-agent: lwp-trivial/1.34\n",
"Disallow: /\n",
"\n",
"User-agent: Lynx\n",
"Disallow: /\n",
"\n",
"User-agent: magpie\\-crawler\n",
"Disallow: /\n",
"\n",
"User-agent: Mata Hari\n",
"Disallow: /\n",
"\n",
"User-agent: Microsoft URL Control\n",
"Disallow: /\n",
"\n",
"User-agent: Microsoft URL Control - 5.01.4511\n",
"Disallow: /\n",
"\n",
"User-agent: Microsoft URL Control - 6.00.8169\n",
"Disallow: /\n",
"\n",
"User-agent: MIIxpc\n",
"Disallow: /\n",
"\n",
"User-agent: MIIxpc/4.2\n",
"Disallow: /\n",
"\n",
"User-agent: Mister PiX\n",
"Disallow: /\n",
"\n",
"User-agent: MJ12bot\n",
"Disallow: /\n",
"\n",
"User-agent: moget\n",
"Disallow: /\n",
"\n",
"User-agent: moget/2.1\n",
"Disallow: /\n",
"\n",
"User-agent: Mozilla/4.0 (compatible; BullsEye; Windows 95)\n",
"Disallow: /\n",
"\n",
"User-agent: MSIE\\ or\\ Firefox\\ mutant\n",
"Disallow: /\n",
"\n",
"User-agent: MSIECrawler\n",
"Disallow: /\n",
"\n",
"User-agent: naver\n",
"Disallow: /\n",
"\n",
"User-agent: NCBot\n",
"Disallow: /\n",
"\n",
"User-agent: NetAnts\n",
"Disallow: /\n",
"\n",
"User-agent: NetcraftSurveyAgent\n",
"Disallow: /\n",
"\n",
"User-agent: netEstate\\ NE\\ Crawler\n",
"Disallow: /\n",
"\n",
"User-agent: NetMechanic\n",
"Disallow: /\n",
"\n",
"User-agent: Netseer\n",
"Disallow: /\n",
"\n",
"User-agent: NextGenSearchBot\n",
"Disallow: /\n",
"\n",
"User-agent: NICErsPRO\n",
"Disallow: /\n",
"\n",
"User-agent: Nutch\n",
"Disallow: /\n",
"\n",
"User-agent: Nutch\n",
"Disallow: /\n",
"\n",
"User-agent: Ocelli\n",
"Disallow: /\n",
"\n",
"User-agent: Offline Explorer\n",
"Disallow: /\n",
"\n",
"User-agent: OmniExplorer_Bot\n",
"Disallow: /\n",
"\n",
"User-agent: Openbot\n",
"Disallow: /\n",
"\n",
"User-agent: Openfind\n",
"Disallow: /\n",
"\n",
"User-agent: Openfind\n",
"Disallow: /\n",
"\n",
"User-agent: Openfind data gathere\n",
"Disallow: /\n",
"\n",
"User-agent: OpenWebIndex\n",
"Disallow: /\n",
"\n",
"User-agent: Oracle Ultra Search\n",
"Disallow: /\n",
"\n",
"User-agent: PagesInventory\n",
"Disallow: /\n",
"\n",
"User-agent: PEAR\n",
"Disallow: /\n",
"\n",
"User-agent: PeoplePal\n",
"Disallow: /\n",
"\n",
"User-agent: PerMan\n",
"Disallow: /\n",
"\n",
"User-agent: ProCogSEOBot\n",
"Disallow: /\n",
"\n",
"User-agent: ProPowerBot/2.14\n",
"Disallow: /\n",
"\n",
"User-agent: ProWebWalker\n",
"Disallow: /\n",
"\n",
"User-agent: proximic\n",
"Disallow: /\n",
"\n",
"User-agent: psbot\n",
"Disallow: /\n",
"\n",
"User-agent: purebot\n",
"Disallow: /\n",
"\n",
"User-agent: QueryN Metasearch\n",
"Disallow: /\n",
"\n",
"User-agent: QuerySeekerSpider\n",
"Disallow: /\n",
"\n",
"User-agent: Radiation Retriever 1.1\n",
"Disallow: /\n",
"\n",
"User-agent: RepoMonkey\n",
"Disallow: /\n",
"\n",
"User-agent: RepoMonkey Bait & Tackle/v1.01\n",
"Disallow: /\n",
"\n",
"User-agent: Riddler\n",
"Disallow: /\n",
"\n",
"User-agent: RMA\n",
"Disallow: /\n",
"\n",
"User-agent: rojerbot\n",
"Disallow: /\n",
"\n",
"User-agent: RyteBot\n",
"Disallow: /\n",
"\n",
"User-agent: scooter\n",
"Disallow: /\n",
"\n",
"User-agent: ScoutJet\n",
"Disallow: /\n",
"\n",
"User-agent: Scrapy\n",
"Disallow: /\n",
"\n",
"User-agent: ScreenerBot\n",
"Disallow: /\n",
"\n",
"User-agent: searchmetrics\n",
"Disallow: /\n",
"\n",
"User-agent: searchpreview\n",
"Disallow: /\n",
"\n",
"User-agent: SemrushBot\n",
"Disallow: /\n",
"\n",
"User-agent: sentibot\n",
"Disallow: /\n",
"\n",
"User-agent: SEO-CRAWLING\n",
"Disallow: /\n",
"\n",
"User-agent: SEOENGWorldBot\n",
"Disallow: /\n",
"\n",
"User-agent: SEOkicks-Robot\n",
"Disallow: /\n",
"\n",
"User-agent: ShopWiki\n",
"Disallow: /\n",
"\n",
"User-agent: sistrix\n",
"Disallow: /\n",
"\n",
"User-agent: sitebot\n",
"Disallow: /\n",
"\n",
"User-agent: SiteSnagger\n",
"Disallow: /\n",
"\n",
"User-agent: Snoopy\n",
"Disallow: /\n",
"\n",
"User-agent: SocialSearcher\n",
"Disallow: /\n",
"\n",
"User-agent: Sogou\n",
"Disallow: /\n",
"\n",
"User-agent: SolomonoBot\n",
"Disallow: /\n",
"\n",
"User-agent: sootle\n",
"Disallow: /\n",
"\n",
"User-agent: Sosospider\n",
"Disallow: /\n",
"\n",
"User-agent: SpankBot\n",
"Disallow: /\n",
"\n",
"User-agent: spanner\n",
"Disallow: /\n",
"\n",
"User-agent: spbot\n",
"Disallow: /\n",
"\n",
"User-agent: Speedy\n",
"Disallow: /\n",
"\n",
"User-agent: Stanford\n",
"Disallow: /\n",
"\n",
"User-agent: Stanford Comp Sci\n",
"Disallow: /\n",
"\n",
"User-agent: SurveyBot\n",
"Disallow: /\n",
"\n",
"User-agent: suzuran\n",
"Disallow: /\n",
"\n",
"User-agent: Szukacz/1.4\n",
"Disallow: /\n",
"\n",
"User-agent: Szukacz/1.4\n",
"Disallow: /\n",
"\n",
"User-agent: Teleport\n",
"Disallow: /\n",
"\n",
"User-agent: TeleportPro\n",
"Disallow: /\n",
"\n",
"User-agent: Telesoft\n",
"Disallow: /\n",
"\n",
"User-agent: Teoma\n",
"Disallow: /\n",
"\n",
"User-agent: The Intraformant\n",
"Disallow: /\n",
"\n",
"User-agent: The\\ Incutio\\ XML-RPC\\ PHP\\ Library\n",
"Disallow: /\n",
"\n",
"User-agent: TheNomad\n",
"Disallow: /\n",
"\n",
"User-agent: toCrawl/UrlDispatcher\n",
"Disallow: /\n",
"\n",
"User-agent: True_Robot\n",
"Disallow: /\n",
"\n",
"User-agent: True_Robot/1.0\n",
"Disallow: /\n",
"\n",
"User-agent: turingos\n",
"Disallow: /\n",
"\n",
"User-agent: TurnitinBot\n",
"Disallow: /\n",
"\n",
"User-agent: uCrawler\n",
"Disallow: /\n",
"\n",
"User-agent: URL Control\n",
"Disallow: /\n",
"\n",
"User-agent: URL_Spider_Pro\n",
"Disallow: /\n",
"\n",
"User-agent: URLy Warning\n",
"Disallow: /\n",
"\n",
"User-agent: VCI\n",
"Disallow: /\n",
"\n",
"User-agent: VCI WebViewer VCI WebViewer Win32\n",
"Disallow: /\n",
"\n",
"User-agent: visaduhoc\\.info\n",
"Disallow: /\n",
"\n",
"User-agent: WBSearchBot\n",
"Disallow: /\n",
"\n",
"User-agent: Web Image Collector\n",
"Disallow: /\n",
"\n",
"User-agent: WebAuto\n",
"Disallow: /\n",
"\n",
"User-agent: WebBandit\n",
"Disallow: /\n",
"\n",
"User-agent: WebBandit/3.50\n",
"Disallow: /\n",
"\n",
"User-agent: WebCapture\n",
"Disallow: /\n",
"\n",
"User-agent: WebCopier\n",
"Disallow: /\n",
"\n",
"User-agent: WebEnhancer\n",
"Disallow: /\n",
"\n",
"User-agent: WebInDetail\\.com\n",
"Disallow: /\n",
"\n",
"User-agent: WebmasterWorld Extractor\n",
"Disallow: /\n",
"\n",
"User-agent: WebmasterWorldForumBot\n",
"Disallow: /\n",
"\n",
"User-agent: WebSauger\n",
"Disallow: /\n",
"\n",
"User-agent: Website Quester\n",
"Disallow: /\n",
"\n",
"User-agent: WEBSITEtheWEB\\.COM\n",
"Disallow: /\n",
"\n",
"User-agent: Webster Pro\n",
"Disallow: /\n",
"\n",
"User-agent: WebStripper\n",
"Disallow: /\n",
"\n",
"User-agent: WebVac\n",
"Disallow: /\n",
"\n",
"User-agent: WebZip\n",
"Disallow: /\n",
"\n",
"User-agent: WebZip/4.0\n",
"Disallow: /\n",
"\n",
"User-agent: Wget\n",
"Disallow: /\n",
"\n",
"User-agent: Wget/1.5.3\n",
"Disallow: /\n",
"\n",
"User-agent: Wget/1.6\n",
"Disallow: /\n",
"\n",
"User-agent: Wotbot\n",
"Disallow: /\n",
"\n",
"User-agent: www\\.integromedb\\.org\n",
"Disallow: /\n",
"\n",
"User-agent: WWW-Collector-E\n",
"Disallow: /\n",
"\n",
"User-agent: Xenu's\n",
"Disallow: /\n",
"\n",
"User-agent: Xenu's Link Sleuth 1.1c\n",
"Disallow: /\n",
"\n",
"User-agent: xpymep\\.exe\n",
"Disallow: /\n",
"\n",
"User-agent: YamanaLab-Robot\n",
"Disallow: /\n",
"\n",
"User-agent: YisouSpider\n",
"Disallow: /\n",
"\n",
"User-agent: YodaoBot\n",
"Disallow: /\n",
"\n",
"User-agent: YoudaoBot\n",
"Disallow: /\n",
"\n",
"User-agent: Zend_Http_Client\n",
"Disallow: /\n",
"\n",
"User-agent: Zeus\n",
"Disallow: /\n",
"\n",
"User-agent: Zeus 32297 Webster Pro V2.9 Win32\n",
"Disallow: /\n",
"\n",
"User-agent: Zeus Link Scout\n",
"Disallow: /\n",
"\n",
"User-agent: ZmEu\n",
"Disallow: /\n",
"\n",
"User-agent: ZumBot\n",
"Disallow: /\n",
"\n",
"User-agent: Linguee\n",
"Disallow: /\n",
"\n", "\n",
"User-agent: sogou\n", "User-agent: sogou\n",
"Disallow: /\n" "Disallow: /\n"
@ -1675,11 +876,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -1690,8 +894,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.9.1" "version": "3.9.6"
} },
"subtitle": "2.Wyszukiwarki — wprowadzenie[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 2. <i>Wyszukiwarki — roboty</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -314,7 +328,7 @@
"\n", "\n",
"* urllib\n", "* urllib\n",
"* request\n", "* request\n",
"* Beautiful Soup (do parsowania HTML-a)" "* Beautiful Soup (do parsowania dokumentów HTML)"
] ]
}, },
{ {
@ -494,11 +508,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -509,8 +526,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.9.1" "version": "3.9.6"
} },
"subtitle": "2.Wyszukiwarki — roboty[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,21 @@
{ {
"cells": [ "cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"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> Ekstrakcja informacji </h1>\n",
"<h2> 3. <i>Wyszukiwarki \u2014 TF-IDF</i> [wyk\u0142ad]</h2> \n",
"<h3> Filip Grali\u0144ski (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -11,9 +27,9 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## Roboczy przykład\n", "## Roboczy przyk\u0142ad\n",
"\n", "\n",
"Zakładamy, że mamy pewną kolekcję dokumentów $D = {d_1, \\ldots, d_N}$. ($N$ - liczba dokumentów w kolekcji)." "Zak\u0142adamy, \u017ce mamy pewn\u0105 kolekcj\u0119 dokument\u00f3w $D = {d_1, \\ldots, d_N}$. ($N$ - liczba dokument\u00f3w w kolekcji)."
] ]
}, },
{ {
@ -38,10 +54,10 @@
"import Prelude hiding(words, take)\n", "import Prelude hiding(words, take)\n",
"\n", "\n",
"collectionD :: [Text]\n", "collectionD :: [Text]\n",
"collectionD = [\"Ala ma kota.\", \"Podobno jest kot w butach.\", \"Ty chyba masz kota!\", \"But chyba zgubiłem.\", \"Kot ma kota.\"]\n", "collectionD = [\"Ala ma kota.\", \"Podobno jest kot w butach.\", \"Ty chyba masz kota!\", \"But chyba zgubi\u0142em.\", \"Kot ma kota.\"]\n",
"\n", "\n",
"-- Operator (!!) zwraca element listy o podanym indeksie\n", "-- Operator (!!) zwraca element listy o podanym indeksie\n",
"-- (Przy większych listach będzie nieefektywne, ale nie będziemy komplikować)\n", "-- (Przy wi\u0119kszych listach b\u0119dzie nieefektywne, ale nie b\u0119dziemy komplikowa\u0107)\n",
"Prelude.head collectionD" "Prelude.head collectionD"
] ]
}, },
@ -51,16 +67,16 @@
"source": [ "source": [
"## Wydobycie tekstu\n", "## Wydobycie tekstu\n",
"\n", "\n",
"Przykładowe narzędzia:\n", "Przyk\u0142adowe narz\u0119dzia:\n",
"\n", "\n",
"* pdftotext\n", "* pdftotext\n",
"* antiword\n", "* antiword\n",
"* Tesseract OCR\n", "* Tesseract OCR\n",
"* Apache Tika - uniwersalne narzędzie do wydobywania tekstu z różnych formatów\n", "* Apache Tika - uniwersalne narz\u0119dzie do wydobywania tekstu z r\u00f3\u017cnych format\u00f3w\n",
"\n", "\n",
"## Normalizacja tekstu\n", "## Normalizacja tekstu\n",
"\n", "\n",
"Cokolwiek robimy z tekstem, najpierw musimy go _znormalizować_." "Cokolwiek robimy z tekstem, najpierw musimy go _znormalizowa\u0107_."
] ]
}, },
{ {
@ -69,8 +85,8 @@
"source": [ "source": [
"### Tokenizacja\n", "### Tokenizacja\n",
"\n", "\n",
"Po pierwsze musimy podzielić tekst na _tokeny_, czyli wyrazapodobne jednostki.\n", "Po pierwsze musimy podzieli\u0107 tekst na _tokeny_, czyli wyrazapodobne jednostki.\n",
"Może po prostu podzielić po spacjach?" "Mo\u017ce po prostu podzieli\u0107 po spacjach?"
] ]
}, },
{ {
@ -108,7 +124,7 @@
], ],
"source": [ "source": [
"tokenizeStupidly :: Text -> [Text]\n", "tokenizeStupidly :: Text -> [Text]\n",
"-- words to funkcja z Data.Text, która dzieli po spacjach\n", "-- words to funkcja z Data.Text, kt\u00f3ra dzieli po spacjach\n",
"tokenizeStupidly = words\n", "tokenizeStupidly = words\n",
"\n", "\n",
"tokenizeStupidly $ Prelude.head collectionD" "tokenizeStupidly $ Prelude.head collectionD"
@ -118,7 +134,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"A, trzeba _chociaż_ odsunąć znaki interpunkcyjne. Najprościej użyć wyrażenia regularnego. Warto użyć [unikodowych własności](https://en.wikipedia.org/wiki/Unicode_character_property) znaków i konstrukcji `\\p{...}`. " "A, trzeba _chocia\u017c_ odsun\u0105\u0107 znaki interpunkcyjne. Najpro\u015bciej u\u017cy\u0107 wyra\u017cenia regularnego. Warto u\u017cy\u0107 [unikodowych w\u0142asno\u015bci](https://en.wikipedia.org/wiki/Unicode_character_property) znak\u00f3w i konstrukcji `\\p{...}`. "
] ]
}, },
{ {
@ -147,7 +163,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"zgubiłem" "zgubi\u0142em"
] ]
}, },
"metadata": {}, "metadata": {},
@ -178,7 +194,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Cała kolekcja stokenizowana:" "Ca\u0142a kolekcja stokenizowana:"
] ]
}, },
{ {
@ -342,7 +358,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"zgubiłem" "zgubi\u0142em"
] ]
}, },
"metadata": {}, "metadata": {},
@ -402,9 +418,9 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"#### Problemy z tokenizacją\n", "#### Problemy z tokenizacj\u0105\n",
"\n", "\n",
"##### Język angielski" "##### J\u0119zyk angielski"
] ]
}, },
{ {
@ -969,7 +985,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"##### Inne języki?" "##### Inne j\u0119zyki?"
] ]
}, },
{ {
@ -1116,7 +1132,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"今日波兹南是贸易" "\u4eca\u65e5\u6ce2\u5179\u5357\u662f\u8d38\u6613"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1125,7 +1141,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"、" "\u3001"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1134,7 +1150,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"工业及教育的中心" "\u5de5\u4e1a\u53ca\u6559\u80b2\u7684\u4e2d\u5fc3"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1143,7 +1159,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"。" "\u3002"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1152,7 +1168,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"波兹南是波兰第五大的城市及第四大的工业中心" "\u6ce2\u5179\u5357\u662f\u6ce2\u5170\u7b2c\u4e94\u5927\u7684\u57ce\u5e02\u53ca\u7b2c\u56db\u5927\u7684\u5de5\u4e1a\u4e2d\u5fc3"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1161,7 +1177,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"" "\uff0c"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1170,7 +1186,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"波兹南亦是大波兰省的行政首府" "\u6ce2\u5179\u5357\u4ea6\u662f\u5927\u6ce2\u5170\u7701\u7684\u884c\u653f\u9996\u5e9c"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1179,7 +1195,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"。" "\u3002"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1188,7 +1204,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"也舉辦有不少展覽會" "\u4e5f\u8209\u8fa6\u6709\u4e0d\u5c11\u5c55\u89bd\u6703"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1197,7 +1213,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"。" "\u3002"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1206,7 +1222,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"是波蘭西部重要的交通中心都市" "\u662f\u6ce2\u862d\u897f\u90e8\u91cd\u8981\u7684\u4ea4\u901a\u4e2d\u5fc3\u90fd\u5e02"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1215,7 +1231,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"。" "\u3002"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1223,7 +1239,7 @@
} }
], ],
"source": [ "source": [
"tokenize \"今日波兹南是贸易、工业及教育的中心。波兹南是波兰第五大的城市及第四大的工业中心,波兹南亦是大波兰省的行政首府。也舉辦有不少展覽會。是波蘭西部重要的交通中心都市。\"" "tokenize \"\u4eca\u65e5\u6ce2\u5179\u5357\u662f\u8d38\u6613\u3001\u5de5\u4e1a\u53ca\u6559\u80b2\u7684\u4e2d\u5fc3\u3002\u6ce2\u5179\u5357\u662f\u6ce2\u5170\u7b2c\u4e94\u5927\u7684\u57ce\u5e02\u53ca\u7b2c\u56db\u5927\u7684\u5de5\u4e1a\u4e2d\u5fc3\uff0c\u6ce2\u5179\u5357\u4ea6\u662f\u5927\u6ce2\u5170\u7701\u7684\u884c\u653f\u9996\u5e9c\u3002\u4e5f\u8209\u8fa6\u6709\u4e0d\u5c11\u5c55\u89bd\u6703\u3002\u662f\u6ce2\u862d\u897f\u90e8\u91cd\u8981\u7684\u4ea4\u901a\u4e2d\u5fc3\u90fd\u5e02\u3002\""
] ]
}, },
{ {
@ -1274,16 +1290,16 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"_Lematyzacja_ to sprowadzenie do formy podstawowej (_lematu_), np. \"krześle\" do \"krzesło\", \"zrobimy\" do \"zrobić\" dla języka polskiego, \"chairs\" do \"chair\", \"made\" do \"make\" dla języka angielskiego." "_Lematyzacja_ to sprowadzenie do formy podstawowej (_lematu_), np. \"krze\u015ble\" do \"krzes\u0142o\", \"zrobimy\" do \"zrobi\u0107\" dla j\u0119zyka polskiego, \"chairs\" do \"chair\", \"made\" do \"make\" dla j\u0119zyka angielskiego."
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Lematyzacja dla języka polskiego jest bardzo trudna, praktycznie nie sposób wykonać ją regułowo, po prostu musimy się postarać o bardzo obszerny _słownik form fleksyjnych_.\n", "Lematyzacja dla j\u0119zyka polskiego jest bardzo trudna, praktycznie nie spos\u00f3b wykona\u0107 j\u0105 regu\u0142owo, po prostu musimy si\u0119 postara\u0107 o bardzo obszerny _s\u0142ownik form fleksyjnych_.\n",
"\n", "\n",
"Na potrzeby tego wykładu stwórzmy sobie mały słownik form fleksyjnych w postaci tablicy asocjacyjnej (haszującej)." "Na potrzeby tego wyk\u0142adu stw\u00f3rzmy sobie ma\u0142y s\u0142ownik form fleksyjnych w postaci tablicy asocjacyjnej (haszuj\u0105cej)."
] ]
}, },
{ {
@ -1418,7 +1434,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"mieć" "mie\u0107"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1454,7 +1470,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"kupiłem" "kupi\u0142em"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1486,16 +1502,16 @@
"mockInflectionDictionary = Map.fromList [\n", "mockInflectionDictionary = Map.fromList [\n",
" (\"kota\", \"kot\"),\n", " (\"kota\", \"kot\"),\n",
" (\"butach\", \"but\"),\n", " (\"butach\", \"but\"),\n",
" (\"masz\", \"mieć\"),\n", " (\"masz\", \"mie\u0107\"),\n",
" (\"ma\", \"mieć\"),\n", " (\"ma\", \"mie\u0107\"),\n",
" (\"buta\", \"but\"),\n", " (\"buta\", \"but\"),\n",
" (\"zgubiłem\", \"zgubić\")]\n", " (\"zgubi\u0142em\", \"zgubi\u0107\")]\n",
"\n", "\n",
"lemmatizeWord :: Map Text Text -> Text -> Text\n", "lemmatizeWord :: Map Text Text -> Text -> Text\n",
"lemmatizeWord dict w = findWithDefault w w dict\n", "lemmatizeWord dict w = findWithDefault w w dict\n",
"\n", "\n",
"lemmatizeWord mockInflectionDictionary \"butach\"\n", "lemmatizeWord mockInflectionDictionary \"butach\"\n",
"-- a tego nie ma w naszym słowniczku, więc zwracamy to samo\n", "-- a tego nie ma w naszym s\u0142owniczku, wi\u0119c zwracamy to samo\n",
"lemmatizeWord mockInflectionDictionary \"butami\"\n", "lemmatizeWord mockInflectionDictionary \"butami\"\n",
"\n", "\n",
"lemmatize :: Map Text Text -> [Text] -> [Text]\n", "lemmatize :: Map Text Text -> [Text] -> [Text]\n",
@ -1503,16 +1519,16 @@
"\n", "\n",
"lemmatize mockInflectionDictionary $ tokenize $ collectionD !! 0 \n", "lemmatize mockInflectionDictionary $ tokenize $ collectionD !! 0 \n",
"\n", "\n",
"lemmatize mockInflectionDictionary $ tokenize \"Wczoraj kupiłem kota.\"" "lemmatize mockInflectionDictionary $ tokenize \"Wczoraj kupi\u0142em kota.\""
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"**Pytanie**: Nawet w naszym słowniczku mamy problemy z niejednoznacznością lematyzacji. Jakie?\n", "**Pytanie**: Nawet w naszym s\u0142owniczku mamy problemy z niejednoznaczno\u015bci\u0105 lematyzacji. Jakie?\n",
"\n", "\n",
"Obszerny słownik form fleksyjnych dla języka polskiego: http://zil.ipipan.waw.pl/PoliMorf?action=AttachFile&do=view&target=PoliMorf-0.6.7.tab.gz" "Obszerny s\u0142ownik form fleksyjnych dla j\u0119zyka polskiego: http://zil.ipipan.waw.pl/PoliMorf?action=AttachFile&do=view&target=PoliMorf-0.6.7.tab.gz"
] ]
}, },
{ {
@ -1521,14 +1537,14 @@
"source": [ "source": [
"### Stemowanie\n", "### Stemowanie\n",
"\n", "\n",
"Stemowanie (rdzeniowanie) obcina wyraz do _rdzenia_ niekoniecznie będącego sensownym wyrazem, np. \"krześle\" może być rdzeniowane do \"krześl\", \"krześ\" albo \"krzes\", \"zrobimy\" do \"zrobi\".\n", "Stemowanie (rdzeniowanie) obcina wyraz do _rdzenia_ niekoniecznie b\u0119d\u0105cego sensownym wyrazem, np. \"krze\u015ble\" mo\u017ce by\u0107 rdzeniowane do \"krze\u015bl\", \"krze\u015b\" albo \"krzes\", \"zrobimy\" do \"zrobi\".\n",
"\n", "\n",
"* stemowanie nie jest tak dobrze określone jak lematyzacja (można robić na wiele sposobów)\n", "* stemowanie nie jest tak dobrze okre\u015blone jak lematyzacja (mo\u017cna robi\u0107 na wiele sposob\u00f3w)\n",
"* bardziej podatne na metody regułowe (choć dla polskiego i tak trudno)\n", "* bardziej podatne na metody regu\u0142owe (cho\u0107 dla polskiego i tak trudno)\n",
"* dla angielskiego istnieją znane algorytmy stemowania, np. [algorytm Portera](https://tartarus.org/martin/PorterStemmer/def.txt)\n", "* dla angielskiego istniej\u0105 znane algorytmy stemowania, np. [algorytm Portera](https://tartarus.org/martin/PorterStemmer/def.txt)\n",
"* zob. też [program Snowball](https://snowballstem.org/) z regułami dla wielu języków\n", "* zob. te\u017c [program Snowball](https://snowballstem.org/) z regu\u0142ami dla wielu j\u0119zyk\u00f3w\n",
"\n", "\n",
"Prosty stemmer \"dla ubogich\" dla języka polskiego to obcinanie do sześciu znaków." "Prosty stemmer \"dla ubogich\" dla j\u0119zyka polskiego to obcinanie do sze\u015bciu znak\u00f3w."
] ]
}, },
{ {
@ -1566,7 +1582,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"źdźbła" "\u017ad\u017ab\u0142a"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1580,7 +1596,7 @@
"poorMansStemming \"zrobimy\"\n", "poorMansStemming \"zrobimy\"\n",
"poorMansStemming \"komputerami\"\n", "poorMansStemming \"komputerami\"\n",
"poorMansStemming \"butach\"\n", "poorMansStemming \"butach\"\n",
"poorMansStemming \"źdźbłami\"\n" "poorMansStemming \"\u017ad\u017ab\u0142ami\"\n"
] ]
}, },
{ {
@ -1589,7 +1605,7 @@
"source": [ "source": [
"### _Stop words_\n", "### _Stop words_\n",
"\n", "\n",
"Często wyszukiwarki pomijają krótkie, częste i nieniosące znaczenia słowa - _stop words_ (_słowa przestankowe_)." "Cz\u0119sto wyszukiwarki pomijaj\u0105 kr\u00f3tkie, cz\u0119ste i nienios\u0105ce znaczenia s\u0142owa - _stop words_ (_s\u0142owa przestankowe_)."
] ]
}, },
{ {
@ -1620,9 +1636,9 @@
"isStopWord :: Text -> Bool\n", "isStopWord :: Text -> Bool\n",
"isStopWord \"w\" = True\n", "isStopWord \"w\" = True\n",
"isStopWord \"jest\" = True\n", "isStopWord \"jest\" = True\n",
"isStopWord \"że\" = True\n", "isStopWord \"\u017ce\" = True\n",
"-- przy okazji możemy pozbyć się znaków interpunkcyjnych\n", "-- przy okazji mo\u017cemy pozby\u0107 si\u0119 znak\u00f3w interpunkcyjnych\n",
"isStopWord w = w ≈ [re|^\\p{P}+$|]\n", "isStopWord w = w \u2248 [re|^\\p{P}+$|]\n",
"\n", "\n",
"isStopWord \"kot\"\n", "isStopWord \"kot\"\n",
"isStopWord \"!\"\n" "isStopWord \"!\"\n"
@ -1672,20 +1688,20 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"**Pytanie**: Jakim zapytaniom usuwanie _stop words_ może szkodzić? Podać przykłady dla języka polskiego i angielskiego. " "**Pytanie**: Jakim zapytaniom usuwanie _stop words_ mo\u017ce szkodzi\u0107? Poda\u0107 przyk\u0142ady dla j\u0119zyka polskiego i angielskiego. "
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Normalizacja - różności\n", "### Normalizacja - r\u00f3\u017cno\u015bci\n",
"\n", "\n",
"W skład normalizacji może też wchodzić:\n", "W sk\u0142ad normalizacji mo\u017ce te\u017c wchodzi\u0107:\n",
"\n", "\n",
"* poprawianie błędów literowych\n", "* poprawianie b\u0142\u0119d\u00f3w literowych\n",
"* sprowadzanie do małych liter (lower-casing czy raczej case-folding)\n", "* sprowadzanie do ma\u0142ych liter (lower-casing czy raczej case-folding)\n",
"* usuwanie znaków diakrytycznych\n", "* usuwanie znak\u00f3w diakrytycznych\n",
"\n" "\n"
] ]
}, },
@ -1697,7 +1713,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"żdźbło" "\u017cd\u017ab\u0142o"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1705,7 +1721,7 @@
} }
], ],
"source": [ "source": [
"toLower \"ŻDŹBŁO\"" "toLower \"\u017bD\u0179B\u0141O\""
] ]
}, },
{ {
@ -1716,7 +1732,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"źdźbło" "\u017ad\u017ab\u0142o"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1724,27 +1740,27 @@
} }
], ],
"source": [ "source": [
"toCaseFold \"ŹDŹBŁO\"" "toCaseFold \"\u0179D\u0179B\u0141O\""
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"**Pytanie:** Kiedy _case-folding_ da inny wynik niż _lower-casing_? Jakie to ma praktyczne znaczenie?" "**Pytanie:** Kiedy _case-folding_ da inny wynik ni\u017c _lower-casing_? Jakie to ma praktyczne znaczenie?"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Normalizacja jako całościowy proces\n", "### Normalizacja jako ca\u0142o\u015bciowy proces\n",
"\n", "\n",
"Najważniejsza zasada: dokumenty w naszej kolekcji powinny być normalizowane w dokładnie taki sposób, jak zapytania.\n", "Najwa\u017cniejsza zasada: dokumenty w naszej kolekcji powinny by\u0107 normalizowane w dok\u0142adnie taki spos\u00f3b, jak zapytania.\n",
"\n", "\n",
"Efektem normalizacji jest zamiana dokumentu na ciąg _termów_ (ang. _terms_), czyli znormalizowanych wyrazów.\n", "Efektem normalizacji jest zamiana dokumentu na ci\u0105g _term\u00f3w_ (ang. _terms_), czyli znormalizowanych wyraz\u00f3w.\n",
"\n", "\n",
"Innymi słowy po normalizacji dokument $d_i$ traktujemy jako ciąg termów $t_i^1,\\dots,t_i^{|d_i|}$." "Innymi s\u0142owy po normalizacji dokument $d_i$ traktujemy jako ci\u0105g term\u00f3w $t_i^1,\\dots,t_i^{|d_i|}$."
] ]
}, },
{ {
@ -1764,7 +1780,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"mieć" "mie\u0107"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1827,7 +1843,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"mieć" "mie\u0107"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1863,7 +1879,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"zgubić" "zgubi\u0107"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1881,7 +1897,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"mieć" "mie\u0107"
] ]
}, },
"metadata": {}, "metadata": {},
@ -1908,11 +1924,11 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Zbiór wszystkich termów w kolekcji dokumentów nazywamy słownikiem (ang. _vocabulary_), nie mylić ze słownikiem jako strukturą danych w Pythonie (_dictionary_).\n", "Zbi\u00f3r wszystkich term\u00f3w w kolekcji dokument\u00f3w nazywamy s\u0142ownikiem (ang. _vocabulary_), nie myli\u0107 ze s\u0142ownikiem jako struktur\u0105 danych w Pythonie (_dictionary_).\n",
"\n", "\n",
"$$V = \\bigcup_{i=1}^N \\{t_i^1,\\dots,t_i^{|d_i|}\\}$$\n", "$$V = \\bigcup_{i=1}^N \\{t_i^1,\\dots,t_i^{|d_i|}\\}$$\n",
"\n", "\n",
"(To zbiór, więc liczymy bez powtórzeń!)" "(To zbi\u00f3r, wi\u0119c liczymy bez powt\u00f3rze\u0144!)"
] ]
}, },
{ {
@ -1943,9 +1959,9 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## Jak wyszukiwarka może być szybka?\n", "## Jak wyszukiwarka mo\u017ce by\u0107 szybka?\n",
"\n", "\n",
"_Odwrócony indeks_ (ang. _inverted index_) pozwala wyszukiwarce szybko szukać w milionach dokumentów. Odwrócony indeks to prostu... indeks, jaki znamy z książek (mapowanie słów na numery stron/dokumentów).\n", "_Odwr\u00f3cony indeks_ (ang. _inverted index_) pozwala wyszukiwarce szybko szuka\u0107 w milionach dokument\u00f3w. Odwr\u00f3cony indeks to prostu... indeks, jaki znamy z ksi\u0105\u017cek (mapowanie s\u0142\u00f3w na numery stron/dokument\u00f3w).\n",
"\n", "\n",
"\n", "\n",
"\n" "\n"
@ -2336,36 +2352,36 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## Relewantność\n", "## Relewantno\u015b\u0107\n",
"\n", "\n",
"Potrafimy szybko przeszukiwać znormalizowane dokumenty, ale które dokumenty są ważne (_relewantne_) względem potrzeby informacyjnej użytkownika?\n", "Potrafimy szybko przeszukiwa\u0107 znormalizowane dokumenty, ale kt\u00f3re dokumenty s\u0105 wa\u017cne (_relewantne_) wzgl\u0119dem potrzeby informacyjnej u\u017cytkownika?\n",
"\n", "\n",
"### Zapytania boole'owskie\n", "### Zapytania boole'owskie\n",
"\n", "\n",
"* `pizzeria Poznań dowóz` to `pizzeria AND Poznań AND dowóz` czy `pizzeria OR Poznań OR dowóz`\n", "* `pizzeria Pozna\u0144 dow\u00f3z` to `pizzeria AND Pozna\u0144 AND dow\u00f3z` czy `pizzeria OR Pozna\u0144 OR dow\u00f3z`\n",
"* `(pizzeria OR pizza OR tratoria) AND Poznań AND dowóz\n", "* `(pizzeria OR pizza OR tratoria) AND Pozna\u0144 AND dow\u00f3z\n",
"* `pizzeria AND Poznań AND dowóz AND NOT golonka`\n", "* `pizzeria AND Pozna\u0144 AND dow\u00f3z AND NOT golonka`\n",
"\n", "\n",
"Jak domyślnie interpretować zapytanie?\n", "Jak domy\u015blnie interpretowa\u0107 zapytanie?\n",
"\n", "\n",
"* jako zapytanie AND -- być może za mało dokumentów\n", "* jako zapytanie AND -- by\u0107 mo\u017ce za ma\u0142o dokument\u00f3w\n",
"* rozwiązanie pośrednie?\n", "* rozwi\u0105zanie po\u015brednie?\n",
"* jako zapytanie OR -- być może za dużo dokumentów\n", "* jako zapytanie OR -- by\u0107 mo\u017ce za du\u017co dokument\u00f3w\n",
"\n", "\n",
"Możemy jakieś miary dopasowania dokumentu do zapytania, żeby móc posortować dokumenty...\n", "Mo\u017cemy jakie\u015b miary dopasowania dokumentu do zapytania, \u017ceby m\u00f3c posortowa\u0107 dokumenty...\n",
"\n", "\n",
"### Mierzenie dopasowania dokumentu do zapytania\n", "### Mierzenie dopasowania dokumentu do zapytania\n",
"\n", "\n",
"Potrzebujemy jakieś funkcji $\\sigma : Q x D \\rightarrow \\mathbb{R}$. \n" "Potrzebujemy jakie\u015b funkcji $\\sigma : Q x D \\rightarrow \\mathbb{R}$. \n"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Musimy jakoś zamienić dokumenty na liczby, tj. dokumenty na wektory liczb, a całą kolekcję na macierz.\n", "Musimy jako\u015b zamieni\u0107 dokumenty na liczby, tj. dokumenty na wektory liczb, a ca\u0142\u0105 kolekcj\u0119 na macierz.\n",
"\n", "\n",
"Po pierwsze ponumerujmy wszystkie termy ze słownika." "Po pierwsze ponumerujmy wszystkie termy ze s\u0142ownika."
] ]
}, },
{ {
@ -2431,7 +2447,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Napiszmy funkcję, która _wektoryzuje_ znormalizowany dokument.\n", "Napiszmy funkcj\u0119, kt\u00f3ra _wektoryzuje_ znormalizowany dokument.\n",
"\n" "\n"
] ]
}, },
@ -2562,7 +2578,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"mieć" "mie\u0107"
] ]
}, },
"metadata": {}, "metadata": {},
@ -2614,7 +2630,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Jak inaczej uwzględnić częstość wyrazów?\n", "### Jak inaczej uwzgl\u0119dni\u0107 cz\u0119sto\u015b\u0107 wyraz\u00f3w?\n",
"\n", "\n",
"<div style=\"display:none\">\n", "<div style=\"display:none\">\n",
" $\n", " $\n",
@ -2750,7 +2766,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"mieć" "mie\u0107"
] ]
}, },
"metadata": {}, "metadata": {},
@ -2809,32 +2825,32 @@
" $\n", " $\n",
"</div>\n", "</div>\n",
"\n", "\n",
"### Odwrotna częstość dokumentowa\n", "### Odwrotna cz\u0119sto\u015b\u0107 dokumentowa\n",
"\n", "\n",
"Czy wszystkie wyrazy są tak samo ważne?\n", "Czy wszystkie wyrazy s\u0105 tak samo wa\u017cne?\n",
"\n", "\n",
"**NIE.** Wyrazy pojawiające się w wielu dokumentach są mniej ważne.\n", "**NIE.** Wyrazy pojawiaj\u0105ce si\u0119 w wielu dokumentach s\u0105 mniej wa\u017cne.\n",
"\n", "\n",
"Aby to uwzględnić, przemnażamy frekwencję wyrazu przez _odwrotną\n", "Aby to uwzgl\u0119dni\u0107, przemna\u017camy frekwencj\u0119 wyrazu przez _odwrotn\u0105\n",
" częstość w dokumentach_ (_inverse document frequency_):\n", " cz\u0119sto\u015b\u0107 w dokumentach_ (_inverse document frequency_):\n",
"\n", "\n",
"$$\\idf_t = \\log \\frac{N}{\\df_t},$$\n", "$$\\idf_t = \\log \\frac{N}{\\df_t},$$\n",
"\n", "\n",
"gdzie:\n", "gdzie:\n",
"\n", "\n",
"* $\\idf_t$ - odwrotna częstość wyrazu $t$ w dokumentach\n", "* $\\idf_t$ - odwrotna cz\u0119sto\u015b\u0107 wyrazu $t$ w dokumentach\n",
"\n", "\n",
"* $N$ - liczba dokumentów w kolekcji\n", "* $N$ - liczba dokument\u00f3w w kolekcji\n",
"\n", "\n",
"* $\\df_f$ - w ilu dokumentach wystąpił wyraz $t$?\n", "* $\\df_f$ - w ilu dokumentach wyst\u0105pi\u0142 wyraz $t$?\n",
"\n", "\n",
"#### Dlaczego idf?\n", "#### Dlaczego idf?\n",
"\n", "\n",
"term $t$ wystąpił...\n", "term $t$ wyst\u0105pi\u0142...\n",
"\n", "\n",
"* w 1 dokumencie, $\\idf_t = \\log N/1 = \\log N$\n", "* w 1 dokumencie, $\\idf_t = \\log N/1 = \\log N$\n",
"* 2 razy w kolekcji, $\\idf_t = \\log N/2$ lub $\\log N$\n", "* 2 razy w kolekcji, $\\idf_t = \\log N/2$ lub $\\log N$\n",
"* w połowie dokumentów kolekcji, $\\idf_t = \\log N/(N/2) = \\log 2$\n", "* w po\u0142owie dokument\u00f3w kolekcji, $\\idf_t = \\log N/(N/2) = \\log 2$\n",
"* we wszystkich dokumentach, $\\idf_t = \\log N/N = \\log 1 = 0$\n", "* we wszystkich dokumentach, $\\idf_t = \\log N/N = \\log 1 = 0$\n",
"\n" "\n"
] ]
@ -2888,7 +2904,7 @@
"source": [ "source": [
"#### Co z tego wynika?\n", "#### Co z tego wynika?\n",
"\n", "\n",
"Zamiast $\\tf_{t,d}$ będziemy w wektorach rozpatrywać wartości:\n", "Zamiast $\\tf_{t,d}$ b\u0119dziemy w wektorach rozpatrywa\u0107 warto\u015bci:\n",
"\n", "\n",
"$$\\tfidf_{t,d} = \\tf_{t,d} \\times \\idf_{t}$$\n", "$$\\tfidf_{t,d} = \\tf_{t,d} \\times \\idf_{t}$$\n",
"\n" "\n"
@ -2911,7 +2927,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"mieć" "mie\u0107"
] ]
}, },
"metadata": {}, "metadata": {},
@ -2999,21 +3015,21 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Podobieństwo kosinusowe\n", "### Podobie\u0144stwo kosinusowe\n",
"\n", "\n",
"_Overlap score measure_ nie jest jedyną możliwą metryką, za pomocą której możemy mierzyć dopasowanie dokumentu do zapytania. Możemy również sięgnąć po intuicje geometryczne (skoro mamy do czynienia z wektorami).\n", "_Overlap score measure_ nie jest jedyn\u0105 mo\u017cliw\u0105 metryk\u0105, za pomoc\u0105 kt\u00f3rej mo\u017cemy mierzy\u0107 dopasowanie dokumentu do zapytania. Mo\u017cemy r\u00f3wnie\u017c si\u0119gn\u0105\u0107 po intuicje geometryczne (skoro mamy do czynienia z wektorami).\n",
"\n", "\n",
"**Pytanie**: Ile wymiarów mają wektory, na których operujemy? Jak \"wyglądają\" te wektory? Czy możemy wykonywać na nich standardowe operacje geometryczne czy te, które znamy z geometrii liniowej?\n", "**Pytanie**: Ile wymiar\u00f3w maj\u0105 wektory, na kt\u00f3rych operujemy? Jak \"wygl\u0105daj\u0105\" te wektory? Czy mo\u017cemy wykonywa\u0107 na nich standardowe operacje geometryczne czy te, kt\u00f3re znamy z geometrii liniowej?\n",
"\n", "\n",
"#### Podobieństwo między dokumentami\n", "#### Podobie\u0144stwo mi\u0119dzy dokumentami\n",
"\n", "\n",
"Zajmijmy się teraz poszukiwaniem miary mierzącej podobieństwo między dokumentami $d_1$ i $d_2$ (czyli poszukujemy sensownej funkcji $\\sigma : D x D \\rightarrow \\mathbb{R}$).\n", "Zajmijmy si\u0119 teraz poszukiwaniem miary mierz\u0105cej podobie\u0144stwo mi\u0119dzy dokumentami $d_1$ i $d_2$ (czyli poszukujemy sensownej funkcji $\\sigma : D x D \\rightarrow \\mathbb{R}$).\n",
"\n", "\n",
"**Uwaga** Pojęcia \"miary\" używamy nieformalnie, nie spełnia ona założeń znanych z teorii miary.\n", "**Uwaga** Poj\u0119cia \"miary\" u\u017cywamy nieformalnie, nie spe\u0142nia ona za\u0142o\u017ce\u0144 znanych z teorii miary.\n",
"\n", "\n",
"Rozpatrzmy zbiorek tekstów legend miejskich z <git://gonito.net/polish-urban-legends>.\n", "Rozpatrzmy zbiorek tekst\u00f3w legend miejskich z <git://gonito.net/polish-urban-legends>.\n",
"\n", "\n",
"(To autentyczne teksty z Internentu, z językiem potocznym, wulgarnym itd.)\n", "(To autentyczne teksty z Internentu, z j\u0119zykiem potocznym, wulgarnym itd.)\n",
"\n", "\n",
"```\n", "```\n",
" git clone git://gonito.net/polish-urban-legends\n", " git clone git://gonito.net/polish-urban-legends\n",
@ -3038,7 +3054,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"Opowieść prawdziwa... Olsztyn, akademik, 7 piętro, impreza u Mariusza, jak to na polskiej najebce bywa ktoś rzucił tekstem: \"Mariusz nie zjedziesz na nartach po schodach\". Sprawa ucichla, studencii wrocili do tego co lubia i w sumie umieją najbardziej czyli picia, lecz nad ranem kolo godziny 6.00 ludzia przypomnialo sie ze Mariusz miał zjechać na nartach po schodach. Tu warto wspomnieć że Mariusz był zapalonym narciarzem stąd właśnie w jego pokoju znalezc można bylo narty, bo po ki huj komuś narty w Olsztynie! Tak wracajac do historii nasz bohater odział się w sprzet, podszed do schodow i niestety dał radę zjechać jedynie w połowie, gdyż jak to powiedzial \"no kurwa potknąłem sie\", ale nieustraszoony Mariusz próbowal dalej. Nastepny zjazd byl perfekcyjny, jedno pietro zanim, niestety pomiedzy 6 a 5 pietrem Mariusza natrafil na Pania sprzątaczke, która potrącił i zwiał z miejsca wypadku. Ok godziny 10.00 nastopilo przebudzenie Mariusza, ktory zaraz po obudzeniu uslyszal co narobił, mianowicie o skutkach potracenia, Pani sprzataczka złamala rękę i trafiła do szpitala. Mogły powstać przez to cieżkie konsekwencje, Mariusz mógł wyleciec z akademika jeżeli kierownik dowie sie o calym zajściu. Wiec koledzy poradzili narciażowi, aby kupił kwiaty i bombonierkę i poszedł do szpitala z przeprosinami. Po szybkich zakupach w sasiedniej Biedrące, Mariusz byl przygotowany na konfrontacje z Pania sprzątaczka, ale nie mogło pojść pięknie i gładko. Po wejściu do szpitala nasz bohater skierowal swoje kroki do recepcji pytajac się o ciocię, która miała wypadek w akademiku, recepcjonistka skierowała go do lekarza, gdzie czekał na jego wyjście ok 15 minut, gdy lekarz już wyszedł ten odrazu podleciał do niego, żeby spytać się o stan zdrowia Pani sprzątaczki. Wnet uslyszla od lekarz, niestety Pani teraz jest u psychiatry po twierdzi, że ktoś potracil ja zjeżdzajac na nartach w akademiku. Po uslyszeniu tej wiadomosci Mariusz odwrocił się, wybiegł, kupił piecie i szybko pobiegł do akademika pić dalej! Morał... student potrafi!" "Opowie\u015b\u0107 prawdziwa... Olsztyn, akademik, 7 pi\u0119tro, […]"
] ]
}, },
"metadata": {}, "metadata": {},
@ -3877,7 +3893,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"Ja podejrzewam że o polowaniu nie było mowy, po prostu znalazł martwego szczupaka i skorzystał z okazji! Mnie mocno zdziwiła jego siła żeby taki pół kilogramowy okaz szczupaka przesuwać o parę metrów i to w trzcinach! Szacuneczek. Przypomniala mi sie historia którą kiedys zaslyszalem o wlascicielce pytona, ktory nagle polozyl sie wzdluz jej łóżka. Leżał tak wyciągniety jak struna dłuższy czas jak nieżywy (a był długości łóżka), więc kobitka zadzonila do weterynarza co ma robić. Usłyszała że ma szybko zamknąć się w łazience i poczekać na niego bo pyton ją mierzy jako potencjalną ofiarę (czy mu się zmieści w brzuchu...). Wierzyć, nie wierzyć? Kiedyś nie wierzyłem ale od kilku dni mam wątpliwosci... Pozdrawiam" "Ja podejrzewam \u017ce o polowaniu nie by\u0142o mowy, po prostu znalaz\u0142 martwego szczupaka i skorzysta\u0142 z okazji! Mnie mocno zdziwi\u0142a jego si\u0142a \u017ceby taki p\u00f3\u0142 kilogramowy okaz szczupaka przesuwa\u0107 o par\u0119 metr\u00f3w i to w trzcinach! Szacuneczek. Przypomniala mi sie historia kt\u00f3r\u0105 kiedys zaslyszalem o wlascicielce pytona, ktory nagle polozyl sie wzdluz jej \u0142\u00f3\u017cka. Le\u017ca\u0142 tak wyci\u0105gniety jak struna d\u0142u\u017cszy czas jak nie\u017cywy (a by\u0142 d\u0142ugo\u015bci \u0142\u00f3\u017cka), wi\u0119c kobitka zadzonila do weterynarza co ma robi\u0107. Us\u0142ysza\u0142a \u017ce ma szybko zamkn\u0105\u0107 si\u0119 w \u0142azience i poczeka\u0107 na niego bo pyton j\u0105 mierzy jako potencjaln\u0105 ofiar\u0119 (czy mu si\u0119 zmie\u015bci w brzuchu...). Wierzy\u0107, nie wierzy\u0107? Kiedy\u015b nie wierzy\u0142em ale od kilku dni mam w\u0105tpliwosci... Pozdrawiam"
] ]
}, },
"metadata": {}, "metadata": {},
@ -3935,7 +3951,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Wektoryzujemy całą kolekcję:" "Wektoryzujemy ca\u0142\u0105 kolekcj\u0119:"
] ]
}, },
{ {
@ -3962,14 +3978,14 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Szukamy funkcji $sigma$, która da wysoką wartość dla tekstów dotyczących tego samego wątku legendowego (np. $d_1$ i $d_2$ mówią o wężu przymierzającym się do zjedzenia swojej właścicielki) i niską dla tekstów z różnych wątków (np. $d_1$ opowiada o wężu ludojadzie, $d_2$ - bałwanku na hydrancie)." "Szukamy funkcji $sigma$, kt\u00f3ra da wysok\u0105 warto\u015b\u0107 dla tekst\u00f3w dotycz\u0105cych tego samego w\u0105tku legendowego (np. $d_1$ i $d_2$ m\u00f3wi\u0105 o w\u0119\u017cu przymierzaj\u0105cym si\u0119 do zjedzenia swojej w\u0142a\u015bcicielki) i nisk\u0105 dla tekst\u00f3w z r\u00f3\u017cnych w\u0105tk\u00f3w (np. $d_1$ opowiada o w\u0119\u017cu ludojadzie, $d_2$ - ba\u0142wanku na hydrancie)."
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Może po prostu odległość euklidesowa, skoro to punkty w wielowymiarowej przestrzeni?" "Mo\u017ce po prostu odleg\u0142o\u015b\u0107 euklidesowa, skoro to punkty w wielowymiarowej przestrzeni?"
] ]
}, },
{ {
@ -4282,13 +4298,13 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Problem: za dużo zależy od długości tekstu.\n", "Problem: za du\u017co zale\u017cy od d\u0142ugo\u015bci tekstu.\n",
"\n", "\n",
"Rozwiązanie: znormalizować wektor $v$ do wektora jednostkowego.\n", "Rozwi\u0105zanie: znormalizowa\u0107 wektor $v$ do wektora jednostkowego.\n",
"\n", "\n",
"$$ \\vec{1}(v) = \\frac{v}{|v|} $$\n", "$$ \\vec{1}(v) = \\frac{v}{|v|} $$\n",
"\n", "\n",
"Taki wektor ma długość 1!" "Taki wektor ma d\u0142ugo\u015b\u0107 1!"
] ]
}, },
{ {
@ -4351,11 +4367,11 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"#### Podobieństwo kosinusowe\n", "#### Podobie\u0144stwo kosinusowe\n",
"\n", "\n",
"Częściej zamiast odległości euklidesowej stosuje się podobieństwo kosinusowe, czyli kosinus kąta między wektorami.\n", "Cz\u0119\u015bciej zamiast odleg\u0142o\u015bci euklidesowej stosuje si\u0119 podobie\u0144stwo kosinusowe, czyli kosinus k\u0105ta mi\u0119dzy wektorami.\n",
"\n", "\n",
"Wektor dokumentu ($\\vec{V}(d)$) - wektor, którego składowe odpowiadają wyrazom.\n", "Wektor dokumentu ($\\vec{V}(d)$) - wektor, kt\u00f3rego sk\u0142adowe odpowiadaj\u0105 wyrazom.\n",
"\n", "\n",
"$$\\sigma(d_1,d_2) = \\cos\\theta(\\vec{V}(d_1),\\vec{V}(d_2)) = \\frac{\\vec{V}(d_1) \\cdot \\vec{V}(d_2)}{|\\vec{V}(d_1)||\\vec{V}(d_2)|} $$\n", "$$\\sigma(d_1,d_2) = \\cos\\theta(\\vec{V}(d_1),\\vec{V}(d_2)) = \\frac{\\vec{V}(d_1) \\cdot \\vec{V}(d_2)}{|\\vec{V}(d_1)||\\vec{V}(d_2)|} $$\n",
"\n", "\n",
@ -4367,7 +4383,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Zauważmy, że jest to iloczyn skalarny znormalizowanych wektorów!\n", "Zauwa\u017cmy, \u017ce jest to iloczyn skalarny znormalizowanych wektor\u00f3w!\n",
"\n", "\n",
"$$\\sigma(d_1,d_2) = \\vec{1}(\\vec{V}(d_1)) \\times \\vec{1}(\\vec{V}(d_2)) $$" "$$\\sigma(d_1,d_2) = \\vec{1}(\\vec{V}(d_1)) \\times \\vec{1}(\\vec{V}(d_2)) $$"
] ]
@ -4388,10 +4404,10 @@
} }
], ],
"source": [ "source": [
"(✕) :: [Double] -> [Double] -> Double\n", "(\u2715) :: [Double] -> [Double] -> Double\n",
"(✕) v1 v2 = sum $ Prelude.zipWith (*) v1 v2\n", "(\u2715) v1 v2 = sum $ Prelude.zipWith (*) v1 v2\n",
"\n", "\n",
"[2, 1, 0] ✕ [-2, 5, 10]" "[2, 1, 0] \u2715 [-2, 5, 10]"
] ]
}, },
{ {
@ -4423,7 +4439,7 @@
} }
], ],
"source": [ "source": [
"cosineSim v1 v2 = toUnitVector v1 ✕ toUnitVector v2\n", "cosineSim v1 v2 = toUnitVector v1 \u2715 toUnitVector v2\n",
"\n", "\n",
"paintMatrix cosineSim labelsLimited limitedL" "paintMatrix cosineSim labelsLimited limitedL"
] ]
@ -4436,7 +4452,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"na tylnym siedzeniu w autobusie siedzi matka z 7-8 letnim synkiem. naprzeciwko synka siedzi kobieta (zwrócona twarzą do dzieciaka). synek co chwile wymachuje nogami i kopie kobietę, matka widząc to nie reaguje na to wogóle. wreszcie kobieta zwraca uwagę matce, żeby ta powiedziała coś synowi a matka do niej: nie mogę, bo wychowuję syna bezstresowo!!! ...chłopak, który stał w pobliżu i widział i słyszał całe to zajście wypluł z ust gumę do żucia i przykleił matce na czoło i powiedział: ja też byłem bezstresowo wychowywany... autentyczny przypadek w londyńskim autobusie (a tym co przykleił matce gumę na czoło był chyba nawet młody Polak)" "na tylnym siedzeniu w autobusie siedzi matka z 7-8 letnim synkiem. […]"
] ]
}, },
"metadata": {}, "metadata": {},
@ -4455,7 +4471,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"Krótko zwięźle i na temat. Zastanawia mnie jak ludzie wychowują dzieci. Co prawda sam nie mam potomstwa i nie zamierzam mieć jak narazie (bo to trochę głupie mieć 17-letniego tatusia), ale niestety mam przyjemność oglądać efekty wychowawcze niektórych par (dzięki znajomym rodziców w różnym wieku). Są trzy najbardziej znane mi modele wychowania. Surowe, bezstresowe (w moim znaczeniu) i \"bezstresowe\" w mowie potocznej. Zaczynam od tego pierwszego. Jak nazwa wskazuje, jest to surowe wychowanie, oparte na karach cielesnych lub torturach umysłowych. Nie uważam tego za dobre wychowanie, bo dziecko jak będzie nieco starsze będzie się bało wszystkiego, bo uzna, ż jak zrobi coś żle to spotka je kara. Więc bicie za różne rzeczy odpada (no chyba, że dzieciak na serio nabroi to oczywiście). Wychowanie bezstresowe z mojego słownika oznacza nienarażanie dziecka na stresy, pocieszanie w trudnych sytuacjach, załatwianie problemów przez rozmowę oraz stały kontakt z dzieckiem. I to chyba najlepsze. Sam zostałem tak wychowany i cieszę się z tego powodu. I oczywiście \"wychowanie bezstresowe\". A tu się normalnie rozpiszę. Po pierwsze geneza. Więc jak dochodzi do takiego wychowania? Odpowiedź. Mamusi i tatusiowi się zachciało bobaska bo to takie malutkie fajniutkie i ooo. Oboje zazdroszczą innym parom bo one mają, a oni nie, więc oni też chcą. No więc rodzi im się bobasek, chuchają dmuchają na niego póki małe. Ale przychodzi ten okres, kiedy dziecko trzeba wychować i kiedy ma się na dzieciaka największy wpływ. I tu się zaczynają schody. Nagle oboje nie mają czasu i mówią \"Wychowamy go/ją/ich (niepotrzebne skreślić) bezstresowo.\" Po drugie. Decyzja o sposobie wychowania podjęta. A więc jak to wygląda? Odpowiedź. Totalna olewka! Mama i tata balują, a dzieciaka zostawiają samemu sobie, albo pod opiekę babci, która również leje na dziecko ciepłym moczem. Dzieciak rośnie i rośnie, nie wie co dobre a co złe. Przypomniała mi się pewna, podobno autentyczna scenka. Chłopak jedzie ze szwagrem autobusem czy tam tramwajem. Na jednym miejscu siedzi starowinka, a na przeciwko niej siedzi lafirynda z brzdącem na kolanach. No i sobie dzieciak macha nóżkami i tu ciach i kopnął staruszkę w nogę. Babcia nic sobie z tego nie zrobiła, a dzieciak nie widząc reakcji zaczął ją już celowo kopać. Staruszka: Może pani powiedzieć coś synkowi żeby mnie nie kopał. Matka: Nie bo ja go wychowuję bezstresowo. Szwagier wyciąga z ust gumę do żucia i przykleja mamusi na czoło mówiąc: Moja mama też mnie wychowała bezstresowo. Ciekaw jestem ile w tym prawdy było, a jeżeli 100% to czy mamusi się odmieniły poglądy. Kto go wie? Po trzecie. Dorosły wychowany bezstresowo. Jaki on jest? Odpowiedź. Zupełnie inny. Myśli, że jest pępkiem świata i że wszystko musi być pod jego dyktando. Pracując w Szwajcarii przy pielęgnacji winogron, syn polskiego kolegi taty zaczął rzucać we mnie winogronami. Miałem ochotę wbić mu nożyczki (którymi podcinałem liście) w oczy. A to byłby ciekawy widok. Dzieciak o białych włosach, skórze i niebieskich oczach stałby sie albinosem (bo z niebieskich oczu stałyby sie czerwone jak u białych szczurów i myszek). Ojciec sie co prawda na niego wydzierał, żeby nie przeszkadzał, ale jak widać dzieciak miał to po prostu w dupie. Więc skoro dziecko nie słucha się nawet rodzica, to jak w szkole posłucha nauczyciela? Jak znajdzie pracę, w której będzie jakiś szef (chyba, że sam sobie będzie szefem)? W ten oto sposób jak dowiaduję się o tym, że ktoś wychowuje dzieciaka bezstresowo, ciary przechodzą mi po plecach, a tegoż rodzica mam ochotę palnąć mu w łeb tak żeby się przekręcił (zarówno łeb jak i poglądy). A jak mnie wychowano? Byłem często sam sobie zostawiany. Ale nie oznacza że to byla wspomniana olewka. Jako, że rodzice pracowali, a rodzeństwo chodziło do szkoły, podrzucali mnie do babci. A wieczorami się mną opiekowali. Gadali jak miałem problemy i nie bili bo ponoć byłem spokojnym dzieckiem. No i tyle. Do 17 urodzin 2 dni, a szczura chyba nie dostanę. A sam nie kupię!;(" "Kr\u00f3tko zwi\u0119\u017ale i na temat. Zastanawia mnie jak ludzie wychowuj\u0105 dzieci. […]"
] ]
}, },
"metadata": {}, "metadata": {},
@ -4472,7 +4488,7 @@
"source": [ "source": [
"##### Z powrotem do wyszukiwarek\n", "##### Z powrotem do wyszukiwarek\n",
"\n", "\n",
"Możemy potraktować zapytanie jako bardzo krótki dokument, dokonać jego wektoryzacji i policzyć cosinus kąta między zapytaniem a dokumentem." "Mo\u017cemy potraktowa\u0107 zapytanie jako bardzo kr\u00f3tki dokument, dokona\u0107 jego wektoryzacji i policzy\u0107 cosinus k\u0105ta mi\u0119dzy zapytaniem a dokumentem."
] ]
}, },
{ {
@ -4483,7 +4499,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"ja za to znam przypadek, że koleżanka mieszkala w bloku parę lat temu, pewnego razu wchodzi do łazienki w samej bieliźnie a tam ogromny wąż na podłodze i tak się wystraszyła że wybiegła z wrzaskiem z mieszkania i wyleciała przed blok w samej bieliźnie i uciekła do babci swojej, która mieszkala gdzieś niedaleko. a potem się okazało, że jej sąsiad z dołu hodował sobie węża i tak właśnie swobodnie go \"pasał\" po mieszkaniu i wąż mu spierdzielił przez rurę w łazience :cool :" "ja za to znam przypadek, \u017ce kole\u017canka mieszkala w bloku par\u0119 lat temu, pewnego razu wchodzi do \u0142azienki w samej bieli\u017anie a tam ogromny w\u0105\u017c na pod\u0142odze i tak si\u0119 wystraszy\u0142a \u017ce wybieg\u0142a z wrzaskiem z mieszkania i wylecia\u0142a przed blok w samej bieli\u017anie i uciek\u0142a do babci swojej, kt\u00f3ra mieszkala gdzie\u015b niedaleko. a potem si\u0119 okaza\u0142o, \u017ce jej s\u0105siad z do\u0142u hodowa\u0142 sobie w\u0119\u017ca i tak w\u0142a\u015bnie swobodnie go \"pasa\u0142\" po mieszkaniu i w\u0105\u017c mu spierdzieli\u0142 przez rur\u0119 w \u0142azience :cool :"
] ]
}, },
"metadata": {}, "metadata": {},
@ -4492,7 +4508,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"Pewna dziewczyna, wieku mi nieznanego, w mieście stołecznym - rozwiodła się. Była sama i samotna, więc zapragnęła kupić sobie zwierzę, aby swą miłą obecnością rozjaśniało jej puste wieczory i takież poranki. Dziewczyna była najwyraźniej ekscentryczką, bo zamiast rozkosznego, miękkiego kociaka z czerwonym kłębuszkiem wełenki lub kudłatego pieska , co sika na parkiet i gryzie skarpetki - kupiła sobie ... węża. Wąż zamieszkał z dziewczyną, i dobrze im było. Gad jadł, spał i rósł, a po pierwszym okresie obojętności ( zwłaszcza ze strony węża ) nawiązała się między nimi nić porozumienia. Przynajmniej dziewczyna odczuwała tę nić wyraźnie, gdyż wąż reagował na jej obecność, a nocą spał zwinięty w kłębek w nogach jej łóżka. Po dwóch latach wspólnego bytowania, nie przerywanych żadnym znaczącym wydarzeniem w ich wzajemnych relacjach, dziewczyna zauważyła, że wąż stał się osowiały. Przestał jeść, chował się po kątach, a nocami, zamiast w nogach łóżka - sypiał wyciągnięty wzdłuż jej boku. Martwiła się o swojego gada i poszła z nim do weterynarza. Weterynarz zbadał go, zapisał leki na poprawę apetytu ( ciekawe, jak się bada węża ? ) i odesłał do domu. Zdrowie śliskiego pacjenta nie poprawiło się, więc troskliwa dziewczyna postanowiła zasięgnąć porady u znawcy gadów i gadzich obyczajów. Znawca wysłuchał opisu niepokojących objawów, i powiedział : - Proszę pani. Ten wąż nie jest chory. On teraz pości. A leży wzdłuż pani nocą, bo sprawdza, czy pani się zmieści. To prawdziwa historia. Opowiedziała nam ją dziś klientka. Leżę na łóżku, pisze tego posta, i patrzę na drzemiącą obok mnie kotkę. Trochę mała jest. Raczej nie ma szans, żebym sie zmieściła, jakby co.." "Pewna dziewczyna, wieku mi nieznanego, w mie\u015bcie sto\u0142ecznym - rozwiod\u0142a si\u0119. By\u0142a sama i samotna, wi\u0119c zapragn\u0119\u0142a kupi\u0107 sobie zwierz\u0119, […]"
] ]
}, },
"metadata": {}, "metadata": {},
@ -4501,7 +4517,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"Anakonda. Czy to kolejna miejska legenda? Jakiś czas temu koleżanka na jednej z imprez towarzyskich opowiedziała mrożącą krew w żyłach historię o dziewczynie ze swojej pracy, która w Warszawie na dyskotece w Dekadzie poznała chłopaka. Spotykała się z nim na kawę i po drugiej randce doszło do pocałunków. Umówiła się na trzecią randkę, ale zanim do niej doszło wyskoczył jej jakiś pryszcz na twarzy. Poszła do lekarza, a ten... zawiadomił policję, prokuraturę itd. , bo rozpoznał zarażenie... jadem trupim! Rozpoczęto przesłuchanie dziewczyny i po wyjaśnieniach trafiono do chłopaka, z którym się całowała. W jego domu odkryto rozkładające się zwłoki dwóch dziewczyn. Byłam ta historią wstrząśnięta. Następnego dnia opowiedziałam ją w pracy, a koleżanka Justyna przyznała, że już o tym slyszała. To mnie utwierdziło, że historia jest prawdziwa, ale... tylko do wieczora. Coś mi nie dawało spokoju. Uwaga TVN nic? Interwencja Polsatu - nic? Nasz rodzimy Telekurier nic? Zaczęłam sprawdzać w internecie co to jest jad trupi, opryszczka od zakażenia tymże jadem i tak... trafiłam na miejską legendę. Historia wydarzyła się nie tylko w Warszawie, ale i w Olsztynie, Toruniu, Wrocławiu i Krakowie, a być może w ogóle za granicą. Choć prawdopodobne jest, że nie wydarzyła się nigdy. Głośno o niej było na miejskch forach. Za każdym razem ofiara była czyjąś znajomą. Po przeczytaniu kolejnej wersji historii zadzwoniłam do koleżanki, która opowiedziała mi tę historię i sklęłam czym świat stoi. Dlatego kiedy kilka dni temu inna koleżanka opowiedziała kolejną mrożącą krew w żyłach historię - tym razem o anakondzie - rozpoczęłam poszukiwania w internecie czy to nie jest następna miejska legenda. Nic nie znalazłam. Jednak coś mi nie pasuje, choć ta historia może brzmieć wielce prawdopodobnie. Zwłaszcza, gdy ktoś oglądał głupawy film z J. Lo. Zainteresowało mnie to, bo siedząc nad powieścią \"Dzika\" poczytałam trochę o wężach. A o jaką historię mi chodzi? Pewna kobieta (podobno sąsiadka tej mojej koleżanki z pracy, która historię opowiadała) hodowała w domu węża - anakondę. Hodowała ją pięć lat i nie trzymała w terrarium. Anakonda chodziła (pełzała) samopas po domu i co kilka dni dostawała chomika, szczura, mysz lub królika do zjedzenia. Pewnego dnia przestała jeść i zaczęła się dziwnie zachowywać. Każdego ranka po przebudzeniu właścicielka znajdowała ją w swoim łóżku wyprostowaną jak struna. Po dwóch tygodniach takich zachowań ze strony anakondy właścicielka zaniepokojona stanem zdrowia ukochanego węża poszła z nim do lekarza. Ten wysłuchał objawów \"choroby\" i powiedział, że anakonda głodziła się, by zjeść... włascicielkę. Kładzenie się koło niej było mierzeniem ile jeszcze głodzić się trzeba, by właścicielka zmieściła się w pysku no i badaniem od której strony trzeba ją zaatakować. Wężowi chodziło bowiem o to, by smakowity i duży obiad się za bardzo nie bronił. Ja domyśliłam się od razu do czego zmierza ta historia (lektura artykułów o wężach zrobiła swoje), ale dla reszty, którzy słuchali było to szokiem. Mnie szokuje co innego. Po co trzymać węża skoro nie ma z nim człowiek żadnego kontaktu? To nie pies, kot czy inny ssak. To nie ptak. Wąż to wąż! Nie przyjdzie na zawołanie. Jaby ktoś nie wiedział to... Węże są mięsożerne. Połykają ofiary w całości, mimo że często wielokrotnie są one większe od samego węża. Połykanie polega na nasuwaniu się węża na swoją ofiarę. A anakonda... żyje zwykle w wodzie i na drzewach, żywiąc się ssakami (m.in. tapiry, dziki, kapibary, jelenie!, gryzonie, niekiedy nawet jaguary), gadami (kajmany), rybami i ptakami, polując zazwyczaj w nocy. Jest w stanie połknąć ofiarę znacznie szerszą od swojego ciała, co jest możliwe dzięki rozciągnięciu szczęk. Trawienie jest bardzo powolne - po posiłku wąż trawi większą ofiarę przez wiele dni, a potem może pościć przez szereg tygodni lub miesięcy. Zanotowany rekord postu, w przypadku anakondy znajdującej się w niewoli, wynosi 2 lata. Z historii wynika, że gdyby nie interwencja u weterynarza mogłaby rodzina przez kilka lat szukać właścicielki anakondy. Myśleliby, że jest na wycieczce a ona w brzuszku w postaci obiadku. Jest tylko jedno ale. Nigdzie nie znalazłam jednak śladu, ani nawet wzmianki o tym, że anakonda zjadła człowieka. I dlatego ciągle w sumie mam wątpliwości. ps. Dalszy los anakondy \"sąsiadki\" koleżanki nie jest mi znany." "Anakonda. Czy to kolejna miejska legenda? Jaki\u015b czas temu kole\u017canka na jednej z imprez towarzyskich opowiedzia\u0142a mro\u017c\u0105c\u0105 krew w \u017cy\u0142ach histori\u0119 o dziewczynie ze swojej pracy, kt\u00f3ra w Warszawie na dyskotece w Dekadzie pozna\u0142a ch\u0142opaka. […]"
] ]
}, },
"metadata": {}, "metadata": {},
@ -4518,7 +4534,7 @@
"query vs vzer q = map ((collectionL !!) . snd) $ Data.List.take 3 $ sortBy (\\a b -> fst b `compare` fst a) $ zip (map (`cosineSim` qvec) vs) [0..] \n", "query vs vzer q = map ((collectionL !!) . snd) $ Data.List.take 3 $ sortBy (\\a b -> fst b `compare` fst a) $ zip (map (`cosineSim` qvec) vs) [0..] \n",
" where qvec = vzer q \n", " where qvec = vzer q \n",
"\n", "\n",
"query lVectorized legendVectorizer \"wąż przymierza się do zjedzenia właścicielki\"\n", "query lVectorized legendVectorizer \"w\u0105\u017c przymierza si\u0119 do zjedzenia w\u0142a\u015bcicielki\"\n",
"\n" "\n"
] ]
}, },
@ -4543,7 +4559,13 @@
"name": "haskell", "name": "haskell",
"pygments_lexer": "Haskell", "pygments_lexer": "Haskell",
"version": "8.10.4" "version": "8.10.4"
} },
"author": "Filip Grali\u0144ski",
"email": "filipg@amu.edu.pl",
"lang": "pl",
"subtitle": "3.Wyszukiwarki \u2014 TF-IDF[wyk\u0142ad]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 5. <i>Gęste reprezentacje wektorowe</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -129,7 +143,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Musimy tylko sparametryzować naszą funkcję rozmiarem \"odcisku\" (parametr $b$)." "Musimy tylko sparametryzować naszą funkcję rozmiarem „odcisku” (parametr $b$)."
] ]
}, },
{ {
@ -1604,11 +1618,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Haskell", "display_name": "Haskell",
"language": "haskell", "language": "haskell",
"name": "haskell" "name": "haskell"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": "ihaskell", "codemirror_mode": "ihaskell",
"file_extension": ".hs", "file_extension": ".hs",
@ -1616,7 +1633,10 @@
"name": "haskell", "name": "haskell",
"pygments_lexer": "Haskell", "pygments_lexer": "Haskell",
"version": "8.10.4" "version": "8.10.4"
} },
"subtitle": "5.Gęste reprezentacje wektorowe[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 6. <i>Wyzwania uczenia maszynowego</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -367,11 +381,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -382,8 +399,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.9.2" "version": "3.9.6"
} },
"subtitle": "6.Wyzwania uczenia maszynowego[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 4 "nbformat_minor": 4

View File

@ -1,5 +1,20 @@
{ {
"cells": [ "cells": [
{
"cell_type": "markdown",
"id": "45264aad",
"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> Ekstrakcja informacji </h1>\n",
"<h2> 7. <i>Naiwny klasyfikator bayesowski w ekstrakcji informacji</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "moderate-array", "id": "moderate-array",
@ -9,7 +24,7 @@
"\n", "\n",
"Zakładamy, że mamy dwie klasy: $c$ i jej dopełnienie ($\\bar{c}$).\n", "Zakładamy, że mamy dwie klasy: $c$ i jej dopełnienie ($\\bar{c}$).\n",
"\n", "\n",
"Typowym przykładem jest zadanie klasyfikacji mejla, czy należy do spamu, czy nie (_spam_ vs _ham_), czyli innymi słowy filtr antyspamowy." "Typowym przykładem jest zadanie klasyfikacji mejla, czy należy do spamu, czy nie (_spam_ vs _ham_), czyli, innymi słowy, filtr antyspamowy."
] ]
}, },
{ {
@ -63,9 +78,9 @@
"\n", "\n",
"W klasyfikacji (i w ogóle w uczeniu nadzorowanym) można wskazać dwa podejścia:\n", "W klasyfikacji (i w ogóle w uczeniu nadzorowanym) można wskazać dwa podejścia:\n",
"\n", "\n",
"* generatywne - wymyślamy pewną \"historyjkę\", w jaki sposób powstaje tekst, \"historyjka\" powinna mieć miejsca do wypełnienia (parametry), np. częstości wyrazów, na podstawie zbioru uczącego dobieramy wartości parametrów (przez rachunki wprost); \"historyjka\" nie musi być prawdziwa, wystarczy, że jakoś przybliża rzeczywistość\n", "* generatywne — wymyślamy pewną „historyjkę”, w jaki sposób powstaje tekst, „historyjka” powinna mieć miejsca do wypełnienia (parametry), np. częstości wyrazów, na podstawie zbioru uczącego dobieramy wartości parametrów (przez rachunki wprost); „historyjka” nie musi być prawdziwa, wystarczy, że jakoś przybliża rzeczywistość\n",
"\n", "\n",
"* dyskryminatywne - nie zastanawiamy się, w jaki sposób powstają teksty, po prostu \"na siłę\" dobieramy wartości parametrów (wag) modelu, tak aby uzyskać jak najmniejszą wartość funkcji kosztu na zbiorze uczącym; zwykle odbywa się to w iteracyjnym procesie (tak jak przedstawiono na schemacie na poprzednim wykładzie).\n", "* dyskryminatywne — nie zastanawiamy się, w jaki sposób powstają teksty, po prostu „na siłę” dobieramy wartości parametrów (wag) modelu, tak aby uzyskać jak najmniejszą wartość funkcji kosztu na zbiorze uczącym; zwykle odbywa się to w iteracyjnym procesie (tak jak przedstawiono na schemacie na poprzednim wykładzie).\n",
"\n", "\n",
"**Pytanie**: Jakie są wady i zalety obu podejść?" "**Pytanie**: Jakie są wady i zalety obu podejść?"
] ]
@ -131,11 +146,11 @@
"source": [ "source": [
"## Naiwny klasyfikator bayesowski\n", "## Naiwny klasyfikator bayesowski\n",
"\n", "\n",
"* _naiwny_ - niekoniecznie oznacza, że to \"głupi\", bezużyteczny klasyfikator\n", "* _naiwny_— niekoniecznie oznacza, że to „głupi”, bezużyteczny klasyfikator\n",
"* _klasyfikator_ \n", "* _klasyfikator_ \n",
"* _bayesowski_ - będzie odwoływać się do wzoru Bayesa.\n", "* _bayesowski_ będzie odwoływać się do wzoru Bayesa.\n",
"\n", "\n",
"Naiwny klasyfikator bayesowski raczej nie powinien być stosowany \"produkcyjnie\" (są lepsze metody). Natomiast jest to metoda bardzo prosta w implementacji dająca przyzwoity _baseline_.\n", "Naiwny klasyfikator bayesowski raczej nie powinien być stosowany „produkcyjnie” (są lepsze metody). Natomiast jest to metoda bardzo prosta w implementacji dająca przyzwoity _baseline_.\n",
"\n", "\n",
"Naiwny klasyfikator bayesowski ma dwie odmiany:\n", "Naiwny klasyfikator bayesowski ma dwie odmiany:\n",
"\n", "\n",
@ -206,14 +221,14 @@
"source": [ "source": [
"#### Prawdopodobieństwo _a priori_\n", "#### Prawdopodobieństwo _a priori_\n",
"\n", "\n",
"$P(c)$ - prawdopodobieństwo a priori klasy $c$\n", "$P(c)$ prawdopodobieństwo a priori klasy $c$\n",
"\n", "\n",
"$\\hat{P}(c) = \\frac{N_c}{N}$\n", "$\\hat{P}(c) = \\frac{N_c}{N}$\n",
"\n", "\n",
"gdzie\n", "gdzie\n",
"\n", "\n",
"* N - liczba wszystkich dokumentów w zbiorze uczącym\n", "* N liczba wszystkich dokumentów w zbiorze uczącym\n",
"* N_c - liczba dokumentow w zbiorze uczącym z klasą $c$\n", "* N_c liczba dokumentow w zbiorze uczącym z klasą $c$\n",
"\n", "\n",
"$\\hat{P}(c) = 0,75$\n", "$\\hat{P}(c) = 0,75$\n",
"\n", "\n",
@ -241,11 +256,11 @@
"source": [ "source": [
"$P(d|c) = P(t_1\\dots t_n|c)$\n", "$P(d|c) = P(t_1\\dots t_n|c)$\n",
"\n", "\n",
"Żeby pójść dalej musimy doszczegółowić nasz model generatywny. Przyjmijmy bardzo naiwny i niezgodny z rzeczywistością model spamera (i nie-spamera): spamer wyciąga wyrazy z worka i wrzuca je z powrotem (losowanie ze zwracaniem). Jedyne co odróżnia spamera i nie-spamera, to **prawdopodobieństwo wylosowania wyrazu** (np. spamer wylosuje słowo _Viagra_ z dość dużym prawdopodobieństwem, nie-spamer - z bardzo niskim).\n", "Aby pójść dalej, musimy doszczegółowić nasz model generatywny. Przyjmijmy bardzo naiwny i niezgodny z rzeczywistością model spamera (i nie-spamera): spamer wyciąga wyrazy z worka i wrzuca je z powrotem (losowanie ze zwracaniem). Jedyne co odróżnia spamera i nie-spamera, to **prawdopodobieństwo wylosowania wyrazu** (np. spamer wylosuje słowo _Viagra_ z dość dużym prawdopodobieństwem, nie-spamer z bardzo niskim).\n",
"\n", "\n",
"**Pytanie:** Ile może wynosić $P(\\mathit{Viagra}|c)$?\n", "**Pytanie:** Ile może wynosić $P(\\mathit{Viagra}|c)$?\n",
"\n", "\n",
"Po przyjęciu takich \"naiwnych założeń\":\n", "Po przyjęciu takich „naiwnych założeń”:\n",
"\n", "\n",
"$$P(d|c) = P(t_1\\dots t_n|c) \\approx P(t_1|c)\\dots P(t_n|c) = \\prod_i^n P(t_i|c)$$" "$$P(d|c) = P(t_1\\dots t_n|c) \\approx P(t_1|c)\\dots P(t_n|c) = \\prod_i^n P(t_i|c)$$"
] ]
@ -291,7 +306,7 @@
"\n", "\n",
"$$f(m, k, T) = \\frac{k+1}{T+m}$$\n", "$$f(m, k, T) = \\frac{k+1}{T+m}$$\n",
"\n", "\n",
"Jest to wygładzanie +1, albo wygładzanie Laplace'a.\n", "Jest to wygładzanie +1, inaczej wygładzanie Laplace'a.\n",
"\n", "\n",
"**Pytanie:** Wymyślić jakiś inny przykład funkcji, która będzie spełniała aksjomaty.\n", "**Pytanie:** Wymyślić jakiś inny przykład funkcji, która będzie spełniała aksjomaty.\n",
"\n", "\n",
@ -347,11 +362,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -362,8 +380,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.9.2" "version": "3.9.6"
} },
"subtitle": "7.Naiwny klasyfikator bayesowski w ekstrakcji informacji[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 5 "nbformat_minor": 5

View File

@ -1,5 +1,20 @@
{ {
"cells": [ "cells": [
{
"cell_type": "markdown",
"id": "35c19016",
"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> Ekstrakcja informacji </h1>\n",
"<h2> 8. <i>Regresja liniowa</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "cathedral-newark", "id": "cathedral-newark",
@ -129,7 +144,10 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "freelance-controversy", "id": "freelance-controversy",
"metadata": {}, "metadata": {
"jp-MarkdownHeadingCollapsed": true,
"tags": []
},
"source": [ "source": [
"## Uczenie\n", "## Uczenie\n",
"\n", "\n",
@ -139,11 +157,11 @@
"\n", "\n",
"### Metoda gradientu prostego\n", "### Metoda gradientu prostego\n",
"\n", "\n",
"![Morskie Oko - Krzysztof Dudzik](08_files/morskieoko.jpg)\n", "![Morskie oko; Autor:Krzysztof Dudzik; Źródło: [https://pl.wikipedia.org/wiki/Morskie_Oko#/media/Plik:Morskie_Oko_ze_szlaku_przez_%C5%9Awist%C3%B3wk%C4%99.jpg](https://pl.wikipedia.org/wiki/Morskie_Oko#/media/Plik:Morskie_Oko_ze_szlaku_przez_%C5%9Awist%C3%B3wk%C4%99.jpg); Licencja: CC-BY 3.0](08_files/morskieoko.jpg)\n",
"\n", "\n",
"Schodź wzdłuż lokalnego spadku funkcji błędu.\n", "Schodź wzdłuż lokalnego spadku funkcji błędu.\n",
"\n", "\n",
"Tak więc w praktyce zamiast podstawiać do wzoru lepiej się uczyć iteracyjnie -\n", "Tak więc w praktyce zamiast podstawiać do wzoru lepiej się uczyć iteracyjnie \n",
" metodą **gradientu prostego** (ang. _gradient descent_).\n", " metodą **gradientu prostego** (ang. _gradient descent_).\n",
"\n", "\n",
"1. Zacznij od byle jakich wag $w_i$ (np. wylosuj)\n", "1. Zacznij od byle jakich wag $w_i$ (np. wylosuj)\n",
@ -192,7 +210,7 @@
"\n", "\n",
"Czym jest wektor $\\vec{x} = (x_1,\\dots,x_n)$? Wiemy, np. reprezentacja tf-idf (być z trikiem z haszowaniem, Word2vec etc.).\n", "Czym jest wektor $\\vec{x} = (x_1,\\dots,x_n)$? Wiemy, np. reprezentacja tf-idf (być z trikiem z haszowaniem, Word2vec etc.).\n",
"\n", "\n",
"![schemat regresji liniowej](08_files/regresja-liniowa-tekst.png)\n" "![Schemat regresji liniowej tekstu](08_files/regresja-liniowa-tekst.png)\n"
] ]
}, },
{ {
@ -279,11 +297,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -294,8 +315,11 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.9.2" "version": "3.9.6"
} },
"subtitle": "8.Regresja liniowa[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 5 "nbformat_minor": 5

View File

@ -1,5 +1,19 @@
{ {
"cells": [ "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> Ekstrakcja informacji </h1>\n",
"<h2> 9. <i>Przegląd składowych sieci neuronowych</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -12,7 +26,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Kilka uwag dotyczących wektorów\n", "## Kilka uwag dotyczących wektorów\n",
"\n" "\n"
] ]
}, },
@ -64,7 +78,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Funkcja sigmoidalna\n", "## Funkcja sigmoidalna\n",
"\n" "\n"
] ]
}, },
@ -72,7 +86,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Funkcja sigmoidalna zamienia dowolną wartość („sygnał”) w wartość z przedziału $(0,1)$, czyli wartość, która może być interperetowana jako prawdopodobieństwo.\n", "Funkcja sigmoidalna zamienia dowolną wartość („sygnał”) w wartość z przedziału $(0,1)$, czyli wartość, która może być interpretowana jako prawdopodobieństwo.\n",
"\n", "\n",
"$$\\sigma(x) = \\frac{1}{1 + e^{-x}}$$\n", "$$\\sigma(x) = \\frac{1}{1 + e^{-x}}$$\n",
"\n" "\n"
@ -161,7 +175,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"#### PyTorch\n", "### PyTorch\n",
"\n" "\n"
] ]
}, },
@ -269,7 +283,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"#### Wagi\n", "### Wagi\n",
"\n" "\n"
] ]
}, },
@ -293,7 +307,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Regresja liniowa\n", "## Regresja liniowa\n",
"\n" "\n"
] ]
}, },
@ -512,27 +526,25 @@
"Bezpośrednio możemy zastosować do zadania regresji dla tekstu (np.\n", "Bezpośrednio możemy zastosować do zadania regresji dla tekstu (np.\n",
"przewidywanie roku publikacji tekstu).\n", "przewidywanie roku publikacji tekstu).\n",
"\n", "\n",
"![img](./img-linear-regression.png)\n", "![Schemat regresji logistycznej dla tekstu](./img-linear-regression.png)\n",
"\n", "\n",
"W połączeniu z sigmoidą otrzymamy regresją logistyczną, np. dla zadania klasyfikacji tekstu:\n", "W połączeniu z sigmoidą otrzymamy regresją logistyczną, np. dla zadania klasyfikacji tekstu:\n",
"\n", "\n",
"$$p(c|\\vec{x}) = \\sigma(w_0 + w_1x_1 + w_2x_2 + \\dots + w_{|V|}x_{|v})\n", "$$p(c|\\vec{x}) = \\sigma(w_0 + w_1x_1 + w_2x_2 + \\dots + w_{|V|}x_{|v})\n",
"= \\sigma(\\Sigma_{i=0}^{|V|} w_ix_i) = \\sigma(\\vec{w}\\vec{x})$$\n", "= \\sigma(\\Sigma_{i=0}^{|V|} w_ix_i) = \\sigma(\\vec{w}\\vec{x})$$\n",
"\n", "\n",
"![img](./img-logistic-regression.png)\n",
"\n",
"Tak sieć będzie aktywowana dla tekstu <u>aardvark in Aachen</u>:\n", "Tak sieć będzie aktywowana dla tekstu <u>aardvark in Aachen</u>:\n",
"\n", "\n",
"![img](./img-logistic-regression-aardvark.png)\n", "![Schemat regresji logistycznej dla przykładowego tekstu](./img-logistic-regression-aardvark.png)\n",
"\n", "\n",
"Regresje logistyczną (liniową zresztą też) dla tekstu możemy połączyć z trikiem z haszowaniem:\n", "Regresję logistyczną (liniową zresztą też) dla tekstu możemy połączyć z trikiem z haszowaniem:\n",
"\n", "\n",
"$$p(c|\\vec{x}) = \\sigma(w_0 + w_1x_1 + w_2x_2 + \\dots + w_{2^b}x_{2^b})\n", "$$p(c|\\vec{x}) = \\sigma(w_0 + w_1x_1 + w_2x_2 + \\dots + w_{2^b}x_{2^b})\n",
"= \\sigma(\\Sigma_{i=0}^{2^b} w_ix_i) = \\sigma(\\vec{w}\\vec{x})$$ \n", "= \\sigma(\\Sigma_{i=0}^{2^b} w_ix_i) = \\sigma(\\vec{w}\\vec{x})$$ \n",
"{\\small hashing function $H : V \\rightarrow \\{1,\\dots,2^b\\}$,\n", "{\\small hashing function $H : V \\rightarrow \\{1,\\dots,2^b\\}$,\n",
" e.g. MurmurHash3}\n", " e.g. MurmurHash3}\n",
"\n", "\n",
"![img](./img-logistic-regression-hashing.png)\n", "![Schemat regresji logistycznej dla tekstu z zastosowaniem hashing trick](./img-logistic-regression-hashing.png)\n",
"\n", "\n",
"****Pytanie:**** Jaki tekst otrzyma na pewno taką samą klasę jak <u>aardvark in Aachen</u>?\n", "****Pytanie:**** Jaki tekst otrzyma na pewno taką samą klasę jak <u>aardvark in Aachen</u>?\n",
"\n" "\n"
@ -581,16 +593,16 @@
"Mnożenie macierzy przez wektor można interpretować jako zrównolegloną operację mnożenie wektora przez wektor.\n", "Mnożenie macierzy przez wektor można interpretować jako zrównolegloną operację mnożenie wektora przez wektor.\n",
"\n", "\n",
"$$\\left[\\begin{array}{ccc}\n", "$$\\left[\\begin{array}{ccc}\n",
" \\alert<2>{1.0} & \\alert<2>{-2.0} & \\alert<2>{3.0} \\\\\n", " 1.0 & -2.0 & 3.0 \\\\\n",
" \\alert<3>{-2.0} & \\alert<3>{0.0} & \\alert<3>{10.0}\\end{array}\\right]\n", " -2.0 & 0.0 & 10.0\\end{array}\\right]\n",
" \\left[\\begin{array}{c}\n", " \\left[\\begin{array}{c}\n",
" \\alert<2-3>{1.0} \\\\\n", " 1.0 \\\\\n",
" \\alert<2-3>{-0.5} \\\\\n", " -0.5 \\\\\n",
" \\alert<2-3>{2.0}\\end{array}\\right]\n", " 2.0\\end{array}\\right]\n",
" =\n", " =\n",
" \\left[\\begin{array}{c}\n", " \\left[\\begin{array}{c}\n",
" \\uncover<2->{\\alert<2>{8.0}} \\\\\n", " 8.0 \\\\\n",
" \\uncover<3->{\\alert<3>{18.0}}\\end{array}\\right]$$\n", " 8.0\\end{array}\\right]$$\n",
"\n", "\n",
"Jeśli przemnożymy macierz $n \\times m$ przez wektor kolumnowy o długości\n", "Jeśli przemnożymy macierz $n \\times m$ przez wektor kolumnowy o długości\n",
"$m$, otrzymamy wektor o rozmiarze $n$.\n", "$m$, otrzymamy wektor o rozmiarze $n$.\n",
@ -646,7 +658,7 @@
"metadata": {}, "metadata": {},
"source": [ "source": [
"Warstwa liniowa polega na przemnożeniu wejścia przez macierz. Można\n", "Warstwa liniowa polega na przemnożeniu wejścia przez macierz. Można\n",
"to intepretować jako zrównolegloną operację regresji liniowej (równolegle\n", "to interpretować jako zrównolegloną operację regresji liniowej (równolegle\n",
"uczymy czy wykonujemy $n$ regresji liniowych).\n", "uczymy czy wykonujemy $n$ regresji liniowych).\n",
"\n" "\n"
] ]
@ -717,7 +729,7 @@
"\n", "\n",
"Oto przykład prostej dwuwarstwowej sieci neuronowej do klasyfikacji binarnej.\n", "Oto przykład prostej dwuwarstwowej sieci neuronowej do klasyfikacji binarnej.\n",
"\n", "\n",
"![img](./img-feed-forward.png)\n", "![Schemat dwuwarstwowej sieci neuronowej do klasyfikacji binarnej tekstu](./img-feed-forward.png)\n",
"\n" "\n"
] ]
}, },
@ -733,7 +745,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"W klasyfikacji wieloklasowej należy zwrócić musimy zwrócić rozkład\n", "W klasyfikacji wieloklasowej należy zwrócić rozkład\n",
"prawdopodobieństwa po wszystkich klasach, w przeciwieństwie do\n", "prawdopodobieństwa po wszystkich klasach, w przeciwieństwie do\n",
"klasyfikacji binarnej, gdzie wystarczy zwrócić jedną liczbę —\n", "klasyfikacji binarnej, gdzie wystarczy zwrócić jedną liczbę —\n",
"prawdopodobieństwo pozytywnej klasy ($p$; prawdopodobieństwo drugiej\n", "prawdopodobieństwo pozytywnej klasy ($p$; prawdopodobieństwo drugiej\n",
@ -756,7 +768,7 @@
"$$s(z_i) = \\frac{z_i}{\\Sigma_{j=1}^k z_j}$$\n", "$$s(z_i) = \\frac{z_i}{\\Sigma_{j=1}^k z_j}$$\n",
"\n", "\n",
"To rozwiązanie zadziała błędnie dla liczb ujemnych, trzeba najpierw\n", "To rozwiązanie zadziała błędnie dla liczb ujemnych, trzeba najpierw\n",
"użyć funkcji monotonicznej, która przekształaca $\\mathcal{R}$ na $\\mathcal{R^+}$.\n", "użyć funkcji monotonicznej, która przekształca $\\mathcal{R}$ na $\\mathcal{R^+}$.\n",
"Naturalna funkcja tego rodzaju to funkcja wykładnicza $\\exp{x} = e^x$.\n", "Naturalna funkcja tego rodzaju to funkcja wykładnicza $\\exp{x} = e^x$.\n",
"Tym sposobem dochodzimy do funkcji softmax:\n", "Tym sposobem dochodzimy do funkcji softmax:\n",
"\n", "\n",
@ -801,7 +813,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"![img](./softmax.png \"Softmax\")\n", "![Schemat funkcji Softmax](./softmax.png \"Softmax\")\n",
"\n" "\n"
] ]
}, },
@ -1224,7 +1236,7 @@
"metadata": {}, "metadata": {},
"source": [ "source": [
"Ze względów obliczeniowych często korzysta się z funkcji **LogSoftmax**\n", "Ze względów obliczeniowych często korzysta się z funkcji **LogSoftmax**\n",
"która zwraca logarytmy pradopodobieństw (*logproby*).\n", "która zwraca logarytmy prawdopodobieństw (*logproby*).\n",
"\n", "\n",
"$$log s(z_i) = log \\frac{e^{z_i}}{\\Sigma_{j=1}^k e^{z_j}}$$\n", "$$log s(z_i) = log \\frac{e^{z_i}}{\\Sigma_{j=1}^k e^{z_j}}$$\n",
"\n" "\n"
@ -1423,229 +1435,9 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"0.04162006452679634 2.081003189086914 0 0 tensor([[0.1248, 0.1249, 0.1252, 0.1248, 0.1248, 0.1253, 0.1251, 0.1251]],\n", "0.04162006452679634 2.081003189086914 0 0 tensor([[0.1248, 0.1249, 0.1252, 0.1248, 0.1248, 0.1253, 0.1251, 0.1251]],\n",
" grad_fn=<ExpBackward>) MŚ w hokeju: mocny początek Finów w Danii. Francja podniosła się po laniu od Rosjan Reprezentacja Finlandii po niepowodzeniach na ostatnich igrzyskach olimpijskich rozpoczęła dobrze tegoroczny turniej mistrzostw świata elity od pewnej wygranej z Koreą Południową. Francuzi zdobyli pierwsze punkty po pokonaniu Białorusi.\n", " grad_fn=<ExpBackward>) MŚ w hokeju: [...]\n",
"2.0791335105895996 2.0685672760009766 50 4 tensor([[0.1260, 0.1265, 0.1247, 0.1244, 0.1264, 0.1241, 0.1239, 0.1241]],\n",
" grad_fn=<ExpBackward>) Fotorelacja: Ważenie przed galą KSW 27 - Cage Time Prezentujemy fotorelację z oficjalnej ceremonii ważenia przed sobotnią galą KSW 27 - Cage Time.\n",
"2.069852828979492 2.1081838607788086 100 5 tensor([[0.1268, 0.1265, 0.1260, 0.1250, 0.1262, 0.1215, 0.1222, 0.1258]],\n",
" grad_fn=<ExpBackward>) Wisła podpisała swój najważniejszy kontrakt Gdyby nie firma Can-Pack S.A. nie byłoby w ostatnich latach wielkich sukcesów koszykarek z Krakowa. We wtorek ogłoszono przedłużenie umowy i koszykarki spod znaku Białej Gwiazdy nadal będą występować pod nazwą Wisła Can-Pack Kraków.\n",
"2.0650603771209717 2.0957107543945312 150 5 tensor([[0.1307, 0.1279, 0.1246, 0.1245, 0.1251, 0.1230, 0.1177, 0.1266]],\n",
" grad_fn=<ExpBackward>) Basket 90 znalazł nową podkoszową. W poprzednim sezonie grała w polskim klubie Nie trzeba było długo czekać na koszykarkę, która wypełni podkoszową lukę w Baskecie 90 Gdynia. Nową zawodniczką ekipy z Trójmiasta została Niemka Sonja Greinacher, która ostatni sezon spędziła w Wiśle CanPack Kraków.\n",
"2.058483362197876 2.0446863174438477 200 0 tensor([[0.1294, 0.1279, 0.1260, 0.1219, 0.1224, 0.1241, 0.1218, 0.1263]],\n",
" grad_fn=<ExpBackward>) Wicemistrzyni olimpijska zakończyła karierę Olga Wiłuchina podjęła decyzję o zakończeniu sportowej kariery. Największymi sukcesami rosyjskiej biathlonistki są dwa srebrne medale wywalczone na igrzyskach olimpijskich w Soczi.\n",
"2.048689126968384 2.0999209880828857 250 5 tensor([[0.1226, 0.1300, 0.1219, 0.1229, 0.1239, 0.1225, 0.1261, 0.1300]],\n",
" grad_fn=<ExpBackward>) Duże wzmocnienie reprezentacji Polski. Wraca Maciej Lampe Maciej Lampe dołączył już do reprezentacji Polski, która przygotowuje się do eliminacyjnych meczów z Litwą oraz Kosowem. 33-latek wraca do kadry po dwuletniej przerwie.\n",
"2.0371503829956055 2.0841071605682373 300 5 tensor([[0.1309, 0.1342, 0.1226, 0.1171, 0.1202, 0.1244, 0.1222, 0.1284]],\n",
" grad_fn=<ExpBackward>) Kibice Celtów mogą spać spokojnie. Kyrie Irving planuje zostać w Bostonie Rozgrywający Boston Celtics, Kyrie Irving, przyznał, że w następne lato zamierza przedłużyć swoją umowę z klubem, o ile ten nadal będzie go uwzględniał w swoich planach.\n",
"2.0365874767303467 2.0405309200286865 350 6 tensor([[0.1256, 0.1288, 0.1273, 0.1186, 0.1148, 0.1229, 0.1300, 0.1319]],\n",
" grad_fn=<ExpBackward>) We włoskiej Serie A nie ma żartów. Kolejny trener stracił posadę Brak cierpliwości włodarzy włoskich klubów charakteryzuje tegoroczne rozgrywki Serie A. Ostatnio z rolą szkoleniowca Exprivia Molfetta pożegnał się Vincenzo Di Pinto. Nie jest on pierwszym trenerem, który po 7. kolejce rozgrywek stracił posadę.\n",
"2.0280144214630127 2.0845110416412354 400 3 tensor([[0.1276, 0.1223, 0.1311, 0.1244, 0.1142, 0.1192, 0.1308, 0.1304]],\n",
" grad_fn=<ExpBackward>) Polska B rozpoczyna turniej w Płocku Od piątku do niedzieli w płockiej Orlen Arenie odbędzie się turniej z udziałem reprezentacji Polski B. Wezmą w nim też udział druga reprezentacja Danii, a także pierwsze kadry Wysp Owczych i Estonii.\n",
"2.0075767040252686 2.0585439205169678 450 0 tensor([[0.1276, 0.1289, 0.1236, 0.1232, 0.1221, 0.1172, 0.1307, 0.1266]],\n",
" grad_fn=<ExpBackward>) Najpiękniesze polskie sportsmenki! Sprawdź kto znalazł się w zestawieniu! Przygotowaliśmy dla was zestawienie 20 najpiękniejszych polskich sportsmenek! Zgadzacie się z naszym wyborem? Swoje typy wpisujcie w komentarzach! Razem wybierzemy tę najładniejszą.\n",
"2.011418581008911 1.9737845659255981 500 0 tensor([[0.1389, 0.1302, 0.1213, 0.1188, 0.1176, 0.1193, 0.1243, 0.1295]],\n",
" grad_fn=<ExpBackward>) Aleksander Zniszczoł został ojcem. Urodziła mu się córka Piątek był niezwykle ważnym dniem w życiu Aleksandra Zniszczoła. Polskiemu skoczkowi narciarskiemu urodziła się córka. Pochwalił się jej zdjęciem na Instagramie.\n",
"2.0087714195251465 2.0379459857940674 550 1 tensor([[0.1339, 0.1303, 0.1195, 0.1186, 0.1221, 0.1194, 0.1287, 0.1274]],\n",
" grad_fn=<ExpBackward>) Rajd Azorów: czołówka miała problemy. Łukjaniuk się broni Aleksiej Łukjaniuk pod nieobecność Kajetana Kajetanowicza obronił pozycję lidera klasyfikacji generalnej Rajdu Azorów. Do czołowej dziesiątki przebił się Łukasz Habaj.\n",
"1.996700406074524 2.0396344661712646 600 4 tensor([[0.1274, 0.1270, 0.1201, 0.1230, 0.1301, 0.1189, 0.1227, 0.1307]],\n",
" grad_fn=<ExpBackward>) Andrzej Kostyra: Ciosy muszą się kumulować Podczas sobotniej gali Tomasz Adamek zmierzy się z Arturem Szpilką. Andrzej Kostyra większe szanse daje temu pierwszemu, ale zauważa też pewne mankamenty.\n",
"1.9674354791641235 2.064871072769165 650 3 tensor([[0.1315, 0.1254, 0.1290, 0.1268, 0.1149, 0.1162, 0.1210, 0.1350]],\n",
" grad_fn=<ExpBackward>) IO 2016: skład Chorwacji na przygotowania do Rio. Na liście Lovro Mihić, Manuel Strlek i Ivan Cupić Chorwacki selekcjoner Żeljko Babić powołał kadrę na przygotowania do igrzysk olimpijskich w Rio de Janeiro. Na liście nazwisk nie zabrakło \"polskich\" akcentów. Na zgrupowanie pojadą Manuel Strlek, Lovro Mihić, Filip Ivić i Ivan Cupić.\n",
"1.9685375690460205 1.9720581769943237 700 2 tensor([[0.1150, 0.1331, 0.1392, 0.1129, 0.1123, 0.1159, 0.1247, 0.1469]],\n",
" grad_fn=<ExpBackward>) Andy Murray: Kostka boli, ale wszystko z nią w porządku W swoim felietonie dla BBC Andy Murray ocenił środowy pojedynek II rundy z Andriejem Rublowem i cieszył się z sukcesu Daniela Evansa w Australian Open 2017. Lider rankingu ATP przyznał, że z jego kostką jest wszystko w porządku.\n",
"1.9755648374557495 1.8178434371948242 750 1 tensor([[0.1203, 0.1624, 0.1207, 0.1146, 0.1109, 0.1177, 0.1230, 0.1304]],\n",
" grad_fn=<ExpBackward>) Daniel Ricciardo sugeruje Red Bullowi wybór silnika Daniel Ricciardo przyznał, że patrząc na obecny rozwój jednostki napędowej Renault, byłby gotowy zaufać francuskiemu producentowi także w kolejnym sezonie F1.\n",
"1.9461817741394043 2.115739107131958 800 3 tensor([[0.1252, 0.1380, 0.1297, 0.1205, 0.1064, 0.1249, 0.1235, 0.1317]],\n",
" grad_fn=<ExpBackward>) Kamil Mokrzki jako jedyny gracz Gwardii Opole dobił do granicy 100 goli 24-letni rozgrywający opolan był najlepszym strzelcem zespołu w sezonie 2015/2016. Drugiego w wewnętrznej klasyfikacji Antoniego Łangowskiego wyprzedził o 10 trafień.\n",
"1.976528286933899 2.018634080886841 850 4 tensor([[0.1226, 0.1330, 0.1265, 0.1109, 0.1328, 0.1160, 0.1143, 0.1438]],\n",
" grad_fn=<ExpBackward>) Deontay Wilder rzucił wyzwanie Anthony'emu Joshui. \"Aż krew się we mnie gotuje!\" - Anthony Joshua to facet, z którym chcę walczyć - mówi Deontay Wilder. Mistrz świata organizacji WBC wyzwał Anglika na pojedynek i liczy na to, że ten potraktuje jego propozycję na poważnie.\n",
"1.9369778633117676 2.0240039825439453 900 2 tensor([[0.1282, 0.1321, 0.1321, 0.1175, 0.1185, 0.1192, 0.1179, 0.1344]],\n",
" grad_fn=<ExpBackward>) Ronaldo, Bouchard, Bolt. Gwiazdy sportu wybierają stroje na Halloween Znani sportowcy wzięli udział w zabawie w wymyślaniu kostiumów na wieczór halloweenowych szaleństw. Kto zaprezentował najbardziej oryginalne przebranie?\n",
"1.938151240348816 1.998972773551941 950 4 tensor([[0.1241, 0.1263, 0.1215, 0.1199, 0.1355, 0.1184, 0.1261, 0.1283]],\n",
" grad_fn=<ExpBackward>) Andrzej Kostyra stworzył \"idealnego polskiego boksera\". Jest dużo cech Tomasza Adamka Andrzej Kostyra, ekspert bokserski, stworzył model \"idealnego polskiego pięściarza\". Wymienił najlepsze cechy poszczególnych bokserów. Najwięcej jest Tomasza Adamka.\n",
"1.928910732269287 1.9361062049865723 1000 1 tensor([[0.1222, 0.1443, 0.1320, 0.1216, 0.1117, 0.1137, 0.1200, 0.1346]],\n",
" grad_fn=<ExpBackward>) Rajd Niemiec: Andreas Mikkelsen i Jari-Matti Latvala najszybsi na shakedown W czwartek kierowcy mieli do pokonania odcinek testowy przed Rajdem Niemiec. Na mecie okazało się, że Andreas Mikkelsen i Jari-Matti Latvala uzyskali identyczny czas.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.9247257709503174 1.9077305793762207 1050 4 tensor([[0.1264, 0.1246, 0.1286, 0.1161, 0.1484, 0.1108, 0.1174, 0.1276]],\n",
" grad_fn=<ExpBackward>) Była rywalka Joanny Jędrzejczyk na dopingu. Czeka ją zawieszenie Była pretendenta to tytułu mistrzyni UFC w wadze słomkowej, Jessica Penne (MMA 12-5) została zawieszona przez Amerykańską Agencję Antydopingową za stosowanie niedozwolonego środka. Amerykankę czeka 1,5-roczne zawieszenie.\n",
"1.9094451665878296 1.8653218746185303 1100 2 tensor([[0.1117, 0.1150, 0.1548, 0.1148, 0.1137, 0.1239, 0.1094, 0.1566]],\n",
" grad_fn=<ExpBackward>) Finał WTA Sydney: Radwańska - Konta na żywo. Transmisja TV, stream online W piątek Agnieszka Radwańska zmierzy się z Johanną Kontą w ramach finału WTA Sydney. Transmisja TV na antenie TVP 1 i TVP Sport. Stream online w sport.tvp.pl.\n",
"1.9157683849334717 1.9492340087890625 1150 7 tensor([[0.1213, 0.1256, 0.1152, 0.1315, 0.1243, 0.1176, 0.1222, 0.1424]],\n",
" grad_fn=<ExpBackward>) Piękne zachowanie piłkarza Borussii. Pomógł kibicowi Takim zachowaniem piłkarze zyskują ogromny szacunek u kibiców. Christian Pulisić uratował fana, którym podczas próby zrobienia wspólnego zdjęcia z zawodnikiem Borussii Dortmund zajęła się ochrona.\n",
"1.865821123123169 2.0228006839752197 1200 4 tensor([[0.1116, 0.1368, 0.1280, 0.1275, 0.1323, 0.1158, 0.1208, 0.1272]],\n",
" grad_fn=<ExpBackward>) W przyszłym roku dojdzie do walki Joshua - Kliczko. \"Umowa jest dogadana\" Po fiasku wcześniejszych negocjacji wreszcie osiągnięto porozumienie. W przyszłym roku Anthony Joshua zmierzy się z Władimirem Kliczką, a w stawce będą dwa pasy mistrzowskie - informują menadżerowie obu pięściarzy. Został tylko jeden warunek.\n",
"1.8944953680038452 1.8922208547592163 1250 4 tensor([[0.1134, 0.1291, 0.1183, 0.1147, 0.1507, 0.1225, 0.1236, 0.1276]],\n",
" grad_fn=<ExpBackward>) MMA: Bartosz Fabiński zasila powracającą Fighters Arenę Bartosz Fabiński wystąpi na gali Fighters Arena 9, która 8 czerwca odbędzie się w Józefowie. Dla zawodnika z Warszawy będzie to już czwarta walka w tym roku.\n",
"1.880069375038147 1.9415850639343262 1300 7 tensor([[0.1157, 0.1171, 0.1131, 0.1464, 0.1034, 0.1277, 0.1331, 0.1435]],\n",
" grad_fn=<ExpBackward>) Oficjalnie: Polski mecz w Serie A! Godzinę przed pierwszym gwizdkiem (20:45) meczu między Sampdorią, a Napoli potwierdziły się doniesienia włoskiej prasy. Po raz pierwszy w obecnym sezonie to samo spotkanie Serie A rozpocznie w wyjściowej jedenastce aż 4 polskich piłkarzy.\n",
"1.856698751449585 1.7814764976501465 1350 1 tensor([[0.1144, 0.1684, 0.1176, 0.1232, 0.1149, 0.1156, 0.1183, 0.1275]],\n",
" grad_fn=<ExpBackward>) Bernie Ecclestone: Ferrari ma lepszy bolid Zdaniem Berniego Ecclestone'a, sezon 2017 będzie należeć do Ferrari. Włoski zespół ma spore szanse na pierwszy mistrzowski tytuł wśród konstruktorów od wielu lat.\n",
"1.864432692527771 1.7103632688522339 1400 1 tensor([[0.1176, 0.1808, 0.1134, 0.1188, 0.1131, 0.1201, 0.1122, 0.1240]],\n",
" grad_fn=<ExpBackward>) Sauber potwierdza brak Pascala Wehrleina na testach. Kto go zastąpi? Po czwartkowych medialnych doniesieniach, w piątek zespół Sauber F1 Team oficjalnie potwierdził, iż Pascal Wehrlein opuści pierwszą turę przedsezonowych testów pod Barceloną.\n",
"1.8556106090545654 1.6862224340438843 1450 6 tensor([[0.1019, 0.1062, 0.1194, 0.1385, 0.0955, 0.1352, 0.1852, 0.1180]],\n",
" grad_fn=<ExpBackward>) Polski Cukier Muszynianka Enea - Giacomini Budowlani: przełamać pasmo porażek W 7. kolejce Orlen Ligi siatkarki Polskiego Cukru Muszynianki Enea Muszyna podejmą Giacomini Budowlani Toruń. Przyjezdne w czterech ostatnich meczach rozgrywek nie wygrały nawet seta i tą złą serię chcą przerwać w Małopolsce.\n",
"1.8279104232788086 1.714841604232788 1500 6 tensor([[0.1144, 0.1191, 0.1098, 0.1388, 0.0905, 0.1315, 0.1800, 0.1160]],\n",
" grad_fn=<ExpBackward>) Przyjmująca zostaje w Toruniu. Budowlani zamknęli skład W sezonie 2017/2018 Orlen Ligi w Budowlanych Toruń nadal będzie występować Marina Paulava. Ta siatkarka zamknęła skład zespołu.\n",
"1.8162095546722412 1.6665536165237427 1550 7 tensor([[0.1020, 0.1058, 0.1215, 0.1180, 0.1061, 0.1215, 0.1362, 0.1889]],\n",
" grad_fn=<ExpBackward>) Borussia Dortmund - Red Bull Salzburg na żywo. Transmisja TV, stream online W czwartek, w ramach 1/8 finału Ligi Europy, odbędzie się mecz Borussia Dortmund - Red Bull Salzburg. Transmisja TV na antenie Eurosport 1. Stream online na platformie Eurosport Player i Ipla TV. Relacja LIVE w WP SportoweFakty.\n",
"1.81099271774292 1.7798329591751099 1600 0 tensor([[0.1687, 0.1025, 0.1230, 0.1102, 0.1030, 0.1188, 0.1179, 0.1559]],\n",
" grad_fn=<ExpBackward>) PŚ w Lahti: konkurs drużynowy na żywo. Transmisja TV, stream online za darmo W sobotę, w ramach Pucharu Świata w skokach narciarskich w Lahti odbędzie się konkurs drużynowy. Transmisja TV na antenie TVP 1 i Eurosport. Stream online za darmo w WP Pilot. Relacja LIVE w WP SportoweFakty.\n",
"1.8140941858291626 1.8500407934188843 1650 5 tensor([[0.0951, 0.1068, 0.1140, 0.1381, 0.1080, 0.1572, 0.1369, 0.1438]],\n",
" grad_fn=<ExpBackward>) Panathinaikos ma dość Euroligi. Wielki klub chce się wycofać z rozgrywek! Koszykarska Euroliga bez Panathinaikosu Ateny? To bardzo możliwy scenariusz. Właściciel klubu - Dimitrios Giannakopoulos - zapowiedział wycofanie drużyny ze stolicy Grecji z elitarnych rozgrywek.\n",
"1.792924404144287 1.8001683950424194 1700 4 tensor([[0.1270, 0.1361, 0.1167, 0.1184, 0.1653, 0.1104, 0.0993, 0.1269]],\n",
" grad_fn=<ExpBackward>) Tomasz Adamek wrócił na salę treningową. Zobacz, w jakiej formie jest \"Góral\" (wideo) Coraz więcej wskazuje na to, że Tomasz Adamek raz jeszcze powróci na ring. Były mistrz świata kategorii półciężkiej i junior ciężkiej regularnie pojawia się na sali treningowej. W jakiej formie jest 40-latek?\n",
"1.795984148979187 1.843177080154419 1750 0 tensor([[0.1583, 0.1008, 0.1063, 0.1622, 0.1017, 0.1220, 0.1319, 0.1169]],\n",
" grad_fn=<ExpBackward>) 18 zawodników w finskiej kadrze. Aino-Kaisa Saarinen poza reprezentacją Finowie ogłosili skład reprezentacji na nadchodzący Puchar Świata w biegach narciarskich. W drużynie znalazło się 8 zawodniczek i 10 zawodników.\n",
"1.8073369264602661 1.7174080610275269 1800 4 tensor([[0.1065, 0.1124, 0.1060, 0.1050, 0.1795, 0.1232, 0.1324, 0.1350]],\n",
" grad_fn=<ExpBackward>) FEN 19: karta walk skompletowana Znamy ostatnie, dziesiąte zestawienie na gali Fight Exclusive Night 19 \"Bitwa o Wrocław\". W kategorii do 70 kilogramów w formule K-1 zmierzą się ze sobą Marcin Stopka (2-2) i Krzysztof Kottas (0-0).\n",
"1.813085675239563 1.8584522008895874 1850 1 tensor([[0.1218, 0.1559, 0.1244, 0.1247, 0.1089, 0.1195, 0.1167, 0.1281]],\n",
" grad_fn=<ExpBackward>) Rajd Nadwiślański: Grzegorz Grzyb Liderem Grzegorz Grzyb i Robert Hundla zostali liderami Rajdu Nadwiślańskiego po przejechaniu dwóch sobotnich odcinków specjalnych.\n",
"1.8126273155212402 2.0152177810668945 1900 3 tensor([[0.1352, 0.1214, 0.1278, 0.1333, 0.1161, 0.1320, 0.1177, 0.1165]],\n",
" grad_fn=<ExpBackward>) Bundesliga: Berlińskie TGV. Kolejna stacja w Hanowerze Füchse Berlin w niedzielę powalczy w Hanowerze o dziewiąte kolejne zwycięstwo w sezonie. Takiego otwarcia „Lisy” nie miały jeszcze nigdy. Z kolei wieczorem polski pojedynek w Magdeburgu: Piotr Chrapkowski vs Andrzej Rojewski. Oba mecze w Sportklubie.\n",
"1.8037822246551514 1.9507031440734863 1950 4 tensor([[0.1258, 0.1343, 0.1078, 0.1292, 0.1422, 0.1202, 0.1165, 0.1241]],\n",
" grad_fn=<ExpBackward>) Utytułowany pięściarz zakończył karierę Czterokrotny obrońca tytułu mistrza świata kategorii super średniej Mikkel Kessler ogłosił zakończenie kariery pięściarskiej. To najbardziej utytułowany zawodnik w historii duńskiego boksu.\n",
"1.7356246709823608 1.938697099685669 2000 6 tensor([[0.1114, 0.0960, 0.1303, 0.1193, 0.1003, 0.1257, 0.1439, 0.1731]],\n",
" grad_fn=<ExpBackward>) KMŚ 2017: ZAKSA - Sarmayeh Bank Teheran na żywo. Gdzie oglądać transmisję TV i online? We wtorek, ZAKSA Kędzierzyn-Koźle zmierzy się z Sarmayeh Bank Teheran w ramach Klubowych Mistrzostw Świata w siatkówce. Transmisja TV na antenie Polsat Sport. Stream online w Ipla TV. Relacja LIVE w WP SportoweFakty za darmo.\n",
"1.7901594638824463 1.9917528629302979 2050 1 tensor([[0.1212, 0.1365, 0.1351, 0.1287, 0.1104, 0.1252, 0.1179, 0.1250]],\n",
" grad_fn=<ExpBackward>) Wakacyjny freestyle Przygońskiego i Pawlusiaka na pustyni Pędzące po wydmach dakarowe MINI, specjalnie dostosowany snowboard, lina i dwóch utalentowanych sportowców - tak w skrócie można opisać projekt \"Przygoński & Pawlusiak Dune Freestyle\".\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.7326788902282715 1.8687950372695923 2100 5 tensor([[0.1091, 0.1428, 0.1050, 0.1267, 0.1092, 0.1543, 0.1100, 0.1429]],\n",
" grad_fn=<ExpBackward>) Martynas Sajus: Sobin jest bardziej doświadczonym graczem, ale w przyszłości będę od niego lepszy Pojedynek Josipa Sobina z Martynasem Sajusem może być jednym ze smaczków piątkowego spotkania Anwilu z Polpharmą. Który ze środkowych da więcej swojej ekipie? - On jest bardziej doświadczony, ale w przyszłości to ja będę lepszy - śmieje się Sajus.\n",
"1.7521668672561646 1.5104379653930664 2150 2 tensor([[0.0978, 0.1259, 0.2208, 0.1105, 0.1043, 0.1174, 0.1048, 0.1186]],\n",
" grad_fn=<ExpBackward>) Łukasz Iwanek: Każda tenisistka może być Williams, nie każda może zostać Radwańską (komentarz) W II rundzie Australian Open najlepsza polska tenisistka została stłamszona przez rywalkę uderzającą szybko i celnie. Każda tenisistka może w pojedynczym meczu zostać Sereną Williams, nie każda może być Agnieszką Radwańską.\n",
"1.7391993999481201 1.7570909261703491 2200 5 tensor([[0.1101, 0.0949, 0.1162, 0.1437, 0.0984, 0.1725, 0.1351, 0.1290]],\n",
" grad_fn=<ExpBackward>) Kolejny występ Przemysława Karnowskiego w Lidze Letniej NBA Kolejny występ w rozgrywkach Ligi Letniej NBA zanotował Przemysław Karnowski. Polak, który reprezentuje Charlotte Hornets, w przegranym meczu z Indianą Pacers (77:84) zdobył cztery punkty i miał trzy zbiórki.\n",
"1.6614245176315308 1.5924513339996338 2250 1 tensor([[0.1038, 0.2034, 0.1055, 0.1092, 0.1229, 0.1111, 0.1111, 0.1329]],\n",
" grad_fn=<ExpBackward>) Niebieskie flagi mogą zniknąć z F1 Formuła 1 rozważa, czy nie zrezygnować ze stosowania niebieskich flag podczas wyścigu. W ostatnich sezonach kierowcy często narzekali, iż rywale nie stosowali się do takiej sygnalizacji.\n",
"1.661994218826294 1.8809857368469238 2300 5 tensor([[0.1059, 0.1278, 0.1030, 0.1494, 0.1201, 0.1524, 0.1246, 0.1169]],\n",
" grad_fn=<ExpBackward>) Nemanja Jaramaz nowym zawodnikiem Anwilu Włocławek! Doskonale znany na polskich parkietach z występów w drużynie ze Zgorzelca Nemanja Jaramaz został nowym zawodnikiem Anwilu Włocławek. Kontrakt z Serbem będzie obowiązywał do końca bieżącego sezonu.\n",
"1.7554911375045776 1.7680193185806274 2350 5 tensor([[0.1027, 0.1128, 0.1075, 0.1352, 0.1200, 0.1707, 0.1245, 0.1267]],\n",
" grad_fn=<ExpBackward>) TOP5 zagrań minionej nocy NBA (wideo) 3 mecze odbyły się w nocy z wtorku na środę w NBA, dlatego liga miała mniejszy wybór do zestawienia najlepszych akcji. Na czele listy TOP5 zagrań znalazły się rzuty z elektryzującej końcówki spotkania Dallas Mavericks-Portland Trail Blazers.\n",
"1.7369928359985352 1.9102388620376587 2400 2 tensor([[0.1144, 0.1583, 0.1480, 0.1184, 0.1097, 0.1227, 0.1076, 0.1208]],\n",
" grad_fn=<ExpBackward>) Roger Federer będzie występował w Bazylei aż do 2019 roku Roger Federer potwierdził, że na pewno do sezonu 2019 będzie występował w turnieju Swiss Indoors Basel, który jest organizowany pod koniec października w jego rodzinnej miejscowości.\n",
"1.671631932258606 1.793396234512329 2450 4 tensor([[0.1104, 0.1304, 0.1188, 0.1231, 0.1664, 0.1170, 0.1101, 0.1238]],\n",
" grad_fn=<ExpBackward>) Łukasz Wichowski przed DSF Kickboxing Challenge: Będzie ciężka walka i duże widowisko Już w sobotę odbędzie się gala DSF Kickboxing Challenge: Bitwa w Piasecznie. Walką wieczoru będzie starcie Łukasza Wichowskiego z Piotrem Kołakowskim. - To dodatkowa mobilizacja - mówi Wichowski.\n",
"1.6898339986801147 1.8184137344360352 2500 5 tensor([[0.1091, 0.1339, 0.1128, 0.1309, 0.1144, 0.1623, 0.1074, 0.1292]],\n",
" grad_fn=<ExpBackward>) Specjaliści od dzikich kart. Co GTK Gliwice może wnieśc do PLK? GTK Gliwice prawdopodobnie będzie 17. zespołem w ekstraklasie. Przybliżamy sylwetkę ekipy ze Śląska, dla której gra w PLK będzie absolutnym debiutem.\n",
"1.6765532493591309 1.7610383033752441 2550 7 tensor([[0.1266, 0.1095, 0.1140, 0.1418, 0.1051, 0.1029, 0.1283, 0.1719]],\n",
" grad_fn=<ExpBackward>) Agent Oezila przerywa milczenie i oskarża reprezentantów Niemiec Erkut Sogut, agent Mesuta Oezila przemówił na temat zakończenia kariery reprezentacyjnej przez pomocnika. Oberwało się trzem reprezentantom Niemiec.\n",
"1.6663236618041992 1.6887623071670532 2600 5 tensor([[0.0998, 0.1291, 0.0841, 0.1349, 0.1218, 0.1847, 0.1053, 0.1402]],\n",
" grad_fn=<ExpBackward>) NBA: ci koszykarze nie mają jeszcze kontraktu Dobiega końca lipiec, a wciąż bez kontraktów na kolejny sezon pozostaje kilku zawodników o znanych nazwiskach. Najbardziej znany to oczywiście LeBron James, ale on akurat lada moment ma podpisać nową umowę z Cleveland Cavaliers.\n",
"1.660627841949463 1.0679386854171753 2650 2 tensor([[0.0997, 0.0816, 0.3437, 0.1018, 0.0988, 0.0842, 0.0996, 0.0905]],\n",
" grad_fn=<ExpBackward>) ATP Toronto: Tuzin zwycięstw nad Gaelem Monfilsem. Novak Djoković zmierza po kolejne trofeum Novak Djoković powalczy w niedzielę z Keiem Nishikorim o triumf w turnieju ATP World Tour Masters 1000 na kortach twardych w Toronto. W sobotnim półfinale Serb pewnie rozprawił się z Gaelem Monfilsem, zwyciężając Francuza 6:3, 6:2.\n",
"1.6437948942184448 1.9171419143676758 2700 6 tensor([[0.1121, 0.1250, 0.0957, 0.1340, 0.1204, 0.1323, 0.1470, 0.1335]],\n",
" grad_fn=<ExpBackward>) Joanna Wołosz: Mamy prawo do małego dołka Chemik Police poniósł trzecią ligową porażkę, tym razem ze zdecydowanie niżej notowanym Atomem Trefl Sopot. Kryzys mistrza Polski? Joanna Wołosz uspokaja zaniepokojonych kibiców.\n",
"1.6391946077346802 2.0095250606536865 2750 4 tensor([[0.1318, 0.1551, 0.1222, 0.1035, 0.1341, 0.1162, 0.1034, 0.1338]],\n",
" grad_fn=<ExpBackward>) Legenda MMA czuje się jak wrak człowieka. Przeszedł 22 operacje Po raz pierwszy trafił na stół operacyjny jako dziecko. Antonio Rodrigo Nogueira wpadł pod koła ciężarówki, walczył o życie. Później musiał poddawać się zabiegom po kontuzjach odniesionych na treningach i w walkach. - Jestem cały rozbity - przyznaje.\n",
"1.6332921981811523 1.2052042484283447 2800 2 tensor([[0.1205, 0.1072, 0.2996, 0.1031, 0.0922, 0.0857, 0.0875, 0.1042]],\n",
" grad_fn=<ExpBackward>) Ostatni sprawdzian Kamila Majchrzaka przed Rolandem Garrosem. Polak zagra w Niemczech Kamil Majchrzak weźmie udział w turnieju ATP Challenger Tour na kortach ziemnych w niemieckim Heilbronn. Dla Polaka będzie to ostatni sprawdzian przed eliminacjami do wielkoszlemowego Rolanda Garrosa 2018.\n",
"1.6281371116638184 1.3348133563995361 2850 7 tensor([[0.1050, 0.0828, 0.1172, 0.1081, 0.0920, 0.1131, 0.1186, 0.2632]],\n",
" grad_fn=<ExpBackward>) Real Sociedad - Atletico Madryt na żywo. Gdzie oglądać transmisję TV i stream online? W czwartek, w ramach Primera Division, odbędzie się spotkanie Real Sociedad - Atletico Madryt. Transmisja TV na antenie Eleven Sports 1. Stream online w WP Pilot. Relacja LIVE w WP SportoweFakty.\n",
"1.6222891807556152 1.3981242179870605 2900 1 tensor([[0.1193, 0.2471, 0.1043, 0.0929, 0.0984, 0.1156, 0.1038, 0.1185]],\n",
" grad_fn=<ExpBackward>) Williams został w tyle za rywalami. \"Nie odrobiliśmy swojej pracy domowej\" Problemy Williamsa w tym sezonie zdają się nie mieć końca. Paddy Lowe jest zdania, że na sytuację wpływa zacięta rywalizacja w Formule 1. - Obecnie każdy z zespołów funkcjonuje na bardzo wysokim poziomie - twierdzi Brytyjczyk.\n",
"1.6525822877883911 1.6196324825286865 2950 5 tensor([[0.1021, 0.1232, 0.0984, 0.1353, 0.1010, 0.1980, 0.1131, 0.1289]],\n",
" grad_fn=<ExpBackward>) Basket 90 Gdynia zamknął \"zagraniczną\" kadrę na nowy sezon Basket 90 Gdynia zakończył poszukiwania zawodniczek zagranicznych na sezon 2016/2017. Ostatnią koszykarką spoza granic naszego kraju, która związała się z ekipą z Trójmiasta, jest Litwinka Monika Grigalauskyte.\n",
"1.6379656791687012 1.4863052368164062 3000 3 tensor([[0.0881, 0.0816, 0.1089, 0.2262, 0.0698, 0.1202, 0.1658, 0.1394]],\n",
" grad_fn=<ExpBackward>) Liga Mistrzów: Paris Saint-Germain HB kolejnym uczestnikiem Final Four Paris Saint-Germain HB zremisował z MOL-Pickiem Szeged 30:30 w rewanżowym meczu ćwierćfinałowym Ligi Mistrzów 2016/2017, tym samym zdobywając awans do turnieju finałowego w Kolonii.\n",
"1.620102047920227 1.955077886581421 3050 5 tensor([[0.0998, 0.1599, 0.1024, 0.1031, 0.1239, 0.1416, 0.1172, 0.1520]],\n",
" grad_fn=<ExpBackward>) Chewbacca ma nową twarz. Jak koszykarz z Finlandii trafił do \"Gwiezdnych Wojen\" Zbliżający się weekend będzie tym, w którym miliony fanów \"Gwiezdnych Wojen\" zaczną szturmować kina, by obejrzeć 8. część sagi. Wielu z nich nie wie, że za maską Chewbakki od niedawna skrywa się nowa twarz - fińskiego koszykarza, Joonasa Suotamo.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.6508986949920654 1.7872048616409302 3100 7 tensor([[0.1113, 0.1329, 0.0890, 0.1126, 0.1327, 0.1295, 0.1246, 0.1674]],\n",
" grad_fn=<ExpBackward>) Ireneusz Mamrot liczy na przełamanie. \"Jest sportowa złość, która musi się przełożyć na naszą korzyść\" - Nie ma zdenerwowania, ale jest duża sportowa złość. To musi się przełożyć na naszą korzyść - mówi przed sobotnim pojedynkiem z Koroną Kielce trener Jagiellonii Białystok, Ireneusz Mamrot. - Nie można wiecznie mieć gorszego okresu - dodaje.\n",
"1.5091105699539185 1.5536433458328247 3150 2 tensor([[0.1030, 0.1194, 0.2115, 0.1183, 0.1021, 0.1098, 0.1085, 0.1274]],\n",
" grad_fn=<ExpBackward>) Roland Garros: bogaty program gier na środę. Matkowski czeka na dokończenie meczu z braćmi Bryanami Przez ostatnie dwa dni tenisiści niemal nie rywalizowali na kortach Rolanda Garrosa. Plan gier na 11. dzień turnieju jest naprawdę bogaty.\n",
"1.64374577999115 1.6283594369888306 3200 4 tensor([[0.0947, 0.1278, 0.1324, 0.1141, 0.1963, 0.1059, 0.1183, 0.1106]],\n",
" grad_fn=<ExpBackward>) Deontaya Wildera czekają dwie operacje. Na ring wróci w 2017 roku Deontay Wilder bez problemów pokonał Chrisa Arreolę w Birmingham i obronił pas mistrza świata federacji WBC. Podczas pojedynku \"Brązowy Bombardier\" nabawił się jednak dwóch kontuzji, które na dłuższy okres wykluczą go z walk.\n",
"1.4641040563583374 1.66716468334198 3250 5 tensor([[0.0888, 0.0941, 0.0920, 0.1388, 0.1155, 0.1888, 0.1545, 0.1276]],\n",
" grad_fn=<ExpBackward>) Sfrustrowany Tweety Carter: Powinienem zatrzymać Irelanda W ramach 20. kolejki PLK PGE Turów przegrał na własnym parkiecie z Treflem Sopot 79:81. - To bardzo, bardzo frustrująca porażka - mówi Tweety Carter, który zawiódł w ostatniej minucie tego starcia.\n",
"1.6305592060089111 1.6195734739303589 3300 1 tensor([[0.1346, 0.1980, 0.1101, 0.1144, 0.1032, 0.1227, 0.1072, 0.1099]],\n",
" grad_fn=<ExpBackward>) Rajd Estonii: Kajetanowicz utrzymuje podium Polska załoga Kajetan Kajetanowicz - Jarosław Baran jest coraz bliżej sięgnięcia po kolejne podium w wyścigach ERC. Po pewne zwycięstwo w Rajdzie Estonii zmierza Aleksiej Łukjaniuk.\n",
"1.5722557306289673 1.681894302368164 3350 5 tensor([[0.0974, 0.1164, 0.1069, 0.1205, 0.0956, 0.1860, 0.1081, 0.1691]],\n",
" grad_fn=<ExpBackward>) Basket Poznań wrócił na właściwe tory? \"Do stacji końcowej jeszcze daleka droga\" I-ligowy Biofarm Basket Poznań jest projektem, który skupia wokół siebie wielu młodych graczy. W zespole możemy znaleźć także dwóch doświadczonych zawodników, a jednym z nich jest Tomasz Smorawiński.\n",
"1.513804316520691 1.353588581085205 3400 4 tensor([[0.1068, 0.1058, 0.1009, 0.1070, 0.2583, 0.1113, 0.1052, 0.1048]],\n",
" grad_fn=<ExpBackward>) Łukasz Rambalski i Wojciech Wierzbicki w karcie walk gali FEN 10 Do ciekawej walki dojdzie na gali FEN 10, 9 stycznia w Lubinie. Jeden z najbardziej utytułowanych polskich zawodników kickboxingu, Łukasz Rambalski, zmierzy się z aktualnym zawodowym mistrzem Europy organizacji WAKO-PRO, Wojciechem Wierzbickim.\n",
"1.549415111541748 1.5709004402160645 3450 5 tensor([[0.0968, 0.0769, 0.1763, 0.1564, 0.0748, 0.2079, 0.1181, 0.0927]],\n",
" grad_fn=<ExpBackward>) Świetny mecz Marcina Sroki. Sokół z Pogonią w finale turnieju w Prudniku Marcin Sroka zdobył 25 punktów i poprowadził Max Elektro Sokół Łańcut do zwycięstwa 95:69 nad BK NH Ostrava. W drugim półfinale międzynarodowego koszykarskiego turnieju w Prudniku gospodarze pokonali Jamalex Polonię 1912 Leszno.\n",
"1.5036178827285767 1.6746760606765747 3500 1 tensor([[0.1181, 0.1874, 0.1078, 0.1015, 0.1282, 0.1220, 0.1091, 0.1260]],\n",
" grad_fn=<ExpBackward>) Niki Lauda wspomina Jamesa Hunta. \"Jego cząstka żyje we mnie\" Przed laty rywalizacja Nikiego Laudy i Jamesa Hunta emocjonowała kibiców Formuły 1. Austriaka i Brytyjczyka, choć na torze byli rywalami, połączyła specjalna więź. - Jakaś cząstka Jamesa żyje teraz we mnie - mówi Lauda.\n",
"1.458483099937439 1.312494158744812 3550 1 tensor([[0.1023, 0.2691, 0.1057, 0.0845, 0.1266, 0.0953, 0.0950, 0.1214]],\n",
" grad_fn=<ExpBackward>) Eksperci o słowach Felipe Massy. \"Sam wykluczył się z walki o miejsce w Williamsie\" Felipe Massa w ostrych słowach skomentował możliwy powrót Roberta Kubicy do Formuły 1. - Wygląda na to, że Brazylijczyk sam wykluczył się z walki o miejsce w Williamsie - twierdzi Tiff Needell, były prowadzący \"Top Gear\".\n",
"1.6343040466308594 1.5306463241577148 3600 3 tensor([[0.1112, 0.0902, 0.0923, 0.2164, 0.0924, 0.1184, 0.1386, 0.1404]],\n",
" grad_fn=<ExpBackward>) AMŚ: pierwsza wygrana Biało-Czerwonych. Polska rozbiła Chińskie Tajpej Reprezentacja Polski piłkarzy ręcznych odniosła pierwsze zwycięstwo na Akademickich Mistrzostwach Świata. Drużyna Piotra Przybeckiego zgodnie z oczekiwaniami pokonała Chińskie Tajpej (35:20).\n",
"1.4308090209960938 0.6783717274665833 3650 2 tensor([[0.0740, 0.0568, 0.5074, 0.0749, 0.0623, 0.0691, 0.0896, 0.0659]],\n",
" grad_fn=<ExpBackward>) ATP Tokio: Kei Nishikori wygrał japońskie starcie. W II rundzie także Milos Raonić i Denis Shapovalov Faworyt gospodarzy Kei Nishikori w dwóch setach pokonał Yuichiego Sugitę w I rundzie rozgrywanego na kortach twardych w hali turnieju ATP World Tour 500 w Tokio. Do 1/8 finału awansowali też Kanadyjczycy - Milos Raonić i Denis Shapovalov.\n",
"1.523067831993103 1.5078588724136353 3700 2 tensor([[0.1061, 0.1269, 0.2214, 0.0988, 0.0970, 0.1362, 0.1111, 0.1025]],\n",
" grad_fn=<ExpBackward>) James Blake jak Tommy Haas czy Feliciano Lopez. Został dyrektorem turnieju w Miami Organizatorzy turnieju Miami Open ogłosili, że nowym dyrektorem tych kobiecych i męskich zawodów został były amerykański tenisista, James Blake. Tym samym potwierdziły się medialne doniesienia z ostatnich tygodni.\n",
"1.498782992362976 1.39162015914917 3750 7 tensor([[0.1257, 0.0678, 0.0980, 0.1364, 0.0640, 0.1027, 0.1567, 0.2487]],\n",
" grad_fn=<ExpBackward>) Mundial 2018. Historyczny wyczyn reprezentacji Rosji! Takiego pogromu w meczu otwarcia jeszcze nie było Na inaugurację MŚ 2018 Rosja pokonała Arabię Saudyjską aż 5:0 i ustanowiła nowy rekord mundialu - nigdy wcześniej w meczu otwarcia mistrzostw świata nie padł tak wysoki wynik.\n",
"1.494296669960022 1.5732029676437378 3800 3 tensor([[0.1084, 0.1078, 0.1186, 0.2074, 0.0942, 0.1287, 0.1335, 0.1015]],\n",
" grad_fn=<ExpBackward>) Wojciech Gumiński odnalazł się w Azotach. \"Start w nowym klubie bywa trudny\" Przeciętny początek rozgrywek i znacznie lepsza druga połowa sezonu. Wojciech Gumiński zaczyna spełniać oczekiwania w Azotach Puławy, stał się czołowym strzelcem brązowych medalistów PGNiG Superligi.\n",
"1.4970916509628296 1.9664472341537476 3850 2 tensor([[0.1420, 0.1164, 0.1400, 0.1578, 0.1105, 0.1187, 0.1133, 0.1014]],\n",
" grad_fn=<ExpBackward>) Rio 2016. To nie są igrzyska faworytów Tenisowe turnieje olimpijskie rządzą się swoimi prawami i wielkie niespodzianki są w nich na porządku dziennym, ale chyba mało kto przypuszczał, że w Rio de Janeiro dojdzie do aż tylu niespodziewanych rozstrzygnięć.\n",
"1.4386285543441772 1.7763383388519287 3900 5 tensor([[0.1042, 0.0926, 0.1017, 0.1574, 0.0956, 0.1693, 0.1595, 0.1197]],\n",
" grad_fn=<ExpBackward>) Niezawodny Klima, szalejący Obarek. Najlepsi gracze 18. kolejki I ligi Marcin Dymała oraz Maciej Klima to stali bywalce w naszym rankingu. Którzy zawodnicy znaleźli się jeszcze w najlepszej piątce 18. kolejki?\n",
"1.4847553968429565 1.4366589784622192 3950 4 tensor([[0.0837, 0.1276, 0.1146, 0.1064, 0.2377, 0.1054, 0.1089, 0.1156]],\n",
" grad_fn=<ExpBackward>) Czołowy brytyjski pięściarz zaproponował pojedynek Tomaszowi Adamkowi Tomasz Adamek otrzymał propozycję walki z Davidem Pricem. Jak poinformował portal worldboxingnews.net, obóz brytyjskiego pięściarza złożył \"Góralowi\" atrakcyjną ofertę.\n",
"1.4597876071929932 1.3940199613571167 4000 7 tensor([[0.0933, 0.1557, 0.0803, 0.0930, 0.1256, 0.1070, 0.0970, 0.2481]],\n",
" grad_fn=<ExpBackward>) Grzegorz Krychowiak na zakręcie. Mundial to ostatnia szansa Grzegorz Krychowiak znowu jest na zakręcie i musi szukać nowego klubu. Paris-Saint Germain chce się pozbyć Polaka na dobre. Mundial w Rosji to dla mistrzów Francji ostatnia szansa, żeby sprzedać go za godne pieniądze.\n",
"1.4579588174819946 1.5661852359771729 4050 6 tensor([[0.0991, 0.1113, 0.0903, 0.1400, 0.0902, 0.1380, 0.2088, 0.1223]],\n",
" grad_fn=<ExpBackward>) ZAKSA Kędzierzyn-Koźle trenuje już niemal w komplecie Na początku tygodnia do kędzierzyńskiej drużyny dołączyli zawodnicy, którzy brali udział w mistrzostwach Europy. Wyjątkiem jest francuski rozgrywający Benjamin Toniutti.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.524263858795166 1.2569677829742432 4100 1 tensor([[0.0736, 0.2845, 0.0688, 0.0741, 0.1107, 0.1046, 0.1125, 0.1710]],\n",
" grad_fn=<ExpBackward>) Krzysztof Hołowczyc trzyma kciuki za Kubicę. \"Ci, którzy nie chcą jego powrotu, po prostu się go boją\" Trwa walka Roberta Kubicy o powrót do Formuły 1. Polak jest jednym z kandydatów do reprezentowania w przyszłym sezonie barw zespołu Williams. Za Kubicę kciuki trzyma Krzysztof Hołowczyc.\n",
"1.4493881464004517 1.4371377229690552 4150 1 tensor([[0.1067, 0.2376, 0.1001, 0.0918, 0.1164, 0.1187, 0.1077, 0.1211]],\n",
" grad_fn=<ExpBackward>) Honda znów ma problem z silnikiem. \"Musimy znaleźć główną przyczynę niepowodzeń\" Honda po raz kolejny ma problemy ze swoim silnikiem. Japończycy uważają jednak, że w przypadku Brendona Hartleya we Francji doszło do innej usterki niż w jednostce napędowej Pierre'a Gasly'ego w Kanadzie.\n",
"1.5475350618362427 1.0887583494186401 4200 2 tensor([[0.0726, 0.0993, 0.3366, 0.0964, 0.0821, 0.1156, 0.1075, 0.0898]],\n",
" grad_fn=<ExpBackward>) Jelena Janković marzy o drugim tygodniu Wimbledonu. We wtorek Serbka zagra z Agnieszką Radwańską Jelena Janković chciałaby dojść do drugiego tygodnia Wimbledonu 2017. Serbka będzie rywalką Agnieszki Radwańskiej w I rundzie.\n",
"1.4706852436065674 1.9419291019439697 4250 4 tensor([[0.1107, 0.1165, 0.1035, 0.1279, 0.1434, 0.1301, 0.1392, 0.1287]],\n",
" grad_fn=<ExpBackward>) Kontrowersyjny klub MMA w Chinach. Walczą 12-letnie dzieci W Enbo Fight Club trenuje nawet 400 młodych ludzi. Część z nich stanowią osierocone dzieci. Działalność klubu wywołuje spore emocje w Chinach.\n",
"1.4309391975402832 0.8164663314819336 4300 1 tensor([[0.1202, 0.4420, 0.0652, 0.0702, 0.0816, 0.0791, 0.0730, 0.0687]],\n",
" grad_fn=<ExpBackward>) MotoGP: Marc Marquez najlepszy w ostatnim treningu Marc Marquez wygrał ostatnią sesję treningową przed wyścigiem o Grand Prix Ameryk na torze w Austin. Kolejne pozycje zajęli Dani Pedrosa oraz Maverick Vinales.\n",
"1.421707034111023 1.5885950326919556 4350 3 tensor([[0.0740, 0.1260, 0.0926, 0.2042, 0.1067, 0.1426, 0.1267, 0.1271]],\n",
" grad_fn=<ExpBackward>) Rafał Przybylski odchodzi z Azotów Puławy. Kierunek - zagranica Rafał Przybylski po zakończeniu sezonu 2016/17 odejdzie z Azotów Puławy. 25-letni prawy rozgrywający wyjedzie z Polski. W jakim kierunku? Tego jeszcze nie wiadomo. Po Polaka zgłosiło się kilka klubów. Rozmowy trwają.\n",
"1.419579029083252 0.8860330581665039 4400 2 tensor([[0.0848, 0.0764, 0.4123, 0.0851, 0.0743, 0.0952, 0.0910, 0.0810]],\n",
" grad_fn=<ExpBackward>) WTA Lugano: Stefanie Voegele wygrała dwudniowy mecz z Magdaleną Fręch. Polka jeszcze bez zwycięstwa w tourze Stefanie Vögele okazała się w dwóch setach lepsza od Magdaleny Fręch w I rundzie turnieju WTA International na kortach ziemnych w Lugano. Polska tenisistka musi jeszcze poczekać na premierową wygraną w głównym cyklu.\n",
"1.3413941860198975 1.3380266427993774 4450 0 tensor([[0.2624, 0.1457, 0.0719, 0.1039, 0.0734, 0.0958, 0.1211, 0.1259]],\n",
" grad_fn=<ExpBackward>) MŚ w Lahti: Niemcy na czele klasyfikacji medalowej. To był ich piątek marzeń Niemcy znajdą się na prowadzeniu w klasyfikacji medalowej mistrzostw świata w Lahti po trzech dniach imprezy. W piątkowych konkurencjach reprezentanci tego kraju byli zdecydowanie najlepsi.\n",
"1.4630906581878662 1.8144276142120361 4500 0 tensor([[0.1629, 0.1532, 0.0742, 0.1222, 0.0932, 0.1240, 0.1055, 0.1647]],\n",
" grad_fn=<ExpBackward>) Pjongczang 2018. Austriacy zabiorą nam Horngachera? Trzeba jak najszybciej podpisać kontrakt Stefan Horngacher, jeden z autorów trzeciego złota Kamila Stocha, nie ma jeszcze podpisanego nowego kontraktu. PZN powinien uczynić to jak najszybciej, by sprzed nosa świetnego trenera nie zabrali polskiej kadrze Austriacy.\n",
"1.4926103353500366 0.9573735594749451 4550 1 tensor([[0.0927, 0.3839, 0.0863, 0.0762, 0.1012, 0.0837, 0.0782, 0.0977]],\n",
" grad_fn=<ExpBackward>) Wewnętrzna rywalizacja w Red Bull Racing. \"Powinienem wiedzieć, gdzie jest limit\" Wewnętrzna rywalizacja Daniela Ricciardo z Maxem Verstappenem korzystnie wpływa na formę kierowców Red Bull Racing. Australijczyk zdradził jednak, że w niektórych wyścigach przesadził z jazdą na limicie. - Zawsze byłem przed nim - odpowiada Holender.\n",
"1.493160367012024 1.1073386669158936 4600 6 tensor([[0.0816, 0.0615, 0.0737, 0.1037, 0.0659, 0.1300, 0.3304, 0.1531]],\n",
" grad_fn=<ExpBackward>) Puchar Polski: Skra Bełchatów - Asseco Resovia na żywo. Gdzie oglądać transmisję? W środę, w ramach Pucharu Polski w siatkówce odbędzie się mecz PGE Skra Bełchatów - Asseco Resovia Rzeszów. Tranmisja TV na antenie Polsat Sport. Stream online w Ipla TV. Relacja LIVE w WP SportoweFakty.\n",
"1.4486230611801147 1.1242272853851318 4650 1 tensor([[0.0861, 0.3249, 0.0828, 0.1040, 0.0873, 0.0995, 0.1066, 0.1088]],\n",
" grad_fn=<ExpBackward>) Mercedes z czwartym tytułem z rzędu jako czwarty zespół w historii Mercedes dzięki wygranej Lewisa Hamiltona w Austin zapewnił sobie kolejny z rzędu tytuł mistrzowski, który klasyfikuje niemiecki zespół wśród największych stajni w historii Formuły 1.\n",
"1.4269776344299316 1.2119630575180054 4700 6 tensor([[0.0843, 0.0775, 0.0978, 0.1276, 0.0649, 0.1554, 0.2976, 0.0949]],\n",
" grad_fn=<ExpBackward>) PlusLiga: ta ostatnia, decydująca niedziela W niedzielę zostanie rozegrana ostatnia kolejka PlusLigi. Poznamy w niej odpowiedzi na pytania, które drużyny zagrają o medale, a która pożegna się z rozgrywkami. Czy Indykpol AZS, Asseco Resovia i Jastrzębski Węgiel wykorzystają potknięcie ONICO?\n",
"1.4327268600463867 0.915303111076355 4750 0 tensor([[0.4004, 0.0969, 0.0800, 0.0819, 0.0717, 0.0826, 0.0907, 0.0959]],\n",
" grad_fn=<ExpBackward>) Hula, Żyła i Kubacki szczęśliwi po MŚ w lotach. Już szykują się na konkurs drużynowy Polscy skoczkowie byli w bardzo dobrych nastrojach po indywidualnych MŚ w lotach narciarskich. Teraz wszyscy są myślami przy niedzielnej rywalizacji drużynowej.\n",
"1.4646613597869873 1.0098087787628174 4800 1 tensor([[0.1289, 0.3643, 0.0871, 0.0714, 0.0703, 0.0957, 0.0766, 0.1056]],\n",
" grad_fn=<ExpBackward>) Maverick Vinales myśli tylko o wygranej. \"Walka o podium mi nie wystarczy\" Upadek w Grand Prix Holandii sprawił, że Maverick Vinales stracił prowadzenie w klasyfikacji generalnej MotoGP. Hiszpan ma teraz jeden cel. Wygrać wyścig na Sachsenringu i wrócić na szczyt tabeli.\n",
"1.4902805089950562 1.4387915134429932 4850 5 tensor([[0.0798, 0.1133, 0.1002, 0.1091, 0.1097, 0.2372, 0.1071, 0.1435]],\n",
" grad_fn=<ExpBackward>) Zagrał na własne życzenie i... doznał kontuzji. Co dalej z Markiem Carterem? Marc Carter za wszelką cenę chciał pomóc drużynie w meczu z PGE Turowem Zgorzelec (93:78). Niestety Amerykanin swój występ przepłacił kontuzją ścięgna Achillesa. Na razie nie wiadomo, jak poważny jest uraz jednego z czołowych zawodników BM Slam Stal.\n",
"1.4317628145217896 1.2453986406326294 4900 7 tensor([[0.0937, 0.0673, 0.0873, 0.1039, 0.0762, 0.1123, 0.1714, 0.2878]],\n",
" grad_fn=<ExpBackward>) Anglia - Nigeria na żywo. Transmisja TV, stream online W sobotę, w ramach meczu towarzyskiego, odbędzie się starcie Anglia - Nigeria. Transmisja TV na antenie Eleven Sports 1. Stream online w WP Pilot. Relacja LIVE w WP SportoweFakty.\n",
"1.3499293327331543 1.4718239307403564 4950 5 tensor([[0.1089, 0.0784, 0.1235, 0.1255, 0.0868, 0.2295, 0.1285, 0.1189]],\n", "1.3499293327331543 1.4718239307403564 4950 5 tensor([[0.1089, 0.0784, 0.1235, 0.1255, 0.0868, 0.2295, 0.1285, 0.1189]],\n",
" grad_fn=<ExpBackward>) Liga Letnia NBA: Zespół Ponitki w ćwierćfinale, 4 punkty Polaka Mateusz Ponitka zdobył cztery punkty dla Denver Nuggets, którzy pokonali Utah Jazz 80:60 i awansowali do ćwierćfinału Ligi Letniej NBA w Las Vegas.\n" " grad_fn=<ExpBackward>) Liga Letnia NBA: [...].\n"
] ]
} }
], ],
@ -1982,7 +1774,7 @@
"metadata": {}, "metadata": {},
"source": [ "source": [
"W czasie inferencji mamy ustalone wagi funkcji $\\vec{v}(\\dots)$ oraz\n", "W czasie inferencji mamy ustalone wagi funkcji $\\vec{v}(\\dots)$ oraz\n",
"macierz $V$. Szukamy sekwencji $y$ która maksymalizuje prawdopodobieństwo estymowane przez model:\n", "macierz $V$. Szukamy sekwencji $y$, która maksymalizuje prawdopodobieństwo estymowane przez model:\n",
"\n", "\n",
"$$y = \\underset{l}{\\operatorname{argmax}} \\hat{p}(l|t^1,\\dots,t^K)$$\n", "$$y = \\underset{l}{\\operatorname{argmax}} \\hat{p}(l|t^1,\\dots,t^K)$$\n",
"\n", "\n",
@ -2025,7 +1817,7 @@
"\n", "\n",
"$$y^i = b[i, y^{i+1}]$$\n", "$$y^i = b[i, y^{i+1}]$$\n",
"\n", "\n",
"![img](./crf-viterbi.png)\n", "![CRF - Algorytm Viterbiego](./crf-viterbi.png)\n",
"\n" "\n"
] ]
}, },
@ -2226,11 +2018,14 @@
} }
], ],
"metadata": { "metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"lang": "pl",
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
"name": "ipython", "name": "ipython",
@ -2241,10 +2036,13 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.9.2" "version": "3.9.6"
}, },
"org": null "org": null,
"subtitle": "9.Przegląd składowych sieci neuronowych[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 1 "nbformat_minor": 4
} }

View File

@ -375,13 +375,13 @@ Definicja w PyTorchu:
z_plus = torch.exp(z) z_plus = torch.exp(z)
return z_plus / torch.sum(z_plus) return z_plus / torch.sum(z_plus)
softmax(torch.tensor([3., -1., 0., 5.])) softmax(torch.tensor([3., 1., -1., 1.]))
#+END_SRC #+END_SRC
#+RESULTS: #+RESULTS:
:results: :results:
# Out[75]: # Out[3]:
: tensor([0.1182, 0.0022, 0.0059, 0.8737]) : tensor([7.8678e-01, 1.0648e-01, 2.6393e-04, 1.0648e-01])
:end: :end:
#+CAPTION: Softmax #+CAPTION: Softmax

File diff suppressed because one or more lines are too long

View File

@ -87,7 +87,7 @@ $$s^k = \sigma(W\langle\vec{v}(t^k), \vec{s^{k-1}}\rangle + \vec{b}),$$
gdzie: gdzie:
- $\langle\vec{x},\vec{y}\rangle$ to konkatenacja dwóch wektorów, - $\langle\vec{x},\vec{y}\rangle$ to konkatenacja dwóch wektorów,
- $W \in \mathcal{R}^m \times \mathcal{R}^{n+m} $ — macierz wag, - $W \in \mathcal{R}^m \times \mathcal{R}^{n+m}$ — macierz wag,
- $b \in \mathcal{R}^m$ — wektor obciążeń (/biases/). - $b \in \mathcal{R}^m$ — wektor obciążeń (/biases/).
Taką sieć RNN można przedstawić schematycznie w następujący sposób: Taką sieć RNN można przedstawić schematycznie w następujący sposób:
@ -181,7 +181,7 @@ selektywnie wygaszać pozycje wektora, np. tutaj wyzerowaliśmy 2. i 5. pozycję
Co więcej, za pomocą bramki możemy selektywnie kontrolować, co Co więcej, za pomocą bramki możemy selektywnie kontrolować, co
zapamiętujemy, a co zapominamy. Rozpatrzmy mianowicie wektor zer i zapamiętujemy, a co zapominamy. Rozpatrzmy mianowicie wektor zer i
jedynek $\vec{g} \in \{0,1}^m$, dla stanu (pamięci) $\vec{s}$ i nowej informacji jedynek $\vec{g} \in \{0,1\}^m$, dla stanu (pamięci) $\vec{s}$ i nowej informacji
$\vec{x}$ możemy dokonywać aktualizacji w następujący sposób: $\vec{x}$ możemy dokonywać aktualizacji w następujący sposób:
$$\vec{s} \leftarrow \vec{g} \odot \vec{x} + (1 - \vec{g}) \odot \vec{s}$$ $$\vec{s} \leftarrow \vec{g} \odot \vec{x} + (1 - \vec{g}) \odot \vec{s}$$
@ -259,7 +259,7 @@ $$\vec{i} = \sigma(W_i\langle\vec{v}(t^k),\vec{h^{k-1}}\rangle)$$
$$\vec{f} = \sigma(W_f\langle\vec{v}(t^k),\vec{h^{k-1}}\rangle)$$ $$\vec{f} = \sigma(W_f\langle\vec{v}(t^k),\vec{h^{k-1}}\rangle)$$
$$\vec{o} = \sigma(W_f\langle\vec{v}(t^k),\vec{h^{k-1}}\rangle)$$ $$\vec{o} = \sigma(W_o\langle\vec{v}(t^k),\vec{h^{k-1}}\rangle)$$
Jak widać, wzory różnią się tylko macierzami wag $W_*$. Jak widać, wzory różnią się tylko macierzami wag $W_*$.
@ -279,10 +279,10 @@ Ostateczne wyjście może być wyliczane na podstawie wektora $\vec{h^k}$:
$$O(\vec{s}) = O(\langle\vec{c},\vec{h}\rangle) = \vec{h}$$ $$O(\vec{s}) = O(\langle\vec{c},\vec{h}\rangle) = \vec{h}$$
*Pytanie*: Ile wag/parametrów ma sieć RNN o rozmiarze wejścia $n$ i *Pytanie*: Ile wag/parametrów ma sieć RNN o rozmiarze wejścia $n$ i rozmiarze warstwy ukrytej $m$?
** Literatura ** Literatura
Yoav Goldberg, /Neural Network Methods for Natural Language Yoav Goldberg, /Neural Network Methods for Natural Language Processing/,
Processing/, Morgan & Claypool Publishers, 2017 Morgan & Claypool Publishers, 2017

859
wyk/12_bpe.ipynb Normal file

File diff suppressed because one or more lines are too long

396
wyk/12_bpe.org Normal file
View File

@ -0,0 +1,396 @@
* Podział na jednostki podwyrazowe
** Słownik nie może być za duży…
Jeśli używamy wyuczalnych zanurzeń słów (embeddingów), wówczas musimy
je dopisać do listy parametrów całego modelu — jest to $|V|n$ wag,
gdzie $n$ to rozmiar embeddingów; w wypadku uczenia dodatkowo musimy
jeszcze pamiętać związane z embeddingami gradienty. Pamięć RAM karty
graficznej jest rzecz jasna ograniczona, słownik więc nie może być
dowolnie duży. Dla danego modelu karty graficznej dość łatwo ustalić
maksymalny rozmiar słownika — jest „twarde” ograniczenie, które musimy
spełnić.
*** Czy rzeczywiście słownik może być taki duży?
Ile jest różnych form fleksyjnych w języku polskim? Zobaczmy w słowniku PoliMorf…
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! wget -q 'http://zil.ipipan.waw.pl/PoliMorf?action=AttachFile&do=get&target=PoliMorf-0.6.7.tab.gz' -O - | zcat | cut -f 1 | uniq | head -n 20
#+END_SRC
#+RESULTS:
:results:
# Out[2]:
:end:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! wget -q 'http://zil.ipipan.waw.pl/PoliMorf?action=AttachFile&do=get&target=PoliMorf-0.6.7.tab.gz' -O - | zcat | cut -f 1 | sort -u | wc -l
#+END_SRC
#+RESULTS:
:results:
# Out[3]:
:end:
*Pytanie* W którym języku europejskim wyrazów będzie jeszcze więcej niż języku polskim?
Tak naprawdę form jest jeszcze więcej, oczywiście PoliMorf nie wyczerpuje zbioru…
*Pytanie* Podaj przykłady „oczywistych” wyrazów, których nie ma w PoliMorfie. Jak w sposób systematyczny szukać takich wyrazów?
Z drugiej strony, w PoliMorfie jest dużo dziwnych, „sztucznych” wyrazów.
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! wget -q 'http://zil.ipipan.waw.pl/PoliMorf?action=AttachFile&do=get&target=PoliMorf-0.6.7.tab.gz' -O - | zcat | cut -f 1 | shuf -n 20
#+END_SRC
#+RESULTS:
:results:
# Out[4]:
:end:
Inaczej, zobaczmy, ile różnych wyrazów jest w jakimś rzeczywistym zbiorze tekstów, rozpatrzmy
teksty zebrane na potrzeby identyfikacji płci autora tekstu:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! git clone --single-branch --depth 1 git://gonito.net/petite-difference-challenge2
#+END_SRC
#+RESULTS:
:results:
# Out[7]:
:end:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! xzcat petite-difference-challenge2/train/in.tsv.xz | perl -C -ne 'print "$&\n" while/\p{L}+/g;' | sort -u > vocab.txt
#+END_SRC
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! head -n 50 vocab.txt
#+END_SRC
#+RESULTS:
:results:
# Out[11]:
:end:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! wc -l vocab.txt
#+END_SRC
#+RESULTS:
:results:
# Out[9]:
:end:
Co gorsza, nawet jak weźmiemy cały taki słownik bez ograniczeń i tak
nie pokryje on sporej części tekstów przetwarzanych w czasie inferencji.
Zobaczmy, ilu wyrazów ze zbioru deweloperskiego nie będzie w słowniku.
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! cat petite-difference-challenge2/dev-0/in.tsv | perl -C -ne 'print "$&\n" while/\p{L}+/g;' | sort -u | comm vocab.txt - -13 | wc -l
#+END_SRC
Takie wyrazy nazywamy wyrazami *OOV* (/out-of-vocabulary/).
** Obcięcie słownika
Najprostszy sposób ograniczenia słownika to po prostu obcięcie do $N$ najczęstszych słów.
Spróbujmy zastosować do korpusu „płci”:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! xzcat petite-difference-challenge2/train/in.tsv.xz | perl -C -ne 'print "$&\n" while/\p{L}+/g;' | sort | uniq -c | sort -k 1rn | head -n 50000 | sort -k 2 > vocab50000.txt
#+END_SRC
#+RESULTS:
:results:
# Out[8]:
:end:
Daje to lepszy efekt niż można się spodziewać. Odrzucamy w ten sposób
tylko bardzo rzadkie słowa (albo takie, które wystąpiły tylko raz w
korpusie — tzw. /hapax legomena/), choć tych słów jest bardzo dużo.
*Zagadka*: 50000 najczęstszych słów (1,9% *typów*) pokrywa jaki odsetek *wystąpień*?
Rozkład normalny w języku nie jest… normalny — nie spotkamy się z nim
badając języki. W tekstach dominują „skrzywione” rozkłady z długimi,
„chudymi” ogonami.
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! xzcat petite-difference-challenge2/train/in.tsv.xz | perl -C -ne 'print "$&\n" while/\p{L}+/g;' | sort | uniq -c | sort -k 1rn | cut -f 1 > freqs.txt
#+END_SRC
#+BEGIN_SRC ipython :session mysession :results file
%matplotlib inline
import matplotlib.pyplot as plt
import re
from math import log
freqs = []
with open('freqs.txt', 'r') as fh:
for line in fh:
m = re.match(r'\s*(\d+)', line)
if m:
freqs.append(int(m.group(1)))
plt.plot(range(len(freqs)), freqs)
fname = 'word-distribution.png'
plt.savefig(fname)
fname
#+END_SRC
#+RESULTS:
[[file:# Out[25]:
: 'word-distribution.png'
[[file:./obipy-resources/c0TrCn.png]]]]
** Lematyzacja
Lematyzacja wydaje się dobrym pomysłem, zwłaszcza dla języków dla bogatej fleksji:
- znacznie redukujemy słownik,
- formy fleksyjne tego samego wyrazu są traktowane tak samo (co wydaje się słuszne).
W praktyce współcześnie *nie* stosuje się lematyzacji (w połączeniu z
metodami opartymi na sieciach neuronowych):
- lematyzacja wymaga wiedzy językowej (reguł lub słownika),
wytworzenie takiej wiedzy może być kosztowne, obecnie preferowane
są metody niezależne od języka;
- tracimy pewną informację niesioną przez formę fleksyjną (co w szczególnych
przypadkach może być niefortunne, np. /aspiracja/ i /aspiracje/);
- lematyzacja nie jest trywialnym problemem ze względu na niejednoznaczności
(/Lekarzu, lecz się sam/);
- niektóre niejednoznaczności są seryjne, wybór lematu może być arbitralny,
np. czy /posiadanie/, /gotowanie/, /skakanie/ to rzeczowniki czy czasowniki?
a /urządzenie/, /mieszkanie/?
- zazwyczaj sieci neuronowe (czy nawet prostsze modele typu Word2vec)
są w stanie nauczyć się rekonstruowania zależności między formami fleksyjnymi
(i więcej: błędnych form, błędów ortograficznych, form archaicznych itd.)
** Zejście na poziom znaków
Skoro słownik wyrazów jest zbyt duży, to może zejść na poziom znaków?
- pojedynczy znak alfabetu wprawdzie nic nie znaczy (co znaczy /h/?)
- … ale rozmiar wejścia przy kodowaniu gorącą jedynką
dramatycznie się zmniejsza
- może działać, jeśli dodać wielowarstwową sieć
neuronową
- … ale może być bardzo kosztowne obliczeniowo
A może coś pośredniego między znakami a wyrazami?
** BPE
Ani znaki, ani wyrazy — coś pomiędzy: jednostki podwyrazowe (/subword
units/). Moglibyśmy np. dzielić wyraz /superkomputera/ na dwie
jednostki /super/+/komputera/, a może nawet trzy: /super/+/komputer/+/a/?
Najpopularniejszy algorytm podziału na jednostki podwyrazowe to BPE
(/byte-pair encoding/), zainspirowany algorytmami kompresji danych.
Lista jednostek jest automatycznie indukowana na podstawie tekstu (nie
potrzeba żadnej wiedzy o języku!). Ich liczba musi być natomiast z góry
określona.
W kroku początkowym zaznaczamy końce wyrazów (tokenów), robimy to po
to, żeby jednostki podwyrazowe nie przekraczały granic wyrazów.
Następnie wykonujemy tyle kroków iteracji, ile wynosi rozmiar zadanego
słownika. W każdym kroku szukamy najczęstszego bigramu, od tego
momentu traktujemy go jako całostkę (wkładamy go do „pudełka”).
[[./bpe.png]]
*** Implementacja w Pythonie
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
from collections import Counter
def replace_bigram(l, b, r):
i = 0
while i < len(l) - 1:
if (l[i], l[i+1]) == b:
l[i:i+2] = [r]
i += 1
return l
def learn_bpe_vocab(d, max_vocab_size):
d = list(d.replace(' ', '$') + '$')
vocab = []
for ix in range(0, max_vocab_size):
bigrams = [(d[i], d[i+1]) for i in range(0, len(d) - 1) if d[i][-1] != '$']
selected_bigram = Counter(bigrams).most_common(1)[0][0]
new_subword = selected_bigram[0] + selected_bigram[1]
d = replace_bigram(d, selected_bigram, new_subword)
vocab.append(new_subword)
return vocab
vocab1 = learn_bpe_vocab('to be or not to be that is the question', 10)
vocab1
#+END_SRC
#+RESULTS:
:results:
# Out[1]:
: ['e$', 'to', 'to$', 'be$', 't$', 'th', 'or', 'or$', 'no', 'not$']
:end:
Słownik jednostek podwyrazowych możemy zastosować do dowolnego tekstu, np. do tekstu,
na którym słownik był wyuczony:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
def apply_bpe_vocab(vocab, d):
d = list(d.replace(' ', '$') + '$')
vocab_set = set(vocab)
modified = True
while modified:
ix = 0
modified = False
while ix < len(d) - 1:
bigram = d[ix] + d[ix+1]
if bigram in vocab_set:
d[ix:ix+2] = [bigram]
modified = True
else:
ix += 1
return d
' '.join(apply_bpe_vocab(vocab1, 'to be or not to be that is the question'))
#+END_SRC
#+RESULTS:
:results:
# Out[5]:
: 'to$ be$ or$ not$ to$ be$ th a t$ i s $ th e$ q u e s t i o n $'
:end:
Zauważmy, że oprócz jednostek podwyrazowych zostały izolowane litery,
zazwyczaj dodajemy je do słownika. (I zazwyczaj, słownik jest trochę
większy niż wartość podana jako parametr przy uczeniu BPE — jest
większy o znaki i specjalne tokeny typu ~UNK~, ~BOS~, ~EOS~, ~PAD~.)
*Pytanie*: Jaki problem może pojawić przy zastosowaniu BPE dla tekstu,
gdzie pojawiają się chińskie znaki? Jak można sobie z nim poradzić?
Słownik jednostek podwyrazowych można stosować dla dowolnego tekstu:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
' '.join(apply_bpe_vocab(vocab1, 'tom will be the best'))
#+END_SRC
#+RESULTS:
:results:
# Out[6]:
: 'to m $ w i l l $ be$ th e$ b e s t$'
:end:
Jak można zauważyć algorytm BPE daje dwa rodzaje jednostek podwyrazowych:
- jednostki, które mogą doklejane na początku wyrazu;
- jednostki, które stanowią koniec wyrazu, w szczególności są całym wyrazem.
*** Gotowa implementacja
Po raz pierwszy BPE użyto do neuronowego tłumaczenia maszynowego.
Użyjmy modułu autorstwa Rica Sennricha (https://github.com/rsennrich/subword-nmt).
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! pip install subword-nmt
#+END_SRC
Wyindukujmy słownik dla zbioru uczącego zadania identyfikacji płci
autora tekstu:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! xzcat petite-difference-challenge2/train/in.tsv.xz | perl -C -ne 'print "$&\n" while/\p{L}+/g;' | python -m subword_nmt.learn_bpe -s 50000 -v > bpe_vocab.txt
#+END_SRC
Procedura trwa kilka minut, trzeba uzbroić się w cierpliwość (ale wypisywanie bigramów przyspieszy!).
#+BEGIN_SRC
pair 0: n i -> ni (frequency 17625075)
pair 1: i e -> ie (frequency 11471590)
pair 2: c z -> cz (frequency 9143490)
pair 3: ni e</w> -> nie</w> (frequency 7901783)
pair 4: p o -> po (frequency 7790826)
pair 5: r z -> rz (frequency 7542046)
pair 6: s t -> st (frequency 7269069)
pair 7: e m</w> -> em</w> (frequency 7207280)
pair 8: d z -> dz (frequency 6860931)
pair 9: s z -> sz (frequency 6609907)
pair 10: r a -> ra (frequency 6601618)
pair 11: o w -> ow (frequency 6395963)
pair 12: i e</w> -> ie</w> (frequency 5906869)
pair 13: n a -> na (frequency 5300380)
pair 14: r o -> ro (frequency 5181363)
pair 15: n a</w> -> na</w> (frequency 5125807)
pair 16: a ł -> ał (frequency 4786696)
pair 17: j e -> je (frequency 4599579)
pair 18: s i -> si (frequency 4300984)
pair 19: a l -> al (frequency 4276823)
pair 20: t e -> te (frequency 4033344)
pair 21: w i -> wi (frequency 3939063)
pair 22: c h</w> -> ch</w> (frequency 3919410)
pair 23: c h -> ch (frequency 3661410)
pair 24: k o -> ko (frequency 3629840)
pair 25: z a -> za (frequency 3625424)
pair 26: t a -> ta (frequency 3570094)
pair 27: p rz -> prz (frequency 3494551)
pair 28: g o</w> -> go</w> (frequency 3279997)
pair 29: a r -> ar (frequency 3081492)
pair 30: si ę</w> -> się</w> (frequency 2973681)
...
pair 49970: brz mieniu</w> -> brzmieniu</w> (frequency 483)
pair 49971: bieżą cych</w> -> bieżących</w> (frequency 483)
pair 49972: biegu nkę</w> -> biegunkę</w> (frequency 483)
pair 49973: ban kowości</w> -> bankowości</w> (frequency 483)
pair 49974: ba ku</w> -> baku</w> (frequency 483)
pair 49975: ba cznie</w> -> bacznie</w> (frequency 483)
pair 49976: Przypad kowo</w> -> Przypadkowo</w> (frequency 483)
pair 49977: MA Ł -> MAŁ (frequency 483)
pair 49978: Lep pera</w> -> Leppera</w> (frequency 483)
pair 49979: Ko za -> Koza (frequency 483)
pair 49980: Jak byś</w> -> Jakbyś</w> (frequency 483)
pair 49981: Geni alne</w> -> Genialne</w> (frequency 483)
pair 49982: Że nada</w> -> Żenada</w> (frequency 482)
pair 49983: ń czykiem</w> -> ńczykiem</w> (frequency 482)
pair 49984: zwie ń -> zwień (frequency 482)
pair 49985: zost ałaś</w> -> zostałaś</w> (frequency 482)
pair 49986: zni szczona</w> -> zniszczona</w> (frequency 482)
pair 49987: ze stawi -> zestawi (frequency 482)
pair 49988: za sób</w> -> zasób</w> (frequency 482)
pair 49989: węd rówkę</w> -> wędrówkę</w> (frequency 482)
pair 49990: wysko czyła</w> -> wyskoczyła</w> (frequency 482)
pair 49991: wyle czenia</w> -> wyleczenia</w> (frequency 482)
pair 49992: wychowaw cze</w> -> wychowawcze</w> (frequency 482)
pair 49993: w t -> wt (frequency 482)
pair 49994: un da -> unda (frequency 482)
pair 49995: udzie lałem</w> -> udzielałem</w> (frequency 482)
pair 49996: tę czy</w> -> tęczy</w> (frequency 482)
pair 49997: tro sce</w> -> trosce</w> (frequency 482)
pair 49998: słusz ności</w> -> słuszności</w> (frequency 482)
pair 49999: su me</w> -> sume</w> (frequency 482
#+END_SRC
Zastosujmy teraz wyindukowany słownik BPE dla jakiegoś rzeczywistego tekstu.
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! echo 'Cierpiałem na straszne lagi kilkanaście sekund lub dłużej czarnego ekranu przy próbie przełączenia się / uruchomienia prawie każdej aplikacji. Dodatkowo telefon mi się wyłączał czasem bez powodu sam z siebie, albo resetował. Ostatnio nawet przeglądarka zaczęła się często zawieszać i Android proponował wymuszone zamknięcie. Do tego te problemy z połączeniem do komputera przez USB.' | perl -C -ne 'print "$& " while/\p{L}+/g;' | python -m subword_nmt.apply_bpe -c bpe_vocab.txt
#+END_SRC
Ta konkretna implementacja zaznacza za pomocą sekwencji ~@@ ~ koniec jednostki podwyrazowej.

View File

@ -0,0 +1,133 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 13. <i>Podejście generatywne w ekstrakcji informacji</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ekstrakcja informacji a podejście generatywne\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Podejście generatywne\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Do tej pory zadanie ekstrakcji informacji traktowaliśmy jako zadanie etykietowania sekwencji, tzn. uczyliśmy system zaznaczać tokeny składające się na ekstrahowane informacje.\n",
"\n",
"![Ekstrakcja informacji jako etykietowanie sekwencji, schemat](./ie-seqlab.png)\n",
"\n",
"Możliwe jest inne podeście, **generatywne**, w którym podchodzimy do problemu ekstrakcji informacji jak do swego rodzaju **tłumaczenia maszynowego** — „tłumaczymy” tekst (wraz z pytaniem lub etykietą) na informację.\n",
"\n",
"![Ekstrakcja informacji w podejściu generatywnym](./ie-gener.png)\n",
"\n",
"To podejście może się wydawać trudniejsze niż etykietowanie sekwencji, ale wystarczająco zaawansowanej architekturze sieci, jest wykonalne.\n",
"\n",
"Zalety:\n",
"\n",
"- informacja nie musi być dosłownie zapisana w tekście, ekstraktor może nauczyć się również normalizacji czy parafrazowania,\n",
"- nie wprowadzamy wielu kroków przetwarzania (gdzie błędy mogą się\n",
" namnażać), system działa na zasadzie *end-to-end*.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Atencja\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pierwsze systemu neuronowego tłumaczenia maszynowego używały siecie LSTM. Dopiero jednak dodanie tzw. atencji (*attention*) umożliwiło duży przeskok jakościowy. Najpierw atencję dodano do sieci rekurencyjnych, później powstały sieci oparte *wyłącznie* na atencji — modele Transformer.\n",
"\n",
"Idea atencji polega na tym, że sieć może kierować selektywnie „snop” uwagi na wyrazy na wejściu lub do tej pory wygenerowane wyrazy.\n",
"\n",
"Mechanizm atencji korzysta z:\n",
"\n",
"- z poprzedniego stanu sieci $\\vec{s^{k-1}}$ (to jest „miejsce”, z którego „kierujemy” atencję),\n",
"- z wektora reprezentującego słowo $\\vec{v}(t_i)$ (to jest „miejsce”, na które kierujemy atencję), gdzie\n",
" $\\vec{v}(t_i)$ to reprezentacja wektorowa wyrazu $t_i$ (statyczny embedding lub reprezentacja wektorowa\n",
" z poprzedniej warstwy dla sieci wielowarstwowej),\n",
"\n",
"aby wytworzyć wektor kontekstu $\\vec{\\xi^k}$ (który z kolei będzie w jakiś sposób wnosił wkład do wyliczenia nowej wartości stanu $\\vec{s^k}$ lub wyjścia $y^k$.\n",
"\n",
"Najpierw wyliczymy skalarne wartości atencji, tzn. liczby, które będą sygnalizowały, jak bardzo wektor $\\vec{v}(t_i)$ „pasuje” do $\\vec{s^{k-1}}$, w najprostszej wersji można po prostu skorzystać z iloczynu skalarnego (o ile $n=m$),\n",
"\n",
"$$a(\\vec{s^{k-1}}, \\vec{v}(t_i)) = \\vec{s^{k-1}}\\vec{v}(t_i).$$\n",
"\n",
"**Pytanie**: co jeśli $n$ nie jest równe $m$, tzn. rozmiar embeddingu nie jest równy rozmiarowi wektora stanu?\n",
"\n",
"W przypadku sieci LSTM korzysta się częściej z bardziej skomplikowanego wzoru zawierającego dodatkowe wyuczalne wagi:\n",
"\n",
"$$a(\\vec{s^{k-1}}, \\vec{v}(t_i)) = \\vec{w_a}\\operatorname{tanh}(W_a\\vec{s^{k-1}} + U_a\\vec{v}(t_i))$$\n",
"\n",
"**Pytanie**: jakie rozmiary mają macierze $W_a$, $U_a$ i wektor $w_a$?\n",
"\n",
"Powtórzmy, że wartości $a$ są wartościami skalarnymi, natomiast nie są one znormalizowane (nie sumują się do jedynki), normalizujemy je używając schematu podobnego do softmaxa:\n",
"\n",
"$$\\alpha_{i} = \\frac{e^{a(\\vec{s^{k-1}}, \\vec{v}(t_i))}}{\\sum_j e^{a(\\vec{s^{k-1}}, \\vec{v}(t_j))}}$$\n",
"\n",
"Wektor kontekstu $\\vec{\\xi^k}$ będzie po prostu średnią ważoną wektorowych reprezentacji słów:\n",
"\n",
"$$\\vec{\\xi^k} = \\sum_i \\alpha_i\\vec{v}(t_i)$$\n",
"\n",
"**Pytanie**: zasadniczo atencja jest środkiem do celu (żeby sieć się sprawniej uczyła), czy można atencja sama w sobie może być do czegoś przydatna?\n",
"\n"
]
}
],
"metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.9.6"
},
"org": null,
"subtitle": "13.Podejście generatywne w ekstrakcji informacji[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@ -0,0 +1,55 @@
* Ekstrakcja informacji a podejście generatywne
** Podejście generatywne
Do tej pory zadanie ekstrakcji informacji traktowaliśmy jako zadanie etykietowania sekwencji, tzn. uczyliśmy system zaznaczać tokeny składające się na ekstrahowane informacje.
[[./ie-seqlab.png]]
Możliwe jest inne podeście, *generatywne*, w którym podchodzimy do problemu ekstrakcji informacji jak do swego rodzaju *tłumaczenia maszynowego* — „tłumaczymy” tekst (wraz z pytaniem lub etykietą) na informację.
[[./ie-gener.png]]
To podejście może się wydawać trudniejsze niż etykietowanie sekwencji, ale wystarczająco zaawansowanej architekturze sieci, jest wykonalne.
Zalety:
- informacja nie musi być dosłownie zapisana w tekście, ekstraktor może nauczyć się również normalizacji czy parafrazowania,
- nie wprowadzamy wielu kroków przetwarzania (gdzie błędy mogą się
namnażać), system działa na zasadzie /end-to-end/.
** Atencja
Pierwsze systemu neuronowego tłumaczenia maszynowego używały siecie LSTM. Dopiero jednak dodanie tzw. atencji (/attention/) umożliwiło duży przeskok jakościowy. Najpierw atencję dodano do sieci rekurencyjnych, później powstały sieci oparte /wyłącznie/ na atencji — modele Transformer.
Idea atencji polega na tym, że sieć może kierować selektywnie „snop” uwagi na wyrazy na wejściu lub do tej pory wygenerowane wyrazy.
Mechanizm atencji korzysta z:
- z poprzedniego stanu sieci $\vec{s^{k-1}}$ (to jest „miejsce”, z którego „kierujemy” atencję),
- z wektora reprezentującego słowo $\vec{v}(t_i)$ (to jest „miejsce”, na które kierujemy atencję), gdzie
$\vec{v}(t_i)$ to reprezentacja wektorowa wyrazu $t_i$ (statyczny embedding lub reprezentacja wektorowa
z poprzedniej warstwy dla sieci wielowarstwowej),
aby wytworzyć wektor kontekstu $\vec{\xi^k}$ (który z kolei będzie w jakiś sposób wnosił wkład do wyliczenia nowej wartości stanu $\vec{s^k}$ lub wyjścia $y^k$.
Najpierw wyliczymy skalarne wartości atencji, tzn. liczby, które będą sygnalizowały, jak bardzo wektor $\vec{v}(t_i)$ „pasuje” do $\vec{s^{k-1}}$, w najprostszej wersji można po prostu skorzystać z iloczynu skalarnego (o ile $n=m$),
$$a(\vec{s^{k-1}}, \vec{v}(t_i)) = \vec{s^{k-1}}\vec{v}(t_i).$$
*Pytanie*: co jeśli $n$ nie jest równe $m$, tzn. rozmiar embeddingu nie jest równy rozmiarowi wektora stanu?
W przypadku sieci LSTM korzysta się częściej z bardziej skomplikowanego wzoru zawierającego dodatkowe wyuczalne wagi:
$$a(\vec{s^{k-1}}, \vec{v}(t_i)) = \vec{w_a}\operatorname{tanh}(W_a\vec{s^{k-1}} + U_a\vec{v}(t_i))$$
*Pytanie*: jakie rozmiary mają macierze $W_a$, $U_a$ i wektor $w_a$?
Powtórzmy, że wartości $a$ są wartościami skalarnymi, natomiast nie są one znormalizowane (nie sumują się do jedynki), normalizujemy je używając schematu podobnego do softmaxa:
$$\alpha_{i} = \frac{e^{a(\vec{s^{k-1}}, \vec{v}(t_i))}}{\sum_j e^{a(\vec{s^{k-1}}, \vec{v}(t_j))}}$$
Wektor kontekstu $\vec{\xi^k}$ będzie po prostu średnią ważoną wektorowych reprezentacji słów:
$$\vec{\xi^k} = \sum_i \alpha_i\vec{v}(t_i)$$
*Pytanie*: zasadniczo atencja jest środkiem do celu (żeby sieć się sprawniej uczyła), czy można atencja sama w sobie może być do czegoś przydatna?

389
wyk/14_pretrenowanie.ipynb Normal file
View File

@ -0,0 +1,389 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 14. <i>Pretrenowane modele języka</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pretrenowanie modeli\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"System AlphaZero uczy się grając sam ze sobą — wystarczy 24 godziny,\n",
"by system nauczył się grać w szachy lub go na nadludzkim poziomie.\n",
"\n",
"**Pytanie**: Dlaczego granie samemu ze sobą nie jest dobrym sposobem\n",
" nauczenia się grania w szachy dla człowieka, a dla maszyny jest?\n",
"\n",
"Co jest odpowiednikiem grania samemu ze sobą w świecie przetwarzania tekstu?\n",
"Tzn. **pretrenowanie** (*pretraining*) na dużym korpusie tekstu. (Tekst jest tani!)\n",
"\n",
"Jest kilka sposobów na pretrenowanie modelu, w każdym razie sprowadza\n",
"się do odgadywania następnego bądź zamaskowanego słowa.\n",
"W każdym razie zawsze stosujemy softmax (być może ze „sztuczkami” takimi jak\n",
"negatywne próbkowanie albo hierarchiczny softmax) na pewnej **reprezentacji kontekstowej**:\n",
"\n",
"$$\\vec{p} = \\operatorname{softmax}(f(\\vec{c})).$$\n",
"\n",
"Model jest karany przy użyciu funkcji log loss:\n",
"\n",
"$$-\\log(p_j),$$\n",
"\n",
"gdzie $w_j$ jest wyrazem, który pojawił się rzeczywiście w korpusie.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Przewidywanie słowa (GPT-2)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Jeden ze sposobów pretrenowania modelu to po prostu przewidywanie\n",
"następnego słowa.\n",
"\n",
"Zainstalujmy najpierw bibliotekę transformers.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"! pip install transformers"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"50257\n"
]
},
{
"data": {
"text/plain": [
"[('Âł', 0.6182783842086792),\n",
" ('È', 0.1154019758105278),\n",
" ('Ñģ', 0.026960616931319237),\n",
" ('_____', 0.024418892338871956),\n",
" ('________', 0.014962316490709782),\n",
" ('ÃĤ', 0.010653386823832989),\n",
" ('ä¸Ń', 0.008340531960129738),\n",
" ('Ñ', 0.007557711564004421),\n",
" ('Ê', 0.007046067621558905),\n",
" ('ãĢ', 0.006875576451420784),\n",
" ('ile', 0.006685272324830294),\n",
" ('____', 0.006307446397840977),\n",
" ('âĢĭ', 0.006306538358330727),\n",
" ('ÑĢ', 0.006197483278810978),\n",
" ('ĠBelarus', 0.006108700763434172),\n",
" ('Æ', 0.005720408633351326),\n",
" ('ĠPoland', 0.0053678699769079685),\n",
" ('á¹', 0.004606408067047596),\n",
" ('îĢ', 0.004161055199801922),\n",
" ('????', 0.004056799225509167),\n",
" ('_______', 0.0038176667876541615),\n",
" ('ä¸', 0.0036082742735743523),\n",
" ('Ì', 0.003221835708245635),\n",
" ('urs', 0.003080119378864765),\n",
" ('________________', 0.0027312245219945908),\n",
" ('ĠLithuania', 0.0023860156070441008),\n",
" ('ich', 0.0021211160346865654),\n",
" ('iz', 0.002069818088784814),\n",
" ('vern', 0.002001357264816761),\n",
" ('ÅĤ', 0.001717406208626926)]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import torch\n",
"from transformers import GPT2Tokenizer, GPT2LMHeadModel\n",
"tokenizer = GPT2Tokenizer.from_pretrained('gpt2-large')\n",
"model = GPT2LMHeadModel.from_pretrained('gpt2-large')\n",
"text = 'Warsaw is the capital city of'\n",
"encoded_input = tokenizer(text, return_tensors='pt')\n",
"output = model(**encoded_input)\n",
"next_token_probs = torch.softmax(output[0][:, -1, :][0], dim=0)\n",
"\n",
"nb_of_tokens = next_token_probs.size()[0]\n",
"print(nb_of_tokens)\n",
"\n",
"_, top_k_indices = torch.topk(next_token_probs, 30, sorted=True)\n",
"\n",
"words = tokenizer.convert_ids_to_tokens(top_k_indices)\n",
"\n",
"top_probs = []\n",
"\n",
"for ix in range(len(top_k_indices)):\n",
" top_probs.append((words[ix], next_token_probs[top_k_indices[ix]].item()))\n",
"\n",
"top_probs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Zalety tego podejścia:\n",
"\n",
"- prostota,\n",
"- dobra podstawa do strojenia systemów generowania tekstu zwłaszcza\n",
" „otwartego” (systemy dialogowe, generowanie (fake) newsów, streszczanie tekstu),\n",
" ale niekoniecznie tłumaczenia maszynowego,\n",
"- zaskakująca skuteczność przy uczeniu *few-shot* i *zero-shot*.\n",
"\n",
"Wady:\n",
"\n",
"- asymetryczność, przetwarzanie tylko z lewej do prawej, preferencja\n",
" dla lewego kontekstu,\n",
"- mniejsza skuteczność przy dostrajaniu do zadań klasyfikacji i innych zadań\n",
" niepolegających na prostym generowaniu.\n",
"\n",
"Przykłady modeli: GPT, GPT-2, GPT-3, DialoGPT.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Maskowanie słów (BERT)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Inną metodą jest maskowanie słów (*Masked Language Modeling*, *MLM*).\n",
"\n",
"W tym podejściu losowe wybrane zastępujemy losowe słowa specjalnym\n",
"tokenem (`[MASK]`) i każemy modelowi odgadywać w ten sposób\n",
"zamaskowane słowa (z uwzględnieniem również prawego kontekstu!).\n",
"\n",
"Móciąc ściśle, w jednym z pierwszych modeli tego typu (BERT)\n",
"zastosowano schemat, w którym również niezamaskowane słowa są odgadywane (!):\n",
"\n",
"- wybieramy losowe 15% wyrazów do odgadnięcia\n",
"- 80% z nich zastępujemy tokenem `[MASK]`,\n",
"- 10% zastępujemy innym losowym wyrazem,\n",
"- 10% pozostawiamy bez zmian.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/filipg/.local/lib/python3.9/site-packages/transformers/models/auto/modeling_auto.py:806: FutureWarning: The class `AutoModelWithLMHead` is deprecated and will be removed in a future version. Please use `AutoModelForCausalLM` for causal language models, `AutoModelForMaskedLM` for masked language models and `AutoModelForSeq2SeqLM` for encoder-decoder models.\n",
" warnings.warn(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"W którym państwie leży Bombaj? W USA. (score: 0.16715531051158905)\n",
"W którym państwie leży Bombaj? W India. (score: 0.09912960231304169)\n",
"W którym państwie leży Bombaj? W Indian. (score: 0.039642028510570526)\n",
"W którym państwie leży Bombaj? W Nepal. (score: 0.027137665078043938)\n",
"W którym państwie leży Bombaj? W Pakistan. (score: 0.027065709233283997)\n",
"W którym państwie leży Bombaj? W Polsce. (score: 0.023737527430057526)\n",
"W którym państwie leży Bombaj? W .... (score: 0.02306722290813923)\n",
"W którym państwie leży Bombaj? W Bangladesh. (score: 0.022106658667325974)\n",
"W którym państwie leży Bombaj? W .... (score: 0.01628892682492733)\n",
"W którym państwie leży Bombaj? W Niemczech. (score: 0.014501162804663181)\n"
]
}
],
"source": [
"from transformers import AutoModelWithLMHead, AutoTokenizer\n",
"import torch\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(\"xlm-roberta-large\")\n",
"model = AutoModelWithLMHead.from_pretrained(\"xlm-roberta-large\")\n",
"\n",
"sequence = f'W którym państwie leży Bombaj? W {tokenizer.mask_token}.'\n",
"\n",
"input_ids = tokenizer.encode(sequence, return_tensors=\"pt\")\n",
"mask_token_index = torch.where(input_ids == tokenizer.mask_token_id)[1]\n",
"\n",
"token_logits = model(input_ids)[0]\n",
"mask_token_logits = token_logits[0, mask_token_index, :]\n",
"mask_token_logits = torch.softmax(mask_token_logits, dim=1)\n",
"\n",
"top_10 = torch.topk(mask_token_logits, 10, dim=1)\n",
"top_10_tokens = zip(top_10.indices[0].tolist(), top_10.values[0].tolist())\n",
"\n",
"for token, score in top_10_tokens:\n",
" print(sequence.replace(tokenizer.mask_token, tokenizer.decode([token])), f\"(score: {score})\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Przykłady: BERT, RoBERTa (również Polish RoBERTa).\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Podejście generatywne (koder-dekoder).\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"System ma wygenerować odpowiedź na różne pytania (również\n",
"odpowiadające zadaniu MLM), np.:\n",
"\n",
"- \"translate English to German: That is good.\" => \"Das ist gut.\"\n",
"- \"cola sentence: The course is jumping well.\" => \"not acceptable\"\n",
"- \"summarize: state authorities dispatched emergency crews tuesday to survey the damage after an onslaught of severe weather in mississippi&#x2026;\"\n",
" => \"six people hospitalized after a storm in attala county\"\n",
"- \"Thank you for <X> me to your party <Y> week.\" => <X> for inviting <Y> last <Z>\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['World War II ended in World War II.',\n",
" 'World War II ended in 1945..',\n",
" 'World War II ended in 1945.',\n",
" 'World War II ended in 1945.',\n",
" 'World War II ended in 1945.']"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from transformers import T5Tokenizer, T5Config, T5ForConditionalGeneration\n",
"\n",
"T5_PATH = 't5-base'\n",
"\n",
"t5_tokenizer = T5Tokenizer.from_pretrained(T5_PATH)\n",
"t5_config = T5Config.from_pretrained(T5_PATH)\n",
"t5_mlm = T5ForConditionalGeneration.from_pretrained(T5_PATH, config=t5_config)\n",
"\n",
"slot = '<extra_id_0>'\n",
"\n",
"text = f'World War II ended in {slot}.'\n",
"\n",
"encoded = t5_tokenizer.encode_plus(text, add_special_tokens=True, return_tensors='pt')\n",
"input_ids = encoded['input_ids']\n",
"\n",
"outputs = t5_mlm.generate(input_ids=input_ids,\n",
" num_beams=200, num_return_sequences=5,\n",
" max_length=5)\n",
"\n",
"_0_index = text.index(slot)\n",
"_result_prefix = text[:_0_index]\n",
"_result_suffix = text[_0_index+len(slot):]\n",
"\n",
"def _filter(output, end_token='<extra_id_1>'):\n",
" _txt = t5_tokenizer.decode(output[2:], skip_special_tokens=False, clean_up_tokenization_spaces=False)\n",
" if end_token in _txt:\n",
" _end_token_index = _txt.index(end_token)\n",
" return _result_prefix + _txt[:_end_token_index] + _result_suffix\n",
" else:\n",
" return _result_prefix + _txt + _result_suffix\n",
"\n",
"\n",
"results = [_filter(out) for out in outputs]\n",
"results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(Zob. [https://arxiv.org/pdf/1910.10683.pdf](https://arxiv.org/pdf/1910.10683.pdf))\n",
"\n",
"Przykład: T5, mT5\n",
"\n"
]
}
],
"metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.9.6"
},
"org": null,
"subtitle": "14.Pretrenowane modele języka[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

212
wyk/14_pretrenowanie.org Normal file
View File

@ -0,0 +1,212 @@
* Pretrenowanie modeli
System AlphaZero uczy się grając sam ze sobą — wystarczy 24 godziny,
by system nauczył się grać w szachy lub go na nadludzkim poziomie.
*Pytanie*: Dlaczego granie samemu ze sobą nie jest dobrym sposobem
nauczenia się grania w szachy dla człowieka, a dla maszyny jest?
Co jest odpowiednikiem grania samemu ze sobą w świecie przetwarzania tekstu?
Tzn. *pretrenowanie* (/pretraining/) na dużym korpusie tekstu. (Tekst jest tani!)
Jest kilka sposobów na pretrenowanie modelu, w każdym razie sprowadza
się do odgadywania następnego bądź zamaskowanego słowa.
W każdym razie zawsze stosujemy softmax (być może ze „sztuczkami” takimi jak
negatywne próbkowanie albo hierarchiczny softamx) na pewnej *representecji kontekstowej*:
$$\vec{p} = \operatorname{softmax}(f(\vec{c})).$$
Model jest karany używając funkcji log loss:
$$-\log(p_j),$$
gdzie $w_j$ jest wyrazem, który pojawił się rzeczywiście w korpusie.
** Przewidywanie słowa (GPT-2)
Jeden ze sposobów pretrenowania modelu to po prostu przewidywanie
następnego słowa.
Zainstalujmy najpierw bibliotekę transformers.
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
! pip install transformers
#+END_SRC
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel
tokenizer = GPT2Tokenizer.from_pretrained('gpt2-large')
model = GPT2LMHeadModel.from_pretrained('gpt2-large')
text = "Warsaw is the capital city of"
encoded_input = tokenizer(text, return_tensors='pt')
output = model(**encoded_input)
next_token_probs = torch.softmax(output[0][:, -1, :][0], dim=0)
nb_of_tokens = next_token_probs.size()[0]
_, top_k_indices = torch.topk(next_token_probs, 30, sorted=True)
top_k_indices
# words = tokenizer.convert_ids_to_tokens(top)
# top_probs = []
# for ix in range(len(top)):
# top_probs.append((words[ix], next_token_probs[top[ix]].item()))
# top_probs
#+END_SRC
#+RESULTS:
:results:
# Out[8]:
#+BEGIN_EXAMPLE
[('Ġthe', 0.4415026307106018),
('ĠPoland', 0.236798495054245),
('ĠBelarus', 0.10114768147468567),
('ĠUkraine', 0.058283545076847076),
('Ġeastern', 0.020564062520861626),
('ĠEastern', 0.011137397028505802),
('ĠPolish', 0.010205904021859169),
('ĠWestern', 0.00833223108202219),
('Ġwestern', 0.006872199941426516),
('Ġa', 0.004939113277941942),
('ĠSlovakia', 0.003553805174306035),
('ĠLithuania', 0.003335304092615843),
('ĠRussia', 0.002872465644031763),
('Ġcentral', 0.002493523992598057),
('Ġmodern', 0.0022767107002437115),
('ĠCzech', 0.0022264323197305202),
('ĠPr', 0.002146221464499831),
('Ġformer', 0.0021054286044090986),
('Ġwhat', 0.0017435317859053612),
('ĠSlov', 0.0014634730760008097),
('ĠUkrainian', 0.0014347084797918797),
('ĠCentral', 0.0013676199596375227),
('ĠSouth', 0.0013484350638464093),
('Ġone', 0.001204205909743905),
('ĠNorthern', 0.0011802552035078406),
('ĠWest', 0.001175572513602674),
('ĠEast', 0.0011596156982704997),
('Ġsouthern', 0.0011580033460631967),
('Ġnorthern', 0.001110077602788806),
('Ġ"', 0.0010494199814274907)]
#+END_EXAMPLE
:end:
Zalety tego podejścia:
- prostota,
- dobra podstawa do strojenia systemów generowania tekstu zwłaszcza
„otwartego” (systemy dialogowe, generowanie (fake) newsów, streszczanie tekstu),
ale niekoniecznie tłumaczenia maszynowego,
- zaskakująca skuteczność przy uczeniu /few-shot/ i /zero-shot/.
Wady:
- asymetryczność, przetwarzanie tylko z lewej do prawej, preferencja
dla lewego kontekstu,
- mniejsza skuteczność przy dostrajaniu do zadań klasyfikacji i innych zadań
niepolegających na prostym generowaniu.
Przykłady modeli: GPT, GPT-2, GPT-3, DialoGPT.
** Maskowanie słów (BERT)
Inną metodą jest maskowanie słów (/Masked Language Modeling/, /MLM/).
W tym podejściu losowe wybrane zastępujemy losowe słowa specjalnym
tokenem (~[MASK]~) i każemy modelowi odgadywać w ten sposób
zamaskowane słowa (z uwzględnieniem również prawego kontekstu!).
Móciąc ściśle, w jednym z pierwszych modeli tego typu (BERT)
zastosowano schemat, w którym również niezamaskowane słowa są odgadywane (!):
- wybieramy losowe 15% wyrazów do odgadnięcia
- 80% z nich zastępujemy tokenem ~[MASK]~,
- 10% zastępujemy innym losowym wyrazem,
- 10% pozostawiamy bez zmian.
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
from transformers import AutoModelWithLMHead, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained("xlm-roberta-large")
model = AutoModelWithLMHead.from_pretrained("xlm-roberta-large")
sequence = f'II wojna światowa zakończyła się w {tokenizer.mask_token} roku.'
input_ids = tokenizer.encode(sequence, return_tensors="pt")
mask_token_index = torch.where(input_ids == tokenizer.mask_token_id)[1]
token_logits = model(input_ids)[0]
mask_token_logits = token_logits[0, mask_token_index, :]
mask_token_logits = torch.softmax(mask_token_logits, dim=1)
top_10 = torch.topk(mask_token_logits, 10, dim=1)
top_10_tokens = zip(top_10.indices[0].tolist(), top_10.values[0].tolist())
for token, score in top_10_tokens:
print(sequence.replace(tokenizer.mask_token, tokenizer.decode([token])), f"(score: {score})")
#+END_SRC
#+RESULTS:
:results:
# Out[3]:
:end:
Przykłady: BERT, RoBERTa (również Polish RoBERTa).
** Podejście generatywne (koder-dekoder).
System ma wygenerować odpowiedź na różne pytania (również
odpowiadające zadaniu MLM), np.:
- "translate English to German: That is good." => "Das ist gut."
- "cola sentence: The course is jumping well." => "not acceptable"
- "summarize: state authorities dispatched emergency crews tuesday to survey the damage after an onslaught of severe weather in mississippi..."
=> "six people hospitalized after a storm in attala county"
- "Thank you for <X> me to your party <Y> week." => <X> for inviting <Y> last <Z>
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
from transformers import T5Tokenizer, T5Config, T5ForConditionalGeneration
T5_PATH = 't5-base'
t5_tokenizer = T5Tokenizer.from_pretrained(T5_PATH)
t5_config = T5Config.from_pretrained(T5_PATH)
t5_mlm = T5ForConditionalGeneration.from_pretrained(T5_PATH, config=t5_config)
slot = '<extra_id_0>'
text = f'Warsaw is the {slot} of Poland.'
encoded = t5_tokenizer.encode_plus(text, add_special_tokens=True, return_tensors='pt')
input_ids = encoded['input_ids']
outputs = t5_mlm.generate(input_ids=input_ids,
num_beams=200, num_return_sequences=5,
max_length=5)
_0_index = text.index(slot)
_result_prefix = text[:_0_index]
_result_suffix = text[_0_index+len(slot):]
def _filter(output, end_token='<extra_id_1>'):
_txt = t5_tokenizer.decode(output[2:], skip_special_tokens=False, clean_up_tokenization_spaces=False)
if end_token in _txt:
_end_token_index = _txt.index(end_token)
return _result_prefix + _txt[:_end_token_index] + _result_suffix
else:
return _result_prefix + _txt + _result_suffix
results = [_filter(out) for out in outputs]
results
#+END_SRC
(Zob. https://arxiv.org/pdf/1910.10683.pdf)
Przykład: T5, mT5

273
wyk/15_transformer.ipynb Normal file
View File

@ -0,0 +1,273 @@
{
"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> Ekstrakcja informacji </h1>\n",
"<h2> 15. <i>Sieci Transformer i ich zastosowanie w ekstrakcji informacji</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Modele Transformer\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Atencja\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Atencję w modelach Transformer można interpretować jako rodzaj\n",
"„miękkiego” odpytywania swego rodzaju bazy danych, w której\n",
"przechowywane są pary klucz-wartość. Mamy trzy rodzaje wektorów (a\n",
"właściwie macierzy, bo wektory są od razu upakowane w macierze):\n",
"\n",
"- $Q$ - macierz zapytań,\n",
"- $K$ - macierz kluczy,\n",
"- $V$ - macierz wartości odpowiadających kluczom $K$.\n",
"\n",
"W atencji modeli Transformer patrzymy jak bardzo zapytania $Q$ pasują\n",
"do kluczy $K$ i na tej podstawie zwracamy wartości $V$ (im bardziej\n",
"**klucz** pasuje do **zapytania**, tym większy wkład wnosi odpowiednia **wartość**).\n",
"Ten rodzaj odpytywania można zrealizować z pomocą mnożenia macierzy i funkcji softmax:\n",
"\n",
"$$\\operatorname{Atention}(Q,K,V) = \\operatorname{softmax}(QK^T)V$$\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Uproszczony przykład\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Załóżmy, że rozmiar embeddingu wynosi 4, w macierzach rozpatrywać\n",
"będziemy po 3 wektory naraz (możemy sobie wyobrazić, że zdanie zawiera 3 wyrazy).\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[20.5700, 36.2400, 31.1000],\n",
" [15.1100, 13.9100, 7.9500],\n",
" [ 2.2100, 7.1800, 7.4000]])"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import torch\n",
"\n",
"Q = torch.tensor([\n",
" [0.3, -2.0, 0.4, 6.0],\n",
" [-1.0, 1.5, 0.2, 3.0],\n",
" [0.3, -1.0, 0.2, 1.0]])\n",
"\n",
"K = torch.tensor([\n",
" [-0.5, 1.7, 0.3, 4.0],\n",
" [0.4, -1.5, 0.3, 5.5],\n",
" [-1.0, -3.5, 1.0, 4.0]])\n",
"\n",
"M = Q @ torch.transpose(K, 0, 1)\n",
"M"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Jak widać, najbardziej pierwszy wektor $Q$ pasuje do drugiego wektora $K$.\n",
"Znormalizujmy te wartości używać funkcji softmax.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[1.5562e-07, 9.9418e-01, 5.8236e-03],\n",
" [7.6807e-01, 2.3134e-01, 5.9683e-04],\n",
" [3.0817e-03, 4.4385e-01, 5.5307e-01]])"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import torch\n",
"\n",
"Mn = torch.softmax(M, 1)\n",
"Mn"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Drugi wektor zapytania najbardziej pasuje do pierwszego klucza, trochę\n",
"mniej do drugiego klucza, o wiele mniej do trzeciego klucza. Te\n",
"wektory to oczywiście wektory atencji (drugie słowo najbardziej\n",
"„patrzy” na pierwsze słowo).\n",
"\n",
"Teraz będziemy przemnażać przez wektory wartości:\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[ 3.9750e+00, 9.9419e-02, 1.0116e-01, 1.5765e-01, 5.8255e-04],\n",
" [ 9.2517e-01, 6.9357e+00, 2.3313e-02, -3.8112e+00, 9.2174e-01],\n",
" [ 1.6095e+00, 7.2120e-02, 2.1031e-01, 5.5597e+00, 5.9005e-02]])"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import torch\n",
"\n",
"V = torch.tensor([\n",
" [0.0, 9.0, 0.0, -5.0, 1.2],\n",
" [4.0, 0.1, 0.1, 0.1, 0.0],\n",
" [-0.3, 0.0, 0.3, 10.0, 0.1]])\n",
"\n",
"Mn @ V"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Dodatkowa normalizacja\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"W praktyce dobrze jest znormalizować pierwszy iloczyn przez\n",
"$\\sqrt{d_k}$, gdzie $d_k$ to rozmiar wektora klucza.\n",
"\n",
"$$\\operatorname{Atention}(Q,K,V) = \\operatorname{softmax}(\\frac{QK^T}{\\sqrt{d^k}})V$$\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Skąd się biorą Q, K i V?\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wektory (macierze) $Q$, $K$ i $V$ w pierwszej warstwie pochodzą z\n",
"embeddingów tokenów $E$ (właściwie jednostek BPE).\n",
"\n",
"- $Q$ = $EW^Q$\n",
"- $K$ = $EW^K$\n",
"- $V$ = $EW^V$\n",
"\n",
"W kolejnych warstwach zamiast $E$ wykorzystywane jest wyjście z poprzedniej warstwy.\n",
"\n",
"## Zastosowanie w ekstrakcji informacji\n",
"\n",
"W prosty sposób możemy do sieci Transformer dołączyć głowicę realizującą etykietowanie sekwencji."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Literatura\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[https://arxiv.org/pdf/1706.03762.pdf](https://arxiv.org/pdf/1706.03762.pdf)\n",
"\n"
]
}
],
"metadata": {
"author": "Filip Graliński",
"email": "filipg@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.9.6"
},
"org": null,
"subtitle": "15.Sieci Transformer i ich zastosowanie w ekstrakcji informacji[wykład]",
"title": "Ekstrakcja informacji",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

124
wyk/15_transformer.org Normal file
View File

@ -0,0 +1,124 @@
* Modele Transformer
** Atencja
Atencję w modelach Transformer można interpretować jako rodzaj
„miękkiego” odpytywania swego rodzaju bazy danych, w której
przechowywane są pary klucz-wartość. Mamy trzy rodzaje wektorów (a
właściwie macierzy, bo wektory są od razu upakowane w macierze):
- $Q$ - macierz zapytań,
- $K$ - macierz kluczy,
- $V$ - macierz wartości odpowiadających kluczom $K$.
W atencji modeli Transformer patrzymy jak bardzo zapytania $Q$ pasują
do kluczy $K$ i na tej podstawie zwracamy wartości $V$ (im bardziej
*klucz* pasuje do *zapytania*, tym większy wkład wnosi odpowiednia *wartość*).
Ten rodzaj odpytywania można zrealizować z pomocą mnożenia macierzy i funkcji softmax:
$$\operatorname{Atention}(Q,K,V) = \operatorname{softmax}(QK^T)V$$
*** Uproszczony przykład
Załóżmy, że rozmiar embeddingu wynosi 4, w macierzach rozpatrywać
będziemy po 3 wektory naraz (możemy sobie wyobrazić, że zdanie zawiera 3 wyrazy).
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
import torch
Q = torch.tensor([
[0.3, -2.0, 0.4, 6.0],
[-1.0, 1.5, 0.2, 3.0],
[0.3, -1.0, 0.2, 1.0]])
K = torch.tensor([
[-0.5, 1.7, 0.3, 4.0],
[0.4, -1.5, 0.3, 5.5],
[-1.0, -3.5, 1.0, 4.0]])
M = Q @ torch.transpose(K, 0, 1)
M
#+END_SRC
#+RESULTS:
:results:
# Out[11]:
#+BEGIN_EXAMPLE
tensor([[20.5700, 36.2400, 31.1000],
[15.1100, 13.9100, 7.9500],
[ 2.2100, 7.1800, 7.4000]])
#+END_EXAMPLE
:end:
Jak widać, najbardziej pierwszy wektor $Q$ pasuje do drugiego wektora $K$.
Znormalizujmy te wartości używać funkcji softmax.
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
import torch
Mn = torch.softmax(M, 1)
Mn
#+END_SRC
#+RESULTS:
:results:
# Out[12]:
#+BEGIN_EXAMPLE
tensor([[1.5562e-07, 9.9418e-01, 5.8236e-03],
[7.6807e-01, 2.3134e-01, 5.9683e-04],
[3.0817e-03, 4.4385e-01, 5.5307e-01]])
#+END_EXAMPLE
:end:
Drugi wektor zapytania najbardziej pasuje do pierwszego klucza, trochę
mniej do drugiego klucza, o wiele mniej do trzeciego klucza. Te
wektory to oczywiście wektory atencji (drugie słowo najbardziej
„patrzy” na pierwsze słowo).
Teraz będziemy przemnażać przez wektory wartości:
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
import torch
V = torch.tensor([
[0.0, 9.0, 0.0, -5.0],
[4.0, 0.1, 0.1, 0.1],
[-0.3, 0.0, 0.3, 10.0]])
Mn @ V
#+END_SRC
#+RESULTS:
:results:
# Out[13]:
#+BEGIN_EXAMPLE
tensor([[ 3.9750, 0.0994, 0.1012, 0.1577],
[ 0.9252, 6.9357, 0.0233, -3.8112],
[ 1.6095, 0.0721, 0.2103, 5.5597]])
#+END_EXAMPLE
:end:
*** Dodatkowa normalizacja
W praktyce dobrze jest znormalizować pierwszy iloczyn przez
$\sqrt{d_k}$, gdzie $d_k$ to rozmiar wektora klucza.
$$\operatorname{Atention}(Q,K,V) = \operatorname{softmax}(\frac{QK^T}{d^k})V$$
*** Skąd się biorą Q, K i V?
Wektory (macierze) $Q$, $K$ i $V$ w pierwszej warstwie pochodzą z
embeddingów tokenów $E$ (właściwie jednostek BPE).
- $Q$ = $EW^Q$
- $K$ = $EW^K$
- $V$ = $EW^V$
W kolejnych warstwach zamiast $E$ wykorzystywane jest wyjście z poprzedniej warstwy.
** Literatura
https://arxiv.org/pdf/1706.03762.pdf

BIN
wyk/bpe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

1
wyk/ie-gener.drawio Normal file
View File

@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2021-06-09T07:54:35.721Z" agent="5.0 (X11)" etag="NciLNBJF1axAiSJ0r0sv" version="14.7.3" type="device"><diagram id="HvCQlNLg7fWOxGx64C6g" name="Page-1">3Vjbbts4EP0aAe2DF9bNiR9jO9lisVekQLF9Y8SxRJsSVYqKrHz9Di+SJctF0m6TtvGDRB2RM+QcnhnKXrjOD79KUmZ/CArcC+b04IUbLwiWkY9XDbQWiMPQAqlk1EL+EbhlD+DAuUNrRqEadVRCcMXKMZiIooBEjTAipWjG3baCj72WJIUJcJsQPkU/MKoyi14GF0f8HbA06zz7i6V9k5Ous1tJlREqmgEUXnvhWgqhbCs/rIHr2HVxseNuPvO2n5iEQj1lgPgrjt7/+du/G76THw8f5Wyxv545K/eE127BXrDgaG+V4atFqlsdUpWk0OtQrQvO4lOtJ7+6I8k+laIu6CwRXEgvvMJ+Mr17E8Sxp6e1xutJ++1xfOfoHRDKirTzh0uxLsfTQHg6t/LFJ/u7kJDr8JZVre/UGEOPTOmtl4Oyo3FjVrgxQdX6LS6wZBVLzDLnwJnrVQE1NjTI6ioX+lFBXhqbrEgYZbQutOlaXzi5Q/+6t+p8g9l0aUG0G84+1eSXxyM5iFswCleg4GC2gco5Aj42t4zztQ3ZphAF2CibpYSb+Pj0XpQIzDB84arJmIJbxLXVBjMEYuIe5JYbKWSMUigQM4SA3ql6VKWk2EPnywvCufn100QDOL3P6sDv1YVZCQRSIVvs0g24dIJ0GclfuufmqO8gclg20rYDicspaW/7KDtsOOV9gQqDiQoV7CvNbAM7bx17y1XCRNM+gaRx6BxNZ5jDHZJi4DcJRg0QX+mYMsx7V+5FjtRoN2cpHNP1LUjxHyflHCfBc1ESnkmMJ8HHhF7q5pbD4UqXGgwFFNQ1NwknFSp9TI81AnRSdB4N1CAQ8ZlAdJgEThS7H5s/Fx3n4W/BTFZxPERRPOIBpTc2UYlaJuBGDavNiaHYf8SQIjIFNTFkyOqX/fX8RRP+tKIk2Sc7nSBNlnwgFaEPDEymtymRdfkQiZwpMcPbIFuyL8iWP6kQo8WJEC++sxCXEyK7SquLXV19XeH6llF/1moVh2M++kAP+Fi+JB9doh4Q0rR9kYJOLXey08qbprXSy0RDCjDHma2QOUl28Pb1Cik+PWYspsT1Ve9lmDtX0yxblN13dP1Tm7MnVP3B0gtvpqwOsuJg8P8TI4et+oGlODk4Rk88OD4fo9MqV7aKFFqGN6DaPQNFXq/E/PkJIeF3rlXdmWeUGwfJrzUfdfZkb0ia53XF9A0f1pF3eWE84PLb5KHAoz9GQ1QKv6rsV+KO7PXqrJVByn2tBMfLk+J3+Xw5FB+P/8XYU+jxD63w+j8=</diagram></mxfile>

BIN
wyk/ie-gener.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

1
wyk/ie-seqlab.drawio Normal file
View File

@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2021-06-09T07:51:04.277Z" agent="5.0 (X11)" etag="tdTX7mJTGI1dKBKJk9w0" version="14.7.3" type="device"><diagram id="HvCQlNLg7fWOxGx64C6g" name="Page-1">7Vhtk5MwEP41zOiHOhQKd/14bc+3Uet4zjj6LSVbyDUQDOEo/no3EEp5uempd+qc9kMbHpLd7PNkl6WWu4z3LyRJo7eCArccm+4td2U5znw2xW8NlDXguW4NhJLRGpq2wBX7Bga0DZozCllnohKCK5Z2wUAkCQSqgxEpRdGdthW86zUlIQyAq4DwIfqJURXV6Llz1uIvgYVR43nqz+s7MWkmm0iyiFBRHEHupeUupRCqHsX7JXDNXcNLve75LXcPG5OQqLssEGtv9vHd688rfi2/7L/Iib+7nBgrN4TnJmDL8TnaW0R4yw/1qEGylCQ6DlUacvyvud78YkOCXShFntBJILiQlnuB82S4eeJ4nqW3tcTv3vhpu75x9BIIZUnY+MNQapfdbSA83Fv62zf7RkiINb1plutfWhlDj0zpoxeDqlfjwczwYILK9V0MMGUZC6owbeDMzMqAVjY0yPIsFvpSQZxWNlkSMMponmjTuf7iZIP+9WzV+Ibq0IUJ0W44+5qTZ6eZPOLN6dDlKNhXx0DFHIEpDreM82VN2SoRCdQsV6G4K6+9+ihSBCZIn7soIqbgCnFttcAKgZi4AbnlVSpEjFJIEKsEAX1S9apMSbGDxpfluHb1OWwTDeD2bs2D6SG7sCqBQClkiVOaBecmIU1Fmvrmumjz25kZLOrktgGJqSnhwXabdjgwmfcDWegMslDBLtPKFnBtLT1rvgiYKMo7iNSlzsg0ohyekBCJXwXIGiC+0JwyrHsX5kaM0mg3oxJ25boPUaY9Uc6Gooxp4jyUJO5IYeyRjwU91cMth/2FftQgFZBQM1wFnGSY6V15aiNABw+dk0QdEeGNENFgEjhR7KZrfowd4+G9YFVVMTrMvK4OA4IzkcsAzKrjp03PkOecMKSIDEENDFViHcL+ef1mA/1AlTsGShQkYfB4M2nm/2WZ5P1vMR5Bi/EAQXvTkZj7rcwtOvU7nI3sq7MVVSjbOttaR0ssYAx0yO+gGPrHXxLrxEw2WTp6ba9Pz7nLmtswezFZrd+sP+Do1WG0PmKijqwb7TD+/z3fUVH0vDv0fP5Yzzd7qLLo/5sNxrl7Tw3G3P6zDcbZQL9Uikzp0lWUVGzKQHcZdtXI54+33Tif/WXtxnygS/+R8jNF7z5Zf9BKN+/nl+0N9Jj/Tj2aF7sjQYry8FILwwfYk6LUOSNJpFt1qHqTrZAxCa7h6eNNpPnZ6UfU4S35F5XDy/Z/x7ogtn/eupffAQ==</diagram></mxfile>

BIN
wyk/ie-seqlab.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

1
wyk/rnn-seq.drawio Normal file
View File

@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2021-06-01T16:04:31.943Z" agent="5.0 (X11)" etag="_GtJ7cj7F7SQ6oQHAF32" version="14.6.13" type="device"><diagram id="Q_5Aon-lI3fA6Ftl2Xdk" name="Page-1">7Vxtc5s4EP41zFw/JIPAGPyxtnMvM+mlc0mn1/umGMVWAsiD5Tj4159kBDZvBtcFiTgzTUdahED77K6WfcCaOfHf/gjhcvGFuMjTDN1908ypZhijAWD/c0EUC8DQNmLJPMSukO0F93iLhFAX0jV20SozkBLiUbzMCmckCNCMZmQwDMkmO+yJeNmrLuEcFQT3M+gVpd+xSxex1DHsvfxPhOeL5MpgOIqP+DAZLKZYLaBLNrFotzjzRjMnISE0bvlvE+Rx5SV6iTXwe8XR9MZCFNAmJ3yjk/V/Fn4ZRI59E03tLw+3z1emGU/zCr21WLG4WxolKpiHZL0Uw1BI0VuZ4uFjMlwv3hhIl8vsBBEf0TBiQ8RE6SnCRmzR3ez1bVpCtjjQdSqEAuN5OvVeDawhNHGCVkC9UphOAhfxSXTNHG8WmKL7JZzxoxvmCUy2oD676BSwZqXyDpV0BJ9K1YGc6oZF1aVDDlUH7LZUZ5Sobuixy44xa8x547MHExm7RCouqJgpi2b1uKIheUET4pGQSQISsJHjJ+x5ORH08Dxg3RlTLmLyMVc9Zk79WRzwsevyy5QCl4W2PeyGWexMowjeoMzs24KuGAqQ/4hcFwdzJtasyW/s7xXNNHv8qtlT3uNBDlMm4Jja009M9OmIqwCJrjIC14aVUXhZoAG2fW11qPNhQVvIZfuP6JKQLsicBNC72Utz9rkfc0vIUmjxGVEaic0UrinJ6hi9YfovP50tNe79EJPx9vTtsBMlnYAt9+Ak3v2RzMc7+9N2veS8eH18UT+DJtMMWYczVB9wKAzn6OiE5dYRIg9S/Jq9u18Os10SFQfs30qzbvS4eTHhL8kEbatRuDNa2+StI6CACwNFTGOC7J4kH6RhAaQNDFd0k6YQj2GSQHg4wIQfUHL/AaaVU21x9xl1ud1bfdl6Wt9CzIZbSGyMsvaQxMfkAAYO4UrBq8sVDjOFg8RBVq5g9wJoMOqLZyoLNGiMtCUV6aq8kD1HrfDchxVZiKI7mtlsR2stWUgrbT1yHMWeppJ8q95xbKl7YdEnFEW6dcTi2uQZQIhTvxLMbmjv3E6uOpVz2thAxEk5NNO7OAPgsjoij4V3vQqJDXP89iKiWVCUon6ibkRsmkqc7YjnIV1VzYgut5oBSuiQTqsXQ6cElBwGbbNrlnLsWsKQKkCvxQD1iF5LJj7Gr/mXQa/VYacavWYXWeXm/JovnV6rUbea9JpdjCwf+U9ma6qvmekN8x+7Yh/qiGEbVOQ/nM0x3mn+U+OTyrE5djFJVZXNqdtdVGNz7N68SdB+xEreE6yNWFKLv7YtEzGV+ZwE6fYBLK99DXJh07GyM8QW2Frty3ZkGobK/E/zEDBqakEDqSGg7ElYHf7n1D1QNv+TlKz75DiqZftWU8cZyXQcpzdMX+uIOeeWnZXkfxyjIjJK5n9ODImy+R/ng//pLJU42xHPQ7qq/hFdbv1DOv8D9LIwlgOhbQLIUY4AAnqDr846YoAERD2igIBe5uo5DuiF0MtggWrxU40GAnqxCNqcB9rhKpkJqlO5mlQQ0HtTIe06F0q3qfqXYZLYU/9+oC73zVr92CdX5jvNh+o8UzlCCOjFN2RUZYRqdxrVKCGg9+ZDgi4iV9PKlrBJaZELSK1iqswLpWh3gKGSzBAAval7SrON+kgAmluR1I8c0htVlB46eUOUzQ8B8FEO/QUbaVN2XtivPPd59x8JnRL02nlVQjJNBCp/xEEyT3RqbJRNFAHwUR3pMrOQ/N1x5YfH0QVXR+TTRaDse6FcZb9YFymv88eyZV6QjnhAAV8qeqEMKUPfkhWFAUZckSTcrmckYAti69BjIU829W0AZ1sU4ApqIZUtW6AbVswoeIXcnFr73sMuzvCfxig3HcLs5Mnb/erigpkYW/JPmdNxgo0lGsNMMDesknJ3ko1kSKIWTan4atl3jiB0Gcpr1vr75p8Uf76YnfNzr9d9MtcmA40/2+qP0a5p89BEti/axNIcg83hY66iEG5csiQueWQ2wg8NVnSzsyAeaWn0ghGFswXr3MW2NL76yi/Lm3/tm+Or27tJIt01dUzd66Kl3zEbpWi2FSZJ+DXHE+Tz+99ES7yC6d0GcCd75kNG49luyeKO+GiyG/K8ieIpVtvIr1zQ+rrPofC47ZpWNg8peUQbOp3GQLO4NQmrebcY5HLoq4YUZYsYFPehu/er/2Fe/yVO0LH+i8H7Het/1J3+WXf/g8vxQ+j+Z6vNm/8B</diagram></mxfile>

BIN
wyk/rnn-seq.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

1
wyk/rnn.drawio Normal file
View File

@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2021-06-01T15:52:54.501Z" agent="5.0 (X11)" etag="o_4DnBy9wLtBbjAQzQYJ" version="14.6.13" type="device"><diagram id="Q_5Aon-lI3fA6Ftl2Xdk" name="Page-1">5Vltj5s4EP41SO2HXcUYwuZjQ3J3H1pdpb3TtffNBRfcAI6M88L++hsH8w45qk2W7FbarDyPX7Bn5pkZjIHd+Pi7INvwE/dpZJgz/2jglWGaCwvBfwVkOYDmjpkjgWC+xirgkT1RDc40umM+TRsDJeeRZNsm6PEkoZ5sYEQIfmgO+86j5lO3JKAd4NEjURf9h/kyzNEH06nwPygLwuLJaL7Ie2JSDNZLpCHx+SGHTofDawO7gnOZt+KjSyOlvEIvuQZ+G+gtNyZoIsdM+Fu6u39ttrGyB2edrZxPf338cadX2ZNopw+sNyuzQgOC7xKfqkVmBl4eQibp45Z4qvcANgcslHEEEoKmXo4KSY+D+0Tl6cFtKI+pFBkM0ROwpU1fuAzW8qHSP9JnnYV13TsaJNrmQbl2pRZoaM38hJbmHaVQH7xEi1zIkAc8IdG6QpdNtVVjPnK+1cr6QaXMtMuTneRNVdIjk1/U9HtbS1/1Yqq9OtaFrBASOG5tkhK/FuspoZp2kop5+fnUoc4bDXTAd8KjZ3SlHUgSEVB5ZhzudwJBIyLZvrmPixvU7HF7C/6kYa83ebNjcvBo2bRQKgXfUJdHXACS8ETZ/TuLohZEIhYkIHqgTAr4UvGDQYz5oDti5vsnp+ljV9ORLkGwhybB8KJLMKuHX/ha9LJfC70uSBM8kiZoPiVPcIcnNP5GfZ8lAcCG7b6D3556hrPcG87q3Yk/7wF7fyaNoJdJIwjdm3bT0a2eTOI49/YL+nqRuKZxdlR39dLx/y+X1DNJLbFcP5c4r4IkzkAySYEMQIwNFFnO6q0nlaL6LLhmWvaopGJei2jIPmOWN5/jbXxj5ig5f/NJ/gZqaDQfG/icKQNfsc0axQ5EpPJADHMeKSJ9E9AKVCtiCeOqY+qywG7WBGZPTbB4yeIXLV4fMSYrCNDoisCekhgmfn02nS7YjbVpfjc1WbAbKvPgbSdlQUwGSorJA9xsXIC7Xubv6uRGyXBBp362r+qpnzmDR5fGtWatu9FZy2o5ifSsluHKbTzDlkMXZ3/eqPejken9et4/9BqS/QqvIe2rRmfcTePVrIFHfO/wdmJfeixN/A/qK5JSaUTSlHnPDzM+ScPyAUr4TCQYKzkh5gxdOL0OVEI1E9g9JiiwZwYsu/Uxp2PafP+dgNVZyGwvZI2LfGA9ktWGbdWA9MyGF/0bHtqX3YrId/b58e1z3KHGeGjkO75o2MbdsJ1uxZPhWsZiYbi2sXRpwiiMeIJfQlKZd22TLAZgA7GHUdXynkjKDwp8sxEL99uncWd8oZgFYvX5N7d19REdr/8D</diagram></mxfile>

BIN
wyk/rnn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

1
wyk/transformer.drawio Normal file
View File

@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2021-06-21T18:26:41.003Z" agent="5.0 (X11)" etag="PRyyghb9x3NmC1nfczsT" version="14.7.6" type="device"><diagram id="RKMbFXdSo0HOZQEC31J_" name="Page-1">7Ztbb5swFMc/DdL2sCpgLs0jkHbXvjSTqj5NKLgJKuCMOLd9+tnBkGK7TTqtsmVXiiJzMBf/fz7mHGMckFa7z022XNygHJaON8p3Dpg4njf2XfJPDfvWEADQGuZNkbcm92iYFn8gM46YdV3kcDWoiBEqcbEcGmeoruEMD2xZ06DtsNoDKodXXWZzKBims6wUrXdFjhet9dKLjvYvsJgvuiu74bjdU2VdZXaK1SLL0bY1HRoHrhyQNgjhtlTtUlhS7TpdWgWun9nb31gDa3zOAd8m9+PsKs7r9f5r7F9H6Y/q9lPATrPJyjVrMbtbvO8kaNC6ziE9y8gByXZRYDhdZjO6d0uYE9sCVyXZckmRnQ42GO6evVG3bz7pNhBVEDd7UqXrMwz9vusJbHt71D9kbR0tnmgPQmbMGPN5f+qjLKTAlHmFSqJIcZkJOpEW46EYK9ygR5iiEjXEUqOa1EweirLkTFlZzGuyOSMKQWJPqH4F6YQx21EVeU4vI1V/yOc/AHAvhwRAIBLwJQC8t9LfF/SvDJbfA5rJHwjyPyJsMgDd+n8kGaRTc/UHujnApah/kNzE0+9OMDEYg25uMBYwJNmqMHgg8n3NCHRRuSVP4mCkm/6ScN2CkSgIdePgCRwuzJW/z7a0kR9IAiKf/oJ0A2dOlGycaPKBbFEGBSYGmrBFk4+smrGohNTNVY1KzN1OoaqsICVkecpJiWneKVKHNNAGVtp5VfhqVjRjtAAV4J9VylHJkvcTqI4hnQ3EtHMuSbr/TuylcFw5MXFm4D3IkCawqkl5kgT2BKl2jscCWH6gGywxy+Vg/SZcTMficpNwvd7KsJxMqR5twBJxWJR7y1n5k/FYxrp5iyz+TgwGwIXT/XIKZQBk4bTBAPiJHfUAZNGxyQB084CuQ9gCgJ+DUQ9AlnWYDEA7D5BlEgYD4FM59QBkb8wMBsBPfKgHIEvaTAYQ6gZAlp6FJVU7LzakOMeHlg8ytiWdjHL7mae2Orn84AhTEQqZRKQYoS8bxM5C6FmKUMhFlCOUDYNnIQS2ItTOC/95IB1bijB0dUMoWz5gEwDVwYj/+kUBFza8Agt1WxTlS5f+eyPajpR4UXoo0KVT6YiWaJifeuTf5OW4HudOvuQLvR7J4Au9N8N0cgHA7Jdrw9sXLlhwgWL/6eZBXgIztgAM/wRSD0ackbuLb6c/72JzIbg8hLd7upDN45fdh31PPo8HV38B</diagram></mxfile>

BIN
wyk/word-distribution.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB