407 lines
9.9 KiB
Org Mode
407 lines
9.9 KiB
Org Mode
|
||
* Język — różne perspektywy
|
||
** Słowo wstępne
|
||
|
||
W matematyce istnieją dwa spojrzenia na rzeczywistość: ciągłe i dyskretne.
|
||
|
||
Otaczająca nas rzeczywistość fizyczna jest z natury ciągła
|
||
(przynajmniej jeśli nie operujemy w mikroskali), lecz język
|
||
jest dyskretnym wyłomem w ciągłej rzeczywistości.
|
||
|
||
** Lingwistyka matematyczna
|
||
|
||
Przypomnijmy sobie definicję języka przyjętą w lingwistyce
|
||
matematycznej, w kontekście na przykład teorii automatów.
|
||
|
||
**Alfabetem** nazywamy skończony zbiór symboli.
|
||
|
||
**Łańcuchem** nad alfabetem $\Sigma$ nazywamy dowolny, skończony,
|
||
ciąg złożony z symboli z $\Sigma$
|
||
|
||
**Językiem** nazywamy dowolny, skończony bądź nieskończony, zbiór łańcuchów.
|
||
|
||
W tym formalnym ujęciu językami są na przykład następujące zbiory:
|
||
|
||
- $\{\mathit{poniedziałek},\mathit{wtorek},\mathit{środa},\mathit{czwartek},\mathit{piątek},\mathit{sobota},\mathit{niedziela}\}$
|
||
- $\{\mathit{ab},\mathit{abb},\mathit{abbb},\mathit{abbbb},\ldots\}$
|
||
|
||
To podejście, z jednej strony oczywiście nie do końca się pokrywa się z potocznym
|
||
rozumieniem słowa /język/, z drugiej kojarzy nam się z takimi
|
||
narzędziami informatyki jak wyrażenia regularne, automaty skończenie
|
||
stanowe czy gramatyki języków programowania.
|
||
|
||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
||
import regex as re
|
||
rx = re.compile(r'ab+')
|
||
|
||
rx.search('żabbba').group(0)
|
||
#+END_SRC
|
||
|
||
#+RESULTS:
|
||
:results:
|
||
abbb
|
||
:end:
|
||
|
||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
||
import rstr
|
||
|
||
rstr.xeger(r'ab+')
|
||
#+END_SRC
|
||
|
||
#+RESULTS:
|
||
:results:
|
||
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
|
||
:end:
|
||
|
||
** Ujęcie probabilistyczne
|
||
|
||
Na tym wykładzie przyjmiemy inną perspektywą, częściowo ciągłą, opartą
|
||
na probabilistyce. Język będziemy definiować poprzez **rozkład
|
||
prawdopodobieństwa**: sensownym wypowiedziom czy tekstom będziemy
|
||
przypisywać stosunkowe wysokie prawdopodobieństwo, „ułomnym” tekstom — niższe (być może zerowe).
|
||
|
||
Na ogół nie mamy jednak do czynienia z językiem jako takim tylko z
|
||
jego przybliżeniami, **modelami** (model może być lepszy lub gorszy,
|
||
ale przynajmniej powinien być użyteczny…). Formalnie $M$ nazywamy
|
||
modelem języka (nad skończonym alfabetem $Sigma$), jeśli dyskretny określa rozkład prawdopodobieństwa $P_M$:
|
||
|
||
$$P_M \colon \Sigma^{*} \rightarrow [0,1].$$
|
||
|
||
Rzecz jasna, skoro mamy do czynienia z rozkładem prawdopodobieństwa, to:
|
||
|
||
$$\sum_{\alpha \in \Sigma^{*}} P_M(\alpha) = 1$$
|
||
|
||
Jeśli $M$ ma być modelem języka polskiego, oczekiwalibyśmy, że dla
|
||
napisów:
|
||
|
||
- $z_1$ — /W tym stanie rzeczy pan Ignacy coraz częściej myślał o Wokulskim./
|
||
- $z_2$ — /Po wypełniony zbiornik pełny i należne kwotę, usłyszała w attendant/
|
||
- $z_3$ — /xxxxyźźźźźit backspace hoooooooooop x y z/
|
||
|
||
zachodzić będzie:
|
||
|
||
\[ P_M(z_1) > P_M(z_2) > P_M(z_3). \]
|
||
|
||
**Pytanie** Jakiej konkretnie wartości prawdopodobieństwa byśmy
|
||
spodziewali się dla zdania /Dzisiaj rano kupiłem w piekarni sześć
|
||
bułek/ dla sensownego modelu języka polskiego?
|
||
|
||
Moglibyśmy sprowadzić tę definicję języka do tej „dyskretnej”, tzn.
|
||
moglibyśmy przyjąć, że łańcuch $\alpha$ należy do języka wyznaczonego
|
||
przez model $M$, jeśli $P_M(\alpha) > 0$.
|
||
|
||
**Pytanie** Czy moglibyśmy w ten sposób język nieskończony? Czy może istnieć
|
||
dyskretny rozkład prawdopodobieństwa dla nieskończonego zbioru?
|
||
|
||
** Co jest symbolem?
|
||
|
||
Model języka daje rozkład prawdopodobieństwa nad zbiorem łańcuchów
|
||
opartym na skończonym alfabecie, tj. zbiorze symboli. W praktyce
|
||
alfabet nie musi być zgodny z potocznym czy językoznawczym rozumieniem
|
||
tego słowa. To znaczy alfabet może być zbiorem znaków (liter), ale
|
||
modelować język możemy też przyjmując inny typ symboli: sylaby,
|
||
morfemy (cząstki wyrazów) czy po prostu całe wyrazy.
|
||
|
||
Powinniśmy przy tym pamiętać, że, koniec końców, w pamięci komputera
|
||
wszelkiego rodzaju łańcuchy są zapisywane jako ciągi zer i jedynek — bitów.
|
||
Omówmy pokrótce techniczną stronę modelowania języka.
|
||
|
||
* Kodowanie znaków
|
||
|
||
** Cóż może być prostszego od pliku tekstowego?
|
||
|
||
#+BEGIN_EXAMPLE
|
||
Ala ma kota.
|
||
#+END_EXAMPLE
|
||
|
||
Komputer nic nie wie o literach.
|
||
|
||
… w rzeczywistości operuje tylko na liczbach …
|
||
|
||
… czy raczej na zerach i jedynkach …
|
||
|
||
… a tak naprawdę na ciągłym sygnale elektrycznym …
|
||
|
||
[[./01_Jezyk/digitalsignal.jpg]]
|
||
|
||
… zera i jedynki są w naszej głowie …
|
||
|
||
… co jest dziwne, /naprawdę/ dziwne …
|
||
|
||
… ale nikt normalny się tym nie przejmuje.
|
||
|
||
** Jak zakodować literę?
|
||
|
||
Zakodowanie pikseli składających się na kształtu (**glyfu**) litery A
|
||
/oczywiście/ nie jest dobrym pomysłem.
|
||
|
||
[[./01_Jezyk/raster.png]]
|
||
|
||
Nie, potrzebujemy /arbitralnego/ kodowania dla wszystkich możliwych
|
||
kształtów litery A (/w naszych głowach/): A, $\mathcal{A}$,
|
||
$\mathbb{A}$, $\mathfrak{A}$ powinny otrzymać ten sam kod, powiedzmy 65
|
||
(binarnie: 1000001).
|
||
|
||
** ASCII
|
||
|
||
ASCII to 7-bitowy (**nie** 8-bitowy!) system kodowania znaków.
|
||
|
||
#+BEGIN_SRC ipython :session mysession :exports both :results output drawer
|
||
for code in range(0, 128):
|
||
print(f'{code}: {chr(code)}')
|
||
#+END_SRC
|
||
|
||
#+RESULTS:
|
||
:results:
|
||
0: |