Przejdź do treści

olski.skład.przegląd

Czy czytelnik odzyska z tekstu to drzewo, które ten tekst wypuściło.

Drzewo jest jednoznaczne z definicji, a napis, który z niego wychodzi, nie musi być, i te dwie rzeczy rozchodzą się cicho: zgodność jest policzona, rama sprawdzona, forma wzięta ze słownika, a mimo to Koszt szynki przewyższa koszt bułki. nie mówi, co tu jest większe. Ten moduł jest miejscem, w którym takie zdanie się zgłasza, a dlaczego zgłasza, zamiast się nie skompilować, rozstrzyga docs/po-wypisaniu.md wraz z resztą postawy tego przeglądu.

Liczone jest to z form, które skład sam wypisał, i nic poza nimi nie wchodzi. Rola wraca czytelnikowi z formy i z czasownika, więc pyta się o jedno i o drugie: czy rola wypisana tutaj stoi w formie, którą czyta się także w tej drugiej pozycji, i czy czasownik tych dwóch ról nie rozróżnia. Obie odpowiedzi wychodzą z linearyzacji, bo obie są formami, a form skład nie zgaduje: wypisuje rolę drugi raz i porównuje napisy.

Wypisuje je w kontekście, którym linearyzacja to zdanie składała, bo to on rozstrzyga, jakim napisem ono wyszło: podmiot bywa opuszczony, a rzecz wskazana wychodzi zaimkiem. Zdanie mierzone jako stojące samo jest przez to innym zdaniem niż to, które autor dostał, i te dwa mają różne role widoczne.

Jest to ten sam pomiar, który stoi w pomijalny w olski/skład/składnia.py. Tamten pyta, czy podmiot wróci czytelnikowi z formy czasownika, i liczy to tak, że wypisuje formę dla każdego, kto mógłby ją wyciągnąć. Tutaj pytanie jest o rolę zamiast o podmiot, a sposób ten sam, i dlatego kolizja nie jest tu wyjątkiem: obie rzeczy są własnością napisu, a nie błędem drzewa, które ten napis wypuściło.

Wieloznaczność jest przy tym przekleństwem parsera, a nie generatora. harness/wieloznaczność.py liczy tę samą klasę nad cudzym tekstem i musi zgadywać z form to, co tutaj wiadomo z drzewa: gdzie kończy się grupa imienna, co jest uczestnikiem, a co stoi pod przyimkiem, i przy którym orzeczeniu para stanęła. Sam nazywa przez to swoją liczbę górnym oszacowaniem. Tutaj żadne z tych pytań się nie stawia, bo uczestnicy są w drzewie wymienieni, a orzeczenie jest w nim węzłem. Poprawiło to raz tamten pomiar, o czym mówi w nim _obojętny.

Klasa jest tu jedna z dwóch, które ta wieloznaczność ma nad polszczyzną. Przyłączenia ten przegląd nie zgłasza, bo o wyrażeniu przyimkowym drzewo mówi to, czego przy rolach nie mówi: okolicznik dochodzi w nim do zdarzenia zawsze, więc każde miejsce byłoby trafieniem, a raport zgłaszający każde zdanie z przyimkiem nie oddziela niczego od niczego. Czym to zawęzić, jest osobnym pytaniem.

Kolizja dataclass

Dwie role jednego zdarzenia, których czytelnik od siebie nie odróżni.

Klasy to zgłoszenie nie niesie, bo klasa jest jedna, a pole o jednej wartości mówi, że druga zaraz dojdzie, i mówi to niezależnie od tego, czy dojdzie.

Source code in olski/skład/przegląd.py
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
@dataclass(frozen=True)
class Kolizja:
    """Dwie role jednego zdarzenia, których czytelnik od siebie nie odróżni.

    Klasy to zgłoszenie nie niesie, bo klasa jest jedna,
    a pole o jednej wartości mówi, że druga zaraz dojdzie,
    i mówi to niezależnie od tego, czy dojdzie.
    """

    #: Napisy, którymi te role w tekście stanęły, w kolejności, w której stoją.
    #: Bez nich zgłoszenie nie ma czym się wytłumaczyć,
    #: bo zdanie o dwóch zdarzeniach niesie dwa zarzuty naraz.
    #: Napis jest jeden tam, gdzie podmiot z tekstu wypadł,
    #: bo forma, której nie widać, nie jest tym, na co autor ma spojrzeć.
    formy: tuple[str, ...]

    def opisz(self) -> str:
        """Zdanie, które autor ma przeczytać, wraz z tym, na czym zarzut stoi."""
        if len(self.formy) == 1:
            return (
                f"„{self.formy[0]}” stoi w formie, którą polszczyzna czyta "
                "i w jednej roli, i w drugiej, a podmiotu to zdanie nie wypisuje, "
                "więc czytelnik nie ma z czego odzyskać, która rola jest którą"
            )
        stoją = " i ".join(f"„{forma}”" for forma in self.formy)
        return (
            f"{stoją} stoją w formach, które polszczyzna czyta i w jednej roli, "
            "i w drugiej, a czasownik ich nie rozróżnia, "
            "więc zdanie czyta się i jako SVO, i jako OVS"
        )

formy instance-attribute

__init__(formy)

opisz()

Zdanie, które autor ma przeczytać, wraz z tym, na czym zarzut stoi.

Source code in olski/skład/przegląd.py
74
75
76
77
78
79
80
81
82
83
84
85
86
87
def opisz(self) -> str:
    """Zdanie, które autor ma przeczytać, wraz z tym, na czym zarzut stoi."""
    if len(self.formy) == 1:
        return (
            f"„{self.formy[0]}” stoi w formie, którą polszczyzna czyta "
            "i w jednej roli, i w drugiej, a podmiotu to zdanie nie wypisuje, "
            "więc czytelnik nie ma z czego odzyskać, która rola jest którą"
        )
    stoją = " i ".join(f"„{forma}”" for forma in self.formy)
    return (
        f"{stoją} stoją w formach, które polszczyzna czyta i w jednej roli, "
        "i w drugiej, a czasownik ich nie rozróżnia, "
        "więc zdanie czyta się i jako SVO, i jako OVS"
    )

przejrzyj(drzewo, kontekst=TERAZ)

Kolizje w zdaniu, które z tego drzewa wychodzi, po jednej na orzeczenie.

Zestawiany jest podmiot z każdym uczestnikiem obok niego, bo wymienić się mogą tylko te dwie role: pozycji podmiotu jest jedna, więc dwa dopełnienia przy jednym czasowniku o nią nie konkurują.

Kontekst każde zdanie dostaje własny i bierze go z konteksty, czyli stamtąd, skąd bierze go linearyzacja. Bez tego przegląd mierzyłby zdanie wypisane samo, a mierzyć ma to, co wyszło: podmiot bywa opuszczony, a rzecz wskazana wychodzi zaimkiem, który przypadek pokazuje.

Source code in olski/skład/przegląd.py
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
def przejrzyj(drzewo: Zdanie, kontekst: Kontekst = TERAZ) -> list[Kolizja]:
    """Kolizje w zdaniu, które z tego drzewa wychodzi, po jednej na orzeczenie.

    Zestawiany jest podmiot z każdym uczestnikiem obok niego,
    bo wymienić się mogą tylko te dwie role: pozycji podmiotu jest jedna,
    więc dwa dopełnienia przy jednym czasowniku o nią nie konkurują.

    Kontekst każde zdanie dostaje własny i bierze go z ``konteksty``,
    czyli stamtąd, skąd bierze go linearyzacja.
    Bez tego przegląd mierzyłby zdanie wypisane samo,
    a mierzyć ma to, co wyszło: podmiot bywa opuszczony,
    a rzecz wskazana wychodzi zaimkiem, który przypadek pokazuje.
    """
    kolizje = []
    for zdanie, jego in drzewo.konteksty(kontekst):
        (podmiot, _), *reszta = zdanie.uczestnicy(jego)
        #  Krotka pusta tam, gdzie podmiot z tekstu wypadł, bo zgłoszenie wymienia
        #  formy, które autor w napisie zobaczy, a tej nie zobaczy żadnej.
        wypisany = (wypisz(podmiot, "nom", jego).napis,) if jego.wypisuje(podmiot) else ()
        for rola, przypadek in reszta:
            if not _rozróżnia(zdanie, podmiot, rola, przypadek, jego):
                kolizje.append(Kolizja((*wypisany, wypisz(rola, przypadek, jego).napis)))
    return kolizje