From 17cdfefd0ebd2560db7ecd5d631b76219ca2551b Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Fri, 18 Feb 2022 17:24:17 +0100 Subject: [PATCH] 01_Jezyk up --- wyk/01_Jezyk.ipynb | 699 +--------------------------------------- wyk/01_Jezyk.org | Bin 10150 -> 11292 bytes wyk/01_Jezyk/raster.png | Bin 0 -> 301 bytes wyk/01_Jezyk/zdzblo.png | Bin 0 -> 44487 bytes 4 files changed, 1 insertion(+), 698 deletions(-) create mode 100644 wyk/01_Jezyk/raster.png create mode 100644 wyk/01_Jezyk/zdzblo.png diff --git a/wyk/01_Jezyk.ipynb b/wyk/01_Jezyk.ipynb index ac40f53..1b29e39 100644 --- a/wyk/01_Jezyk.ipynb +++ b/wyk/01_Jezyk.ipynb @@ -1,698 +1 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Język — różne perspektywy\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Słowo wstępne\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "W matematyce istnieją dwa spojrzenia na rzeczywistość: ciągłe i dyskretne.\n", - "\n", - "Otaczająca nas rzeczywistość fizyczna jest z natury ciągła\n", - "(przynajmniej jeśli nie operujemy w mikroskali), lecz język\n", - "jest dyskretnym wyłomem w ciągłej rzeczywistości.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lingwistyka matematyczna\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Przypomnijmy sobie definicję języka przyjętą w lingwistyce\n", - "matematycznej, w kontekście na przykład teorii automatów.\n", - "\n", - "****Alfabetem**** nazywamy skończony zbiór symboli.\n", - "\n", - "****Łańcuchem**** nad alfabetem $\\Sigma$ nazywamy dowolny, skończony,\n", - "ciąg złożony z symboli z $\\Sigma$\n", - "\n", - "****Językiem**** nazywamy dowolny, skończony bądź nieskończony, zbiór łańcuchów.\n", - "\n", - "W tym formalnym ujęciu językami są na przykład następujące zbiory:\n", - "\n", - "- $\\{\\mathit{poniedziałek},\\mathit{wtorek},\\mathit{środa},\\mathit{czwartek},\\mathit{piątek},\\mathit{sobota},\\mathit{niedziela}\\}$\n", - "- $\\{\\mathit{ab},\\mathit{abb},\\mathit{abbb},\\mathit{abbbb},\\ldots\\}$\n", - "\n", - "To podejście, z jednej strony oczywiście nie do końca się pokrywa się z potocznym\n", - "rozumieniem słowa *język*, z drugiej kojarzy nam się z takimi\n", - "narzędziami informatyki jak wyrażenia regularne, automaty skończenie\n", - "stanowe czy gramatyki języków programowania.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "abbb" - ] - } - ], - "source": [ - "import regex as re\n", - "rx = re.compile(r'ab+')\n", - "\n", - "rx.search('żabbba').group(0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" - ] - } - ], - "source": [ - "import rstr\n", - "\n", - "rstr.xeger(r'ab+')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ujęcie probabilistyczne\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Na tym wykładzie przyjmiemy inną perspektywą, częściowo ciągłą, opartą\n", - "na probabilistyce. Język będziemy definiować poprzez ****rozkład\n", - "prawdopodobieństwa****: sensownym wypowiedziom czy tekstom będziemy\n", - "przypisywać stosunkowe wysokie prawdopodobieństwo, „ułomnym” tekstom — niższe (być może zerowe).\n", - "\n", - "Na ogół nie mamy jednak do czynienia z językiem jako takim tylko z\n", - "jego przybliżeniami, ****modelami**** (model może być lepszy lub gorszy,\n", - "ale przynajmniej powinien być użyteczny…). Formalnie $M$ nazywamy\n", - "modelem języka (nad skończonym alfabetem $Sigma$), jeśli dyskretny określa rozkład prawdopodobieństwa $P_M$:\n", - "\n", - "$$P_M \\colon \\Sigma^{*} \\rightarrow [0,1].$$\n", - "\n", - "Rzecz jasna, skoro mamy do czynienia z rozkładem prawdopodobieństwa, to:\n", - "\n", - "$$\\sum_{\\alpha \\in \\Sigma^{*}} P_M(\\alpha) = 1$$\n", - "\n", - "Jeśli $M$ ma być modelem języka polskiego, oczekiwalibyśmy, że dla\n", - "napisów:\n", - "\n", - "- $z_1$ — *W tym stanie rzeczy pan Ignacy coraz częściej myślał o Wokulskim.*\n", - "- $z_2$ — *Po wypełniony zbiornik pełny i należne kwotę, usłyszała w attendant*\n", - "- $z_3$ — *xxxxyźźźźźit backspace hoooooooooop x y z*\n", - "\n", - "zachodzić będzie:\n", - "\n", - "$$ P_M(z_1) > P_M(z_2) > P_M(z_3). $$\n", - "\n", - "****Pytanie**** Jakiej konkretnie wartości prawdopodobieństwa byśmy\n", - "spodziewali się dla zdania *Dzisiaj rano kupiłem w piekarni sześć\n", - "bułek* dla sensownego modelu języka polskiego?\n", - "\n", - "Moglibyśmy sprowadzić tę definicję języka do tej „dyskretnej”, tzn.\n", - "moglibyśmy przyjąć, że łańcuch $\\alpha$ należy do języka wyznaczonego\n", - "przez model $M$, jeśli $P_M(\\alpha) > 0$.\n", - "\n", - "****Pytanie**** Czy moglibyśmy w ten sposób język nieskończony? Czy może istnieć\n", - "dyskretny rozkład prawdopodobieństwa dla nieskończonego zbioru?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Co jest symbolem?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Model języka daje rozkład prawdopodobieństwa nad zbiorem łańcuchów\n", - "opartym na skończonym alfabecie, tj. zbiorze symboli. W praktyce\n", - "alfabet nie musi być zgodny z potocznym czy językoznawczym rozumieniem\n", - "tego słowa. To znaczy alfabet może być zbiorem znaków (liter), ale\n", - "modelować język możemy też przyjmując inny typ symboli: sylaby,\n", - "morfemy (cząstki wyrazów) czy po prostu całe wyrazy.\n", - "\n", - "Powinniśmy przy tym pamiętać, że, koniec końców, w pamięci komputera\n", - "wszelkiego rodzaju łańcuchy są zapisywane jako ciągi zer i jedynek — bitów.\n", - "Omówmy pokrótce techniczną stronę modelowania języka.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Kodowanie znaków\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cóż może być prostszego od pliku tekstowego?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " Ala ma kota.\n", - "\n", - "Komputer nic nie wie o literach.\n", - "\n", - "… w rzeczywistości operuje tylko na liczbach …\n", - "\n", - "… czy raczej na zerach i jedynkach …\n", - "\n", - "… a tak naprawdę na ciągłym sygnale elektrycznym …\n", - "\n", - "![img](./01_Jezyk/digitalsignal.jpg)\n", - "\n", - "… zera i jedynki są w naszej głowie …\n", - "\n", - "… co jest dziwne, *naprawdę* dziwne …\n", - "\n", - "… ale nikt normalny się tym nie przejmuje.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Jak zakodować literę?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Zakodowanie pikseli składających się na kształtu (****glyfu****) litery A\n", - "*oczywiście* nie jest dobrym pomysłem.\n", - "\n", - "![img](./01_Jezyk/raster.png)\n", - "\n", - "Nie, potrzebujemy *arbitralnego* kodowania dla wszystkich możliwych\n", - "kształtów litery A (*w naszych głowach*): A, $\\mathcal{A}$,\n", - "$\\mathbb{A}$, $\\mathfrak{A}$ powinny otrzymać ten sam kod, powiedzmy 65\n", - "(binarnie: 1000001).\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ASCII\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ASCII to 7-bitowy (****nie**** 8-bitowy!) system kodowania znaków.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0: \u0000\n", - "1: \u0001\n", - "2: \u0002\n", - "3: \u0003\n", - "4: \u0004\n", - "5: \u0005\n", - "6: \u0006\n", - "7: \u0007\n", - "8: \b\n", - "9:\n", - "10:\n", - "\n", - "11: \u000b", - "\n", - "12: \f", - "\n", - "13:\n", - "14: \u000e\n", - "15: \u000f\n", - "16: \u0010\n", - "17: \u0011\n", - "18: \u0012\n", - "19: \u0013\n", - "20: \u0014\n", - "21: \u0015\n", - "22: \u0016\n", - "23: \u0017\n", - "24: \u0018\n", - "25: \u0019\n", - "26: \u001a\n", - "27: \u001b\n", - "28: \u001c", - "\n", - "29: \u001d", - "\n", - "30: \u001e", - "\n", - "31: \u001f\n", - "32:\n", - "33: !\n", - "34: \"\n", - "35: #\n", - "36: $\n", - "37: %\n", - "38: &\n", - "39: '\n", - "40: (\n", - "41: )\n", - "42: *\n", - "43: +\n", - "44: ,\n", - "45: -\n", - "46: .\n", - "47: /\n", - "48: 0\n", - "49: 1\n", - "50: 2\n", - "51: 3\n", - "52: 4\n", - "53: 5\n", - "54: 6\n", - "55: 7\n", - "56: 8\n", - "57: 9\n", - "58: :\n", - "59: ;\n", - "60: <\n", - "61: =\n", - "62: >\n", - "63: ?\n", - "64: @\n", - "65: A\n", - "66: B\n", - "67: C\n", - "68: D\n", - "69: E\n", - "70: F\n", - "71: G\n", - "72: H\n", - "73: I\n", - "74: J\n", - "75: K\n", - "76: L\n", - "77: M\n", - "78: N\n", - "79: O\n", - "80: P\n", - "81: Q\n", - "82: R\n", - "83: S\n", - "84: T\n", - "85: U\n", - "86: V\n", - "87: W\n", - "88: X\n", - "89: Y\n", - "90: Z\n", - "91: [\n", - "92: \\\n", - "93: ]\n", - "94: ^\n", - "95: _\n", - "96: `\n", - "97: a\n", - "98: b\n", - "99: c\n", - "100: d\n", - "101: e\n", - "102: f\n", - "103: g\n", - "104: h\n", - "105: i\n", - "106: j\n", - "107: k\n", - "108: l\n", - "109: m\n", - "110: n\n", - "111: o\n", - "112: p\n", - "113: q\n", - "114: r\n", - "115: s\n", - "116: t\n", - "117: u\n", - "118: v\n", - "119: w\n", - "120: x\n", - "121: y\n", - "122: z\n", - "123: {\n", - "124: |\n", - "125: }\n", - "126: ~\n", - "127: " - ] - } - ], - "source": [ - "for code in range(0, 128):\n", - " print(f'{code}: {chr(code)}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Jak zejść na poziom bitów?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Linux — wiersz poleceń\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Linux command line:\n", - "\n", - " $ echo 'Ala ma kota' > file.txt\n", - " $ hexdump -C file.txt\n", - " 00000000 41 6c 61 20 6d 61 20 6b 6f 74 61 0a |Ala ma kota.|\n", - " 0000000c\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Edytor tekstu (Emacs)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![img](./01_Jezyk/hexl-mode.png)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Uwaga!\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- kiedy dzieje się coś dziwnego, sprawdź co tak *naprawdę* jest w pliku\n", - "- ASCII jest 7-bitowym kodowaniem (128 znaków)\n", - " - choć zazwyczaj uzupełnionym (ang. *padded*) do 8 bitów\n", - " - nie mów plik *plik ASCII*, kiedy masz na myśli *prosty/czysty plik tekstowy* (ang. *plain text file*)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Higiena plików tekstowych\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Piekło końca wiersza\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![img](./01_Jezyk/dante.jpg)\n", - "\n", - "Więcej na [https://re-research.pl/pl/post/2017-01-28-00042-anatomia-pliku-tekstowego-2.html](https://re-research.pl/pl/post/2017-01-28-00042-anatomia-pliku-tekstowego-2.html)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dobre rady\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- żadnych niepotrzebnych spacji na końcu wiersza\n", - "\n", - "- żadnych niepotrzebnych pustych wierszy na końcu pliku\n", - "\n", - "- … ale ostatni wiersz powinien zakończyć się znakiem końca wiersza\n", - "\n", - "- nie używać znaków tabulacji (zamiast tego 4 spacje)\n", - " - wyjątek: pliki TSV\n", - " - wyjątek: pliki Makefile\n", - "\n", - "- uwaga na niestandardowe spacje i dziwne znaki o zerowej długości\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Unikod\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ASCII obejmuje 128 znaków: litery alfabetu łacińskiego (właściwie angielskiego),\n", - "cyfry, znaki interpunkcyjne, znaki specjalne itd.\n", - "\n", - "Co z pozostałymi znakami? Polskimi ogonkami, czeskimi haczykami,\n", - "francuskimi akcentami, cyrylicą, koreańskim alfabetem, chińskimi\n", - "znakami, rongorongo?\n", - "\n", - "워싱턴, 부산, 삼성\n", - "\n", - "Rozwiązaniem jest Unikod (ang. *Unicode*) system, który przypisuje\n", - "znakom używanym przez ludzkość liczby (kody, ang. *code points*).\n", - "\n", - "| Znak|Kod ASCII|Kod Unikodowy|\n", - "|---|---|---|\n", - "| 9|57|57|\n", - "| a|97|97|\n", - "| ą|-|261|\n", - "| ł|-|322|\n", - "| $\\aleph$|-|1488|\n", - "| ặ|-|7861|\n", - "| ☣|-|9763|\n", - "| 😇|-|128519|\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### UTF-8\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Kody znaków są pojęciem abstrakcyjnym. Potrzebujemy konkretnego ****kodowania****\n", - "by zamienić kody w sekwencję bajtów. Najpopularniejszym kodowaniem jest UTF-8.\n", - "\n", - "W kodowaniu UTF-8 znaki zapisywane za pomocą 1, 2, 3 lub 4 bajtów.\n", - "\n", - "| Znak|Kod Unikodowy|Szesnastkowo|UTF-8 (binarnie)|\n", - "|---|---|---|---|\n", - "| 9|57|U+0049|01001001|\n", - "| a|97|U+0061|01100001|\n", - "| ą|261|U+0105|11000100:10000101|\n", - "| ł|322|U+0142|11000101:10000010|\n", - "| $\\aleph$|1488|U+05D0|11010111:10010000|\n", - "| ặ|7861|U+1EB7|11100001:10111010:10110111|\n", - "| ☣|9763|U+2623|11100010:10011000:10100011|\n", - "| 😇|128519|U+1f607|11110000:10011111:10011000:10000111|\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### *Źdźbło* to ile bajtów w UTF-8?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jeśli wczytasz jako wiersz w języku C, 11 bajtów!\n", - "\n", - "[./01_Jezyk/zdzblo.pdf](./01_Jezyk/zdzblo.pdf)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dlaczego UTF-8 jest doskonałym systemem kodowania?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- wstecznie kompatybilny z ASCII\n", - " - plik ASCII jest poprawnym plikiem UTF-8\n", - "- nie zajmuje dużo miejsca\n", - " - chyba w tekście jest dużo „dziwnych” znaków\n", - "- proste grepowanie działa\n", - " - `grep UAM text-in-utf8.txt` zadziała\n", - " - ale nawet nie próbuj: `grep SRPOL text-in-utf16.txt`\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Porady\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- zawsze używaj UTF-8\n", - " - bądź asertywny! jeśli w pracy każą używać czegoś innego — rezygnuj z pracy\n", - " - **NIE** używaj innych unikodowych kodowań: UTF-16, UTF-32, UCS-2\n", - " - **NIE** używaj nieunikodowych systemów kodowania\n", - " - ISO-8859-2, Windows-1250, Mazovia, IEA Świerk, …\n", - "- uwaga na pułapki UTF-8\n", - " - ustalenie długości napisu w znakach wymaga przejścia znak po znaku\n", - " - jeśli napis w kodowaniu UTF-8 zajmuje 9 bajtów, ile to znaków?\n", - " 3, 4, 5, 6, 7, 8 lub 9!\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **NIE** używaj sekwencji BOM\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![img](./01_Jezyk/evil-bom.png)\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.2" - }, - "org": null - }, - "nbformat": 4, - "nbformat_minor": 1 -} +{"cells":[{"cell_type":"markdown","metadata":{},"source":["## Język — różne perspektywy\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Słowo wstępne\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W matematyce istnieją dwa spojrzenia na rzeczywistość: ciągłe i dyskretne.\n\nOtaczająca nas rzeczywistość fizyczna jest z natury ciągła\n(przynajmniej jeśli nie operujemy w mikroskali), lecz język\njest dyskretnym wyłomem w ciągłej rzeczywistości.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Lingwistyka matematyczna\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Przypomnijmy sobie definicję języka przyjętą w lingwistyce\nmatematycznej, w kontekście na przykład teorii automatów.\n\n****Alfabetem**** nazywamy skończony zbiór symboli.\n\n****Łańcuchem**** nad alfabetem $\\Sigma$ nazywamy dowolny, skończony,\nciąg złożony z symboli z $\\Sigma$.\n\n****Językiem**** nazywamy dowolny, skończony bądź nieskończony, zbiór łańcuchów.\n\nW tym formalnym ujęciu językami są na przykład następujące zbiory:\n\n- $\\{\\mathit{poniedziałek},\\mathit{wtorek},\\mathit{środa},\\mathit{czwartek},\\mathit{piątek},\\mathit{sobota},\\mathit{niedziela}\\}$\n- $\\{\\mathit{ab},\\mathit{abb},\\mathit{abbb},\\mathit{abbbb},\\ldots\\}$\n\nTo podejście, z jednej strony oczywiście nie do końca się pokrywa się z potocznym\nrozumieniem słowa *język*, z drugiej kojarzy nam się z takimi\nnarzędziami informatyki jak wyrażenia regularne, automaty skończenie\nstanowe czy gramatyki języków programowania.\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"abbb"}],"source":["import regex as re\nrx = re.compile(r'ab+')\n\nrx.search('żabbba').group(0)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}],"source":["import rstr\n\nrstr.xeger(r'ab+')"]},{"cell_type":"markdown","metadata":{},"source":["### Ujęcie probabilistyczne\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Na tym wykładzie przyjmiemy inną perspektywą, częściowo ciągłą, opartą\nna probabilistyce. Język będziemy definiować poprzez ****rozkład\nprawdopodobieństwa****: sensownym wypowiedziom czy tekstom będziemy\nprzypisywać stosunkowe wysokie prawdopodobieństwo, „ułomnym” tekstom — niższe (być może zerowe).\n\nNa ogół nie mamy jednak do czynienia z językiem jako takim tylko z\njego przybliżeniami, ****modelami**** (model może być lepszy lub gorszy,\nale przynajmniej powinien być użyteczny…). Formalnie $M$ nazywamy\nmodelem języka (nad skończonym alfabetem $\\Sigma$), jeśli określa dyskretny rozkład prawdopodobieństwa $P_M$:\n\n$$P_M \\colon \\Sigma^{*} \\rightarrow [0,1].$$\n\nRzecz jasna, skoro mamy do czynienia z rozkładem prawdopodobieństwa, to:\n\n$$\\sum_{\\alpha \\in \\Sigma^{*}} P_M(\\alpha) = 1.$$\n\nJeśli $M$ ma być modelem języka polskiego, oczekiwalibyśmy, że dla\nnapisów:\n\n- $z_1$ — *W tym stanie rzeczy pan Ignacy coraz częściej myślał o Wokulskim.*\n- $z_2$ — *Po wypełniony zbiornik pełny i należne kwotę, usłyszała w attendant*\n- $z_3$ — *xxxxyźźźźźit backspace hoooooooooop x y z*\n\nzachodzić będzie:\n\n$$ P_M(z_1) > P_M(z_2) > P_M(z_3). $$\n\n****Pytanie**** Jakiej konkretnie wartości prawdopodobieństwa\nspodziewalibyśmy się dla zdania *Dzisiaj rano kupiłem w piekarni sześć\nbułek* dla sensownego modelu języka polskiego?\n\nMoglibyśmy sprowadzić tę definicję języka do tej „dyskretnej”, tzn.\nmoglibyśmy przyjąć, że łańcuch $\\alpha$ należy do języka wyznaczonego\nprzez model $M$, jeśli $P_M(\\alpha) > 0$.\n\n****Pytanie**** Czy moglibyśmy w ten sposób opisać język nieskończony? Czy może istnieć\ndyskretny rozkład prawdopodobieństwa dla nieskończonego zbioru?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Co jest symbolem?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Model języka daje rozkład prawdopodobieństwa nad zbiorem łańcuchów\nopartym na skończonym alfabecie, tj. zbiorze symboli. W praktyce\nalfabet nie musi być zgodny z potocznym czy językoznawczym rozumieniem\ntego słowa. To znaczy alfabet może być zbiorem znaków (liter), ale\nmodelować język możemy też przyjmując inny typ symboli: sylaby,\nmorfemy (cząstki wyrazów) czy po prostu całe wyrazy.\n\nPowinniśmy przy tym pamiętać, że, koniec końców, w pamięci komputera\nwszelkiego rodzaju łańcuchy są zapisywane jako ciągi zer i jedynek — bitów.\nOmówmy pokrótce techniczną stronę modelowania języka.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["## Kodowanie znaków\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Cóż może być prostszego od pliku tekstowego?\n\n"]},{"cell_type":"markdown","metadata":{},"source":[" Ala ma kota.\n\nKomputer nic nie wie o literach.\n\n… w rzeczywistości operuje tylko na liczbach …\n\n… czy raczej na zerach i jedynkach …\n\n… a tak naprawdę na ciągłym sygnale elektrycznym …\n\n![img](./01_Jezyk/digitalsignal.jpg)\n\n… zera i jedynki są w naszej głowie …\n\n… co jest dziwne, *naprawdę* dziwne …\n\n… ale nikt normalny się tym nie przejmuje.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Jak zakodować literę?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Zakodowanie pikseli składających się na kształtu (****glyfu****) litery A\n*oczywiście* nie jest dobrym pomysłem.\n\n![img](./01_Jezyk/raster.png)\n\nNie, potrzebujemy *arbitralnego* kodowania dla wszystkich możliwych\nkształtów litery A (*w naszych głowach*): A, $\\mathcal{A}$,\n$\\mathbb{A}$, $\\mathfrak{A}$ powinny otrzymać ten sam kod, powiedzmy 65\n(binarnie: 1000001).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### ASCII\n\n"]},{"cell_type":"markdown","metadata":{},"source":["ASCII to 7-bitowy (****nie**** 8-bitowy!) system kodowania znaków.\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"0: \u0000\n1: \u0001\n2: \u0002\n3: \u0003\n4: \u0004\n5: \u0005\n6: \u0006\n7: \u0007\n8: \b\n9:\n10:\n\n11: \u000b\n12: \f\n13:\n14: \u000e\n15: \u000f\n16: \u0010\n17: \u0011\n18: \u0012\n19: \u0013\n20: \u0014\n21: \u0015\n22: \u0016\n23: \u0017\n24: \u0018\n25: \u0019\n26: \u001a\n27: \u001b\n28: \u001c\n29: \u001d\n30: \u001e\n31: \u001f\n32:\n33: !\n34: \"\n35: #\n36: $\n37: %\n38: &\n39: '\n40: (\n41: )\n42: *\n43: +\n44: ,\n45: -\n46: .\n47: /\n48: 0\n49: 1\n50: 2\n51: 3\n52: 4\n53: 5\n54: 6\n55: 7\n56: 8\n57: 9\n58: :\n59: ;\n60: <\n61: =\n62: >\n63: ?\n64: @\n65: A\n66: B\n67: C\n68: D\n69: E\n70: F\n71: G\n72: H\n73: I\n74: J\n75: K\n76: L\n77: M\n78: N\n79: O\n80: P\n81: Q\n82: R\n83: S\n84: T\n85: U\n86: V\n87: W\n88: X\n89: Y\n90: Z\n91: [\n92: \\\n93: ]\n94: ^\n95: _\n96: `\n97: a\n98: b\n99: c\n100: d\n101: e\n102: f\n103: g\n104: h\n105: i\n106: j\n107: k\n108: l\n109: m\n110: n\n111: o\n112: p\n113: q\n114: r\n115: s\n116: t\n117: u\n118: v\n119: w\n120: x\n121: y\n122: z\n123: {\n124: |\n125: }\n126: ~\n127: "}],"source":["for code in range(0, 128):\n print(f'{code}: {chr(code)}')"]},{"cell_type":"markdown","metadata":{},"source":["### Jak zejść na poziom bitów?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Linux — wiersz poleceń\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Linux command line:\n\n $ echo 'Ala ma kota' > file.txt\n $ hexdump -C file.txt\n 00000000 41 6c 61 20 6d 61 20 6b 6f 74 61 0a |Ala ma kota.|\n 0000000c\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Edytor tekstu (Emacs)\n\n"]},{"cell_type":"markdown","metadata":{},"source":["![img](./01_Jezyk/hexl-mode.png)\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Uwaga!\n\n"]},{"cell_type":"markdown","metadata":{},"source":["- kiedy dzieje się coś dziwnego, sprawdź, co tak *naprawdę* jest w pliku\n- ASCII jest 7-bitowym kodowaniem (128 znaków)\n - choć zazwyczaj uzupełnionym (ang. *padded*) do 8 bitów\n - nie mów plik *plik ASCII*, kiedy masz na myśli *prosty/czysty plik tekstowy* (ang. *plain text file*)\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Higiena plików tekstowych\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Piekło końca wiersza\n\n"]},{"cell_type":"markdown","metadata":{},"source":["![img](./01_Jezyk/dante.jpg)\n\nWięcej na [https://re-research.pl/pl/post/2017-01-28-00042-anatomia-pliku-tekstowego-2.html](https://re-research.pl/pl/post/2017-01-28-00042-anatomia-pliku-tekstowego-2.html)\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Dobre rady\n\n"]},{"cell_type":"markdown","metadata":{},"source":["- żadnych niepotrzebnych spacji na końcu wiersza\n\n- żadnych niepotrzebnych pustych wierszy na końcu pliku\n\n- … ale ostatni wiersz powinien zakończyć się znakiem końca wiersza\n\n- nie używać znaków tabulacji (zamiast tego 4 spacje)\n - wyjątek: pliki TSV\n - wyjątek: pliki Makefile\n\n- uwaga na niestandardowe spacje i dziwne znaki o zerowej długości\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Unikod\n\n"]},{"cell_type":"markdown","metadata":{},"source":["ASCII obejmuje 128 znaków: litery alfabetu łacińskiego (właściwie angielskiego),\ncyfry, znaki interpunkcyjne, znaki specjalne itd.\n\nCo z pozostałymi znakami? Polskimi ogonkami, czeskimi haczykami,\nfrancuskimi akcentami, cyrylicą, koreańskim alfabetem, chińskimi\nznakami, rongorongo?\n\n워싱턴, 부산, 삼성\n\nRozwiązaniem jest Unikod (ang. *Unicode*) system, który przypisuje\nznakom używanym przez ludzkość liczby (kody, ang. *code points*).\n\n| Znak|Kod ASCII|Kod Unikodowy|\n|---|---|---|\n| 9|57|57|\n| a|97|97|\n| ą|-|261|\n| ł|-|322|\n| $\\aleph$|-|1488|\n| ặ|-|7861|\n| ☣|-|9763|\n| 😇|-|128519|\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### UTF-8\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Kody znaków są pojęciem abstrakcyjnym. Potrzebujemy konkretnego ****kodowania****\nby zamienić kody w sekwencję bajtów. Najpopularniejszym kodowaniem jest UTF-8.\n\nW kodowaniu UTF-8 znaki zapisywane za pomocą 1, 2, 3 lub 4 bajtów.\n\n| Znak|Kod Unikodowy|Szesnastkowo|UTF-8 (binarnie)|\n|---|---|---|---|\n| 9|57|U+0049|01001001|\n| a|97|U+0061|01100001|\n| ą|261|U+0105|11000100:10000101|\n| ł|322|U+0142|11000101:10000010|\n| $\\aleph$|1488|U+05D0|11010111:10010000|\n| ặ|7861|U+1EB7|11100001:10111010:10110111|\n| ☣|9763|U+2623|11100010:10011000:10100011|\n| 😇|128519|U+1f607|11110000:10011111:10011000:10000111|\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### *Źdźbło* to ile bajtów w UTF-8?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Jeśli wczytać jako wiersz w języku C, 11 bajtów!\n\n![img](./01_Jezyk/zdzblo.png)\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Dlaczego UTF-8 jest doskonałym systemem kodowania?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["- wstecznie kompatybilny z ASCII\n - plik ASCII jest poprawnym plikiem UTF-8\n- nie zajmuje dużo miejsca\n - chyba że w tekście jest dużo „dziwnych” znaków\n- proste grepowanie działa\n - `grep UAM text-in-utf8.txt` zadziała\n - ale nawet nie próbuj: `grep SRPOL text-in-utf16.txt`\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Porady\n\n"]},{"cell_type":"markdown","metadata":{},"source":["- zawsze używaj UTF-8\n - bądź asertywny! jeśli w pracy każą używać czegoś innego — rezygnuj z pracy\n - **NIE** używaj innych unikodowych kodowań: UTF-16, UTF-32, UCS-2\n - **NIE** używaj nieunikodowych systemów kodowania\n - ISO-8859-2, Windows-1250, Mazovia, IEA Świerk, …\n- uwaga na pułapki UTF-8\n - ustalenie długości napisu w znakach wymaga przejścia znak po znaku\n - jeśli napis w kodowaniu UTF-8 zajmuje 9 bajtów, ile to znaków?\n 3, 4, 5, 6, 7, 8 lub 9!\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### **NIE** używaj sekwencji BOM\n\n"]},{"cell_type":"markdown","metadata":{},"source":["![img](./01_Jezyk/evil-bom.png)\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Unikod/UTF-8 a języki programowania\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Pamiętaj, żeby być konsekwentnym!\n\n- kodowanie kodu źródłowego (literały!)\n - czasami podawane na początku pliku\n - … albo brane z ustawień *locale*\n - … albo — domyślnie — UTF-8 (w nowszych językach programowania)\n- kodowanie standardowego wejścia/wyjścia i plików\n- jak sekwencje bajtów są interpretowane w czasie działania programu?how the sequence of bytes is \\alert{interpreted} during run-time?\n - *Źdźbło* jest łańcuchem złożonym z 6 czy 9 elementów??\n - 9 bajtów\n - 6 kodów\n - `\"Źdźbło\"[1]` …\n - `d`\n - … albo śmieci\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Python 2\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["#!/usr/bin/python2\n# -*- coding: utf-8 -*-\nimport sys\nfor line in sys.stdin:\n line = line.decode('utf-8').rstrip()\n if \"źdźbło\".decode('utf-8') in line:\n print len(line), ' ', line"]},{"cell_type":"markdown","metadata":{},"source":["#### Python3\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["#!/usr/bin/python3\nimport sys\nfor line in sys.stdin:\n line = line.strip()\n if \"źdźbło\" in line:\n print(len(line), ' ', line)"]},{"cell_type":"markdown","metadata":{},"source":["Uwaga: zakładając, że zmienna środowiskowa `LANG` jest ustawiona na UTF-8.\n\n"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file diff --git a/wyk/01_Jezyk.org b/wyk/01_Jezyk.org index cfb658956ed843dae5318fe6dc7015a42989b83c..524851de8df6c16e248cb7d58acaebd4af61b3a0 100644 GIT binary patch delta 1226 zcmb7DOKTKC5GE@sPRPXvh^NW}_F;AhBZvkyh_8!8F$NT0^v?9|_RdWA*xkc0BkqbA z0$$gPtmj-6_MnDAldGIG#J)17_RodPMj~78;VO87E9%9RYn}v?mQ}?Q zH@`wn6hXEwKM&mOnTTmqK*?vCN|HTGCd(E;wF^#46lMlgLa-7APB3=T;fnSm2z};7 z1_+x^*MRtS0d;9mDMU(>n9=Mx*uHRxPwm~f&8IKH6#?4fb4Kz0OBg9E#lS_Z(!^;& zcO;fzxJzz%mk_MPT_RDJ(Gb&i)^`}O<75;7vPYhu2Ql7i6Awm?IBg1b($;tmYPbT7 zqx4WxZS0{C8|htz)UbuRF5Lc9SWj>hHI*TDY%DfrGC7Vkh)L6 zjU?kukP)wH7SM&<3_JVaX6toy-^O858n8_E+=-kP4IstiZnhz?acJi$q?5oIpgs+- zn@D=W2!+(35@j`n1fQXw zjGOP8(g>b6b@S76`K#tqOhQY=JVmiwlS)e#mdp$SYrs^terL<5sXwtMu}PKZM0kik zYw#(@S>_bCvkrY<(6;LP;gL={aPg{;)0vvV>PQYwqHi&9JSDi!j9G*BpUav-nV zWIN6co8NQpU=&tJsysS7x00*4AU~xlGqpT1Cv)>o?l{KH^1NrcH@}tmz{ONtHTk}> S4O2?mWLcHrO&6lZ})WHAE+w=f7ZGR&GI0Tg5} z@$_|Nf50WcqiQ|jw%u-^kZfj1M2T~LZfj4?F#N?!uXBD0mdKI;Vst0HzpinE(I) literal 0 HcmV?d00001 diff --git a/wyk/01_Jezyk/zdzblo.png b/wyk/01_Jezyk/zdzblo.png new file mode 100644 index 0000000000000000000000000000000000000000..0632af1791550f7852fbb382fbe3144bb743a7c7 GIT binary patch literal 44487 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