Przejdź do treści

olski.subset

Deklaracja podzbioru: co się w olskim wyprowadza, wypisane produkcjami.

Wykluczenia są dwojakie, bo produkcja rozstrzyga o zdaniu, a nie o formie. Produkcje mówią, jakie zdanie się wyprowadza, a czytanie odbiera formie warstwa morfologiczna (olski/segmentacja.py), zanim produkcja to czytanie zobaczy. Co gramatyka orzeka o jednym zdaniu, mówi olski/werdykt.py.

Gramatyka buduje się przy imporcie (GRAMMAR), więc kto pyta o sam lemat, sięga po olski/lematy.py.

Podział na moduły jest tu decyzją i idzie za tym, co dany moduł deklaruje. olski.subset.słowa trzyma słownictwo, którym produkcje są pisane: zbiory lematów i terminale, czyli to, co gramatyka bierze od morfologii. olski.subset.rama trzyma walencję i formy czasownika, które z niej wychodzą. olski.subset.deklaracja trzyma to, co stoi obok produkcji, a nie w nich: nazwy ról, rodziny czoła i listy, którymi werdykt schodzi po lesie. Produkcje same stoją w czterech modułach po gospodarzu — wypowiedzenie, zdanie, podrzędne i grupa — a build niżej jest jedynym miejscem, które je składa, bo kolejność ich wywołań rozstrzyga o kolejności czytań. Podkreślenie w nazwie znaczy tu prywatne dla pakietu, a nie dla modułu: poza niego wychodzą same nazwy wyliczone w __all__.

CIĄG_PRZYIMKOWY = 'ciąg_przyimkowy' module-attribute

CZĄSTKA_ZDANIA = 'cząstka_zdania' module-attribute

CZŁON_PRZYIMKOWY = 'człon_przyimkowy' module-attribute

DEKLARACJA = Deklaracja(role=('podmiot', 'dopełnienie', 'orzecznik', 'orzeczenie', ORZECZENIE_RZECZOWNIKOWE, ORZECZNIK_ŁĄCZNIKA, ORZECZENIE_BEZOSOBOWE, OKOLICZNIK_PRZYSŁÓWKOWY, CZĄSTKA_ZDANIA, OKOLICZNIK_NARZĘDNIKOWY, SPÓJNIK, OKOLICZNIK_ZDANIOWY, GRUPA_PYTAJNA, OKOLICZNIK_PYTAJNY, WTRĄCENIE, WTRĄCENIE_MYŚLNIKOWE, ELIPSA, DOPOWIEDZENIE, WYRAŻENIE_PRZYIMKOWE), przyłączane=(WYRAŻENIE_PRZYIMKOWE, OKOLICZNIK_PRZYSŁÓWKOWY, CZĄSTKA_ZDANIA, OKOLICZNIK_NARZĘDNIKOWY, SPÓJNIK, OKOLICZNIK_ZDANIOWY, WTRĄCENIE, WTRĄCENIE_MYŚLNIKOWE, ELIPSA), rozstrzygany=WYRAŻENIE_PRZYIMKOWE, gospodarze=(GRUPA_IMIENNA, 'grupa_przymiotnikowa', 'zdanie_składowe', 'fraza_bezokolicznikowa', FRAZA_BEZOKOLICZNIKOWA_OTWARTA, GRUPA_PYTAJNA, OKOLICZNIK_ZDANIOWY, *(rodzina.rdzeń for rodzina in RODZINY)), współrzędne=(GRUPA_IMIENNA, 'grupa_przymiotnikowa', 'zdanie'), składowe=('zdanie_składowe',), podrzędne=(*(symbol for rodzina in RODZINY for symbol in rodzina.opakowujące), 'zdanie_podrzędne', OKOLICZNIK_ZDANIOWY, WTRĄCENIE, WTRĄCENIE_MYŚLNIKOWE, ELIPSA, DOPOWIEDZENIE), obsada=Obsada(orzeczenia=('orzeczenie', ORZECZENIE_BEZOSOBOWE), podmiot='podmiot', przypadkowe=('dopełnienie',), własna_rama=('fraza_bezokolicznikowa', FRAZA_BEZOKOLICZNIKOWA_OTWARTA)), grupa_imienna=GRUPA_IMIENNA) module-attribute

GRUPA_PYTAJNA = 'grupa_pytajna' module-attribute

MIJANE = ('okoliczniki', OKOLICZNIK_PRZYSŁÓWKOWY, 'człon_imienny', 'człon_przymiotnikowy', 'wypełnienia', PARA_WYPEŁNIEŃ, 'zdanie', ELIPSA, WTRĄCENIE_MYŚLNIKOWE, 'zdanie_względne') module-attribute

NAZWY_SZKOLNE = {'podmiot': 'orzecznik', ORZECZNIK_ŁĄCZNIKA: 'podmiot'} module-attribute

OKOLICZNIK_NARZĘDNIKOWY = 'okolicznik_narzędnikowy' module-attribute

OKOLICZNIK_PRZYSŁÓWKOWY = 'okolicznik_przysłówkowy' module-attribute

OKOLICZNIK_ZDANIOWY = 'okolicznik_zdaniowy' module-attribute

ORZECZENIE_BEZOSOBOWE = 'orzeczenie_bezosobowe' module-attribute

ORZECZENIE_RZECZOWNIKOWE = 'orzeczenie_rzeczownikowe' module-attribute

ORZECZNIK_ŁĄCZNIKA = 'orzecznik_łącznika' module-attribute

PARA_WYPEŁNIEŃ = 'para_wypełnień' module-attribute

RODZINY = (Rodzina(rdzeń='rdzeń_względny', modyfikator='wyrażenie_przyimkowe_względne', czoła=('zaimek_względny', 'grupa_imienna_względna'), opakowujące=('zdanie_względne',)), Rodzina(rdzeń='rdzeń_względny_rzeczowny', modyfikator='wyrażenie_przyimkowe_względne_rzeczowne', czoła=('zaimek_względny_rzeczowny',), opakowujące=('zdanie_względne_rzeczowne', 'zdanie_względne_bez_poprzednika')), Rodzina(rdzeń='rdzeń_pytajny', modyfikator='wyrażenie_przyimkowe_pytajne', czoła=(GRUPA_PYTAJNA,), opakowujące=('zdanie_pytajne',))) module-attribute

WTRĄCENIE = 'wtrącenie' module-attribute

WTRĄCENIE_MYŚLNIKOWE = 'wtrącenie_myślnikowe' module-attribute

WYRAŻENIE_PRZYIMKOWE = 'wyrażenie_przyimkowe' module-attribute

RAMA_BEZ_BIERNIKA = RAMA_DOMYŚLNA - {'acc'} module-attribute

AGREE = {'case': V('c'), 'number': V('n'), 'gender': V('g')} module-attribute

BEZ_CZOŁA = 'żadne' module-attribute

CZĄSTKI = frozenset({'już', 'jeszcze', 'dopiero', 'także', 'również', 'nawet', 'zarazem', 'naprawdę', 'znowu', 'wreszcie', 'ponadto', 'jedynie', 'niemal', 'niespełna', 'zresztą', 'przynajmniej'}) module-attribute

PREDYKATYWY = frozenset({'można', 'trzeba', 'warto', 'wiadomo', 'widać', 'wolno', 'słychać', 'znać'}) module-attribute

PRZECINEK = word('interp', lemma=',') module-attribute

PRZYSŁÓWEK = word('adv', bez_lematu=PRZYSŁÓWKI_PYTAJNE | {PRZYSŁÓWEK_WZGLĘDNY}) module-attribute

PRZYSŁÓWEK_STOPNIA = word('adv', niesie='degree') module-attribute

SPÓJNIK_BEZ_PRZECINKA = word('conj', bez_lematu=SPÓJNIKI_PRZECINKOWE | {LEMAT_PRZECZENIA}) module-attribute

SPÓJNIK_PRZECINKOWY = word(SPÓJNIKOWE, lemma=SPÓJNIKI_PRZECINKOWE) module-attribute

SPÓJNIK_PYTAJNY = 'czy' module-attribute

SPÓJNIKI_OKOLICZNIKOWE = SPÓJNIKI_WYSUWANE | SPÓJNIKI_PO_ZDANIU module-attribute

SPÓJNIKI_PRZECINKOWE = frozenset({'ale', 'a', 'lecz', 'natomiast', 'więc', 'zatem', 'toteż', 'czyli'}) module-attribute

SPÓJNIKI_SKORELOWANE = frozenset({'ani'}) module-attribute

SPÓJNIKOWE = frozenset({'conj', 'comp'}) module-attribute

ZAIMEK_RZECZOWNY = frozenset({'to', 'tamto', 'owo', 'kto', 'któż', 'ktoś', 'ktokolwiek', 'co', 'cóż', 'coś', 'cokolwiek', 'nikt', 'nic', 'wszystko'}) module-attribute

GRAMMAR = build() module-attribute

__all__ = ['AGREE', 'BEZ_CZOŁA', 'CIĄG_PRZYIMKOWY', 'CZĄSTKA_ZDANIA', 'CZĄSTKI', 'CZŁON_PRZYIMKOWY', 'DEKLARACJA', 'GRAMMAR', 'GRUPA_PYTAJNA', 'MIJANE', 'OKOLICZNIK_NARZĘDNIKOWY', 'OKOLICZNIK_PRZYSŁÓWKOWY', 'OKOLICZNIK_ZDANIOWY', 'ORZECZENIE_BEZOSOBOWE', 'ORZECZENIE_RZECZOWNIKOWE', 'NAZWY_SZKOLNE', 'ORZECZNIK_ŁĄCZNIKA', 'PARA_WYPEŁNIEŃ', 'PREDYKATYWY', 'PRZECINEK', 'PRZYSŁÓWEK', 'PRZYSŁÓWEK_STOPNIA', 'RAMA_BEZ_BIERNIKA', 'RODZINY', 'SPÓJNIKI_OKOLICZNIKOWE', 'SPÓJNIKI_PRZECINKOWE', 'SPÓJNIKI_SKORELOWANE', 'SPÓJNIKOWE', 'SPÓJNIK_BEZ_PRZECINKA', 'SPÓJNIK_PRZECINKOWY', 'SPÓJNIK_PYTAJNY', 'WALENCJA', 'WALENCJA_ZWROTNA', 'WTRĄCENIE', 'WTRĄCENIE_MYŚLNIKOWE', 'WYRAŻENIE_PRZYIMKOWE', 'ZAIMEK_RZECZOWNY', 'build'] module-attribute

build()

Gramatyka olskiego, złożona z sekcji rozpisanych po modułach, po jednej na gospodarza.

Kolejność wywołań jest kolejnością wpisywania produkcji, a tę widać po czytaniach: rozstrzyga o nich koszt, a przy równym koszcie właśnie ona (wyprowadzenia w olski/parse/las.py). Sekcja przestawiona zmienia więc czytania, a nie sam układ pakietu, i dlatego jej moduł tego nie rusza: kolejność stoi tutaj, w jednym miejscu, i dowodzi jej odcisk samej gramatyki (harness/odcisk.py).

Source code in olski/subset/__init__.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
def build() -> Grammar:
    """Gramatyka olskiego, złożona z sekcji rozpisanych po modułach, po jednej na gospodarza.

    Kolejność wywołań jest kolejnością wpisywania produkcji, a tę widać po
    czytaniach: rozstrzyga o nich koszt, a przy równym koszcie właśnie ona
    (``wyprowadzenia`` w ``olski/parse/las.py``). Sekcja przestawiona zmienia więc
    czytania, a nie sam układ pakietu, i dlatego jej moduł tego nie rusza:
    kolejność stoi tutaj, w jednym miejscu, i dowodzi jej odcisk samej gramatyki
    (``harness/odcisk.py``).
    """
    grammar = Grammar(start="wypowiedzenie", nie_wypuszczane=NIE_WYPUSZCZANE)

    # Symbole, które jedna sekcja wpisuje, a czyta je druga, wraz z kanałem
    # cech, na którym stoją; nazwę czytaną w jednej sekcji deklaruje ta sekcja
    # u siebie. Zmienna cechy jest zakresu produkcji, więc dwie produkcje biorące
    # ten sam obiekt mówią dalej każda o swojej zgodności.
    #
    # Cechę, której żąda się tu od głowy, konstytuent niesie w górę sam
    # (``olski/grammar.py``).
    orzecznikowy = nt("przymiotnik_orzecznikowy", **AGREE)
    przydawka = nt("przydawka", **AGREE)
    przydawka_nierozdzielna = nt("przydawka", rozdzielna=BEZ_ROZDZIELNEJ, **AGREE)
    cechy_zdania = {"number": V("n"), "gender": V("g"), "person": V("p"), "tryb": V("t")}
    okoliczniki = nt("okoliczniki")

    # Walencja jest wspólną zmienną, tak jak zgodność: czasownik wypuszcza z
    # siebie swoją ramę, dopełnienie mówi, którą pozycję ramy zajmuje, a
    # unifikacja przecina jedno z drugim. Czasownik, przy którym nic nie stoi,
    # ramy nie ogłasza nikomu i stoi tu bez niej.
    #
    # Negacja jedzie tą samą drogą i rządzi tym samym: przypadkiem grupy, którą
    # czasownik bierze. Czasownik ogłasza, czy przeczy, dopełnienie mówi, przy
    # jakim przeczeniu stoi. Zgodnością to nie jest — rządzenie nie jest ani
    # symetryczne, ani lokalne — więc dlaczego kanał cech ją mimo to bierze,
    # wywodzi docs/parsowanie.md#cechy-biorą-to-co-zawęża-jest-symetryczne-i-lokalne.
    cechy_ramy = {**cechy_zdania, "valency": V("w"), "negacja": V("z"), "druga": V("d")}
    czasownik_ramy = nt("orzeczenie", **cechy_ramy)
    # Ten sam czasownik wraz z cechą, którą stawia mu wypełnienie
    # (:data:`BEZ_KOPULI`). Węzeł jest osobny, bo cechy tej żąda jedno ciało
    # z kilku, w których tamten stoi, a wypisana w nim wszędzie byłaby zmienną,
    # której w pozostałych nikt nie wiąże.
    czasownik_kopuli = nt("orzeczenie", **cechy_ramy, kopula=V("k"))
    dopełnienie = nt("dopełnienie", valency=V("w"), negacja=V("z"), czoło=BEZ_CZOŁA)
    orzecznik_ramy = nt(
        "orzecznik", number=V("n"), gender=V("g"), valency=V("w"), czoło=BEZ_CZOŁA
    )

    # Zdanie deklaruje córki, a kolejność, w jakiej one stoją, deklaruje osobno
    # warunek precedencji nad nimi; rozwinięcie składa jedno z drugim przed
    # rozbiorem (:mod:`olski.precedencja`). Tablica Earleya dostaje przez to
    # ciała wypisane, bo rozwinięcie kończy się przed nią, a rodzina mnożąca się
    # przez szyk i przez miejsca na okolicznik ma sześć deklaracji na kilkadziesiąt
    # ciał.
    #
    # Miejsce na okolicznik wylicza to samo rozwinięcie i przez to nie ma go jak
    # zapomnieć w jednym z ciał: przyłączenie wyrażenia przyimkowego olski oddaje
    # czytelnikowi, więc każde miejsce, w którym grupa imienna takie wyrażenie
    # bierze, musi umieć oddać je też zdaniu. Pozycji brakującej nie widać po
    # zdaniu odrzuconym, tylko po przyjętym: wychodzi ono jednym czytaniem, bo
    # drugie nie miało gdzie się wyprowadzić. docs/subset.md trzyma wywód i cenę.
    #
    # Osoba bierze się z podmiotu, a nie stoi na trzeciej, i to jest to, co
    # wpuszcza zaimek pierwszej i drugiej osoby. Grupa imienna z rzeczownikiem w
    # głowie mówi person=ter sama, więc rozkaźnik dalej takiej nie weźmie.
    zdanie = Rozwinięcie(grammar, okolicznik=okoliczniki, własny_okolicznik=("grupa_orzeczenia",))

    _przydawka(grammar)
    _interpunkcja_wypowiedzenia(grammar)
    _koordynacja_zdań(grammar)
    _szyki_zdania_składowego(
        grammar, zdanie, cechy_zdania, czasownik_ramy, dopełnienie, okoliczniki
    )
    _dostawki_zdania(grammar)
    _podmiot(grammar)
    _dopełnienie(grammar)
    _grupa_orzeczenia(grammar, cechy_zdania, czasownik_ramy, czasownik_kopuli, dopełnienie)
    _zdania_podrzędne(grammar)
    _wypełnienia(grammar, okoliczniki, dopełnienie, orzecznik_ramy)
    _lista_okoliczników(grammar, okoliczniki)
    _orzecznik(grammar)
    _orzeczenie(grammar, okoliczniki)
    _grupa_imienna(grammar, przydawka, przydawka_nierozdzielna)
    _grupa_przymiotnikowa(grammar, orzecznikowy)
    _okoliczniki_leksykalne(grammar)
    _rodziny_czoła(grammar, zdanie)

    return grammar