Architektura: warstwy i typy na ich granicach¶
Ten dokument wylicza warstwy, przez które przechodzi zdanie w obu kierunkach. Nazywa przy tym typ wyniku, który jedna warstwa przekazuje dalej. Uzasadnień tu nie ma. Mechanikę toru gramatycznego opisuje parsowanie.md, a cenę tego toru opisuje design-notes.md. Poziomy kompilatora opisuje sklad.md. Cenę warstwy rozstrzygającej liczy disambiguation.md, a jej zalążek opisuje rozstrzyganie.md. O tym, co jest budowane, mówi roadmap.md.
Warstwy wyszły z pisania kodu, a nie z projektu spisanego przed nim. Granice między warstwami są granicami modułu albo granicami pakietu. Kolejność warstw wychodzi tu z importów. Jedno miejsce przeczy w niej temu, po co warstwa rozstrzygająca powstała.
Warstwa albo wnosi wieloznaczność, albo ją zdejmuje¶
Wieloznaczność porządkuje pięć warstw, bo o samą wieloznaczność wolno zapytać każdą warstwę osobno. Morfologia i składnia ją wnoszą: słownik daje czytania formie, a gramatyka daje je zdaniu. Znaczenie ją zdejmuje, bo łączy czytania, które mówią to samo. Tekst robi jedno i drugie, i to jest jedyna warstwa o dwóch kierunkach. Zdejmuje, bo odrzuca czytania sprzeczne z akapitem. Wnosi, bo zaimek wskazuje na rzecz nazwaną w zdaniu obok, więc wybór między dwiema takimi rzeczami powstaje dopiero na tym poziomie, a rozbiór zdania z zaimkiem nie ma go z czego zobaczyć (subset.md). Werdykt nie wnosi wieloznaczności i nie zdejmuje jej, bo jest wypowiedzią o czterech warstwach pod nim.
Podział ten nie pokrywa się z podziałem na tory. Każdy tor przechodzi wszystkie pięć warstw w przeciwnym kierunku. Dwie warstwy powtarzają się w obu torach.
Pięć warstw toru gramatycznego¶
| warstwa | gdzie | wejście | wyjście |
|---|---|---|---|
| morfologia | olski/morph.py, olski/projekt.py, olski/słownictwo.py, olski/segmentacja.py |
napis | Segment, czyli krawędzie grafu segmentacji |
| składnia | olski/grammar.py, olski/parse/ |
krawędzie grafu | Node, po jednym na czytanie |
| znaczenie | abstrahuj w olski/skład/rozbiór.py |
Node |
Odczyt, czyli drzewa Zdanie wraz z powodami |
| tekst | olski/rozstrzyganie.py, olski/odniesienia.py |
wybory wraz z Sąsiedztwo, zaimki wraz ze zdaniem obok |
Rozstrzygnięcie albo wybór z powrotem, Odniesienie przy zaimku |
| werdykt | Verdict w olski/werdykt.py |
Result |
status, role i to, co zostało otwarte |
Nazwy trzeciej i czwartej warstwy nie są nazwami mechanizmu, a poziomu, na którym pytanie o wieloznaczność przestaje mieć tę samą odpowiedź. Dwa czytania o różnym kształcie znaczą niekiedy to samo i o tym mówi warstwa trzecia, której kryterium tożsamości opisuje subset.md. Niekiedy dwa czytania o różnym znaczeniu rozstrzyga zdanie obok. Mówi o tym warstwa czwarta. Co takie zdanie rozstrzyga, wycenia disambiguation.md.
Warstwa rozstrzygająca wydaje zawężenie z powodem, a nie znaczenie¶
Typ tej warstwy jest trudniejszy od typów czterech warstw pozostałych,
bo tamte warstwy wydają strukturę, a ta warstwa wydaje odpowiedź o strukturze.
Sygnatura tej warstwy w olski/rozstrzyganie.py odpowiada wprost:
wybór wraca zamknięty wraz z powodem albo wraca otwarty.
Milczenie jest zatem wartością, a nie brakiem odpowiedzi,
i żąda tego od tej warstwy
hipoteza,
pod którą odpowiedź przychodzi z powodem albo nie przychodzi wcale.
Trzy własności wychodzą z takiego typu, a nie z rankingu.
Zbiór kandydatów wyłącznie maleje, więc świadkowie składają się w dowolnej kolejności, a świadek dopisany później nie przywraca kandydata zdjętego wcześniej.
Milczenie obejmuje wybór, a nie zdanie, więc jedno zdanie wraca rozstrzygnięte w jednym miejscu i otwarte w drugim.
Zbiór pusty mówiłby, że akapit przeczy każdemu czytaniu. Zdanie kłóciłoby się wtedy z tekstem, w którym je postawiono. Odpowiedzi tej ta warstwa nie wydaje, bo wybiera jednego gospodarza na przyłączenie i nie umie zwrócić pustki. Sprzeczność zdania z akapitem jest zatem wypowiedzią, dla której poziom tekstu ma przesłankę, a ten typ nie ma miejsca.
Werdykt liczy wyprowadzenia, bo powstaje pod dwiema warstwami, które liczą znaczenia¶
Werdykt powstaje z czytań gramatyki, czyli z wyjścia warstwy drugiej, a warstwy trzecia i czwarta pracują obok niego i werdyktu nie ruszają. „Zdanie wieloznaczne” znaczy wobec tego „ma kilka wyprowadzeń”, a nie „ma kilka znaczeń”. Tę różnicę mierzy przebieg nad korpusem audytowym. Pozycję dwuznaczną niesie tam większość zdań rejestru, a czytelnik nie waha się nad żadnym przeczytanym zdaniem (open-questions.md).
Od strony kodu tę samą różnicę bierze harness/znaczenia.py:
puszcza czytania zdania przez warstwę trzecią
i pyta, czy wracają z niej w tych samych drzewach.
Pytanie stawia się pod obiema morfologiami.
python3 -m harness.znaczenia Składnica-frazowa-180723/
python3 -m harness.znaczenia Składnica-frazowa-180723/ --morfologia live
Ten przebieg daje dwie odpowiedzi. Pierwsza odpowiedź jest o mianowniku, a nie o wieloznaczności. Pytanie to daje się postawić najwyżej kilku zdaniom na tysiąc spośród tych, które olski melduje jako wieloznaczne, bo nad resztą nie wraca ani jedno czytanie, i mówi to tak samo bank drzew, jak i proza tego repozytorium. Kategorią, której brakuje najczęściej, jest wyrażenie przyimkowe pod grupą imienną, czyli dokładnie to przyłączenie, o które w tym pytaniu chodzi. Warstwa trzecia zameldowanej wieloznaczności zatem nie zdejmuje, bo jej nie dosięga. Nad tymi zdaniami, nad którymi ją dosięga, wieloznaczność zostaje: czytania wracają w tych zdaniach w drzewach rozłącznych, i to bez wyjątku. Mówią to obie morfologie i mówi to proza, choć morfologia żywa daje pytaniu populację kilka razy większą niż złota.
Druga odpowiedź jest o tym, jak ten pomiar wolno postawić. Zdanie o jednym czytaniu ma w tej warstwie kilka drzew. Najczęściej ma cztery drzewa, bo napis milczy o relacji przyimka i o znaczniku tematu (po-wypisaniu.md), więc liczba drzew mierzy tę ciszę tak samo jak wieloznaczność. Rozdziela je dopiero porównanie zbiorów drzew czytania z czytaniem i na tym kryterium stoi ta sonda.
Kolejność warstw jest zatem tym miejscem,
w którym architektura przeczy powodowi, dla którego czwarta powstała.
Warstwa rozstrzygająca powstała po to, żeby odpowiedzieć ponad składnią.
Warstwa ta pyta jednak o Przyłączenie, czyli o obiekt składniowy.
Widać to na jednym świadku:
powtórzenie frazy przy kopuli nie dowodzi niczego o tym czasowniku,
więc świadek kontekstowy nad taką parą milczy
(rozstrzyganie.md).
Ruch, który z tego wychodzi, opisuje wpis o świadkach pytających o obiekt składniowy
w todo/rozstrzyganie.md.
Warstwa znacząca leży w pakiecie drugiego toru¶
Warstwa trzecia toru gramatycznego przechodzi z czytania parsera
na drzewo kategorii dziedziny.
Wypuszcza ją olski/skład/rozbiór.py, czyli moduł z pakietu toru składu,
i importuje z tego pakietu morfologię, opowieść, przyimki oraz składnię.
Wzięło się to z pytania, dla którego ta warstwa powstała:
obieg zamknięty pyta, czy z napisu wraca drzewo, które ten napis wypuściło.
O jedno znaczenie zdania obieg nie pyta.
Granica pakietu jest tu rozstrzygnięciem, a nie przypadkiem,
i pilnuje go tests/test_rozbiór.py.
Moduł czyta gramatykę, a gramatyka buduje się przy imporcie.
Po wpisaniu tego modułu do olski/skład/__init__.py
gramatykę budowałby każdy import samego kompilatora.
Parser przestałby wtedy być świadkiem obiegu i byłby jego zależnością
(design-notes.md).
Wołanie z toru gramatycznego przechodzi tę granicę w drugą stronę,
więc jest przestawieniem granicy pakietu, a nie przeniesieniem funkcji.
Warstwa ta jest przy tym cząstkowa, a cztery warstwy pozostałe nie są cząstkowe.
Ogranicza jej dziedzinę to, co olski/skład/składnia.py umie powiedzieć,
a gramatyka wyprowadza więcej.
Krotka krótsza od liczby czytań wraca stąd z dwóch różnych powodów:
dwa czytania zeszły się w jedno albo któreś czytanie nie mieści się w tym zapisie.
Powód pierwszy jest zdjętą wieloznacznością, a powód drugi jest dziurą w kompilatorze.
Rozdziela je Odczyt, a nie sama długość krotki:
powody opisuje słowami kandydata, który odpadł,
a kandydaci mówi, czy ten zapis w ogóle miał czym odpowiedzieć.
Werdykt liczony nad wyjściem tej warstwy odrzucałby wobec tego zdanie,
którego gramatyka nie odrzuca.
Tę cenę płaci przestawienie kolejności warstw.
Oba kierunki dzielą typ, a nie kod¶
Warstwy trzecia i czwarta są w obu kierunkach identyczne,
bo w obu kierunkach chodzi o te same dwa typy.
Typami tymi są Zdanie oraz Kontekst, a deklaruje je olski/skład/składnia.py.
Kontekst leży tam, a nie w olski/skład/opowieść.py,
bo niesie naraz to, co o zdaniu wie tekst, oraz to, co wie o nim drzewo nad nim.
Tekst wie czas zdarzenia i podmiot do pominięcia.
Dwa pola tekstowe wypełnia Akapit w olski/skład/opowieść.py,
a tożsamość, której lemat nie daje, niesie stojąca tam Postać.
Kategorie tego drzewa należą do dziedziny, a nie do polszczyzny.
Wywód za tym poziomem trzyma
sklad.md.
Co tekst wie ponad zdaniem, dowodzi tamten dokument osobno
(kategorie-zapisu.md).
| warstwa | gdzie | wejście | wyjście |
|---|---|---|---|
| tekst | olski/skład/opowieść.py |
Akapit, czyli ciąg drzew Zdanie |
Kontekst na każde zdanie, wraz z czasem i z tym, kogo wolno pominąć |
| znaczenie | olski/skład/składnia.py |
konstruktory, które pisze autor | Zdanie |
| składnia | kompiluj w olski/skład/__init__.py |
Zdanie |
formy w kolejności, wraz z policzoną zgodnością |
| morfologia | olski/skład/morfologia.py |
lemat wraz z żądanymi cechami | napis |
| przegląd | olski/skład/przegląd.py |
napis w swoim tekście | role, których czytelnik z napisu nie odzyska |
Warstwy pierwsza, druga i piąta nie powtarzają się w obu torach,
a różni je to, czego jeden z kierunków nie ma.
Kompilator nie ma wieloznaczności, bo z jednego drzewa wychodzi jeden napis.
Nie ma w nim czego rozstrzygać, a werdykt nie ma czego liczyć.
Przegląd pyta o inną rzecz niż werdykt:
nie pyta o liczbę czytań zdania, a o role, które to zdanie wypuściły.
Parser nie ma autora, więc nie wie, o kim mowa.
Czyta to z akapitu przez Sąsiedztwo, a nie dostaje odpowiedzi w Kontekst.
Zasadę tę zapisuje olski/skład/rozbiór.py:
oba kierunki mają wspólny typ, a nie wspólny kod.
Wymuszona symetria poniżej tych dwóch warstw
dałaby każdej stronie warstwę, której ta strona nie potrzebuje.
Wspólny typ kupuje przy tym wzorzec, którego bank drzew nie daje. Drzewo, z którego skład wypuszcza napis, zna czytanie, o które chodziło, więc obieg zamknięty mierzy warstwę czwartą bez anotatora i wycenia to disambiguation.md.