olski.rozstrzyganie¶
Warstwa za parserem: co rozstrzyga przyłączenie, którego gramatyka nie rozstrzyga.
Zalążek, a nie maszyna. Stoi tu po to, żeby kierunek dał się zmierzyć,
a nie żeby werdykt zmienić: rozstrzygnij bierze gotowy wynik rozbioru
i oddaje osobną odpowiedź obok niego, więc valid, ambiguous i
rejected znaczą po jej dopisaniu dokładnie to, co znaczyły.
Dlaczego akurat tak, wywodzi docs/disambiguation.md:
ranking wstawiony w werdykt myliłby się co trzecie albo co czwarte zdanie
w miejscu, w którym ten parser obiecuje prawdę o zdaniu.
Rozstrzygać jest przy tym co: nad Składnicą przyłączenie jest całą decyzją w większości zdań, które olski odrzuca za wieloznaczność (tamże).
Świadek jest jednostką tej warstwy. Każdy patrzy na jedno przyłączenie i albo wskazuje gospodarza wraz z powodem, albo milczy. Milczenie jest odpowiedzią pełnoprawną i jest odpowiedzią domyślną: świadek, który nie ma na czym stanąć, nie zgaduje. Powód wraca razem ze wskazaniem, żeby wskazanie dało się sprawdzić bez zaglądania do tabeli.
Świadkowie idą w kolejności, a kolejność jest kolejnością rodzaju dowodu.
Pierwszy odpowiadający wygrywa, więc dowód o tym tekście bije dowód o korpusie
wszędzie tam, gdzie oba mówią coś naraz. Pod kolejnością tą nie ma porównania
dwóch trafności, tylko hipoteza: dobre ujednoznacznianie jest odczytaniem tego,
co czytelnik ma przed sobą, a częstość nad cudzym korpusem odczytaniem nie jest,
choćby trafiała częściej (docs/disambiguation.md).
Dowód czyta Powtórzenie w akapicie, w którym zdanie stoi, Rama
w leksykonie walencyjnym, a Skłonność w banku drzew, którego nikt
z autorem tego tekstu nie uzgadniał. Rama stoi w środku, bo słownik mówi o polszczyźnie, a nie o tym
tekście ani o cudzym korpusie: powtórzenie ją bije, a ona bije częstość.
Świadek ramowy odpowiada schematem, a nie konkurencją między czytaniami.
Fraza, której rzeczownik żąda swoim schematem, przeczytana po stronie czasownika
łamie ten schemat, a nad Składnicą pozycję taką ma kilkaset z kilku tysięcy
wyrażeń spornych (docs/subset.md). Wskazuje sam rzeczownik i jest to połowa
kryterium, o którą pytano: po stronie czasownika ta sama rama trafia tyle, ile
rzut monetą, więc zostaje tam wetem, a nie wskazaniem (docs/rozstrzyganie.md).
Świadek kontekstowy odpowiada powtórzeniem, a nie znajomością rzeczy.
Powtórzenie szuka w akapicie miejsca, w którym ta sama fraza stała już
przy którymś z gospodarzy, i wtedy wskazuje tego gospodarza. Regułę szerszą —
rzecz raz wprowadzona jest znana, więc fraza dochodzi do czasownika — odrzucono
na kontrprzykładzie, który wraz z całym wywodem trzyma docs/rozstrzyganie.md.
Świadek statystyczny nazywa własną częstość pomyłek. Skłonność
liczy, jak często ta para przyimka i gospodarza przyłączała się w banku drzew
w tę stronę, i odpowiada dopiero powyżej progu wsparcia i progu przewagi.
Sam przyimek progu nie przechodzi i to jest zamierzone: leksykon przyimków
myli się nad tym korpusem co szóste wyrażenie, a nad najczęstszymi co trzecie
(docs/subset.md), czyli mniej więcej tak jak reguła „zawsze do rzeczownika”,
którą tamten dokument odrzucił jako konwencję.
Tabelę, którą ten świadek czyta, buduje z banku drzew harness/skłonności.py
i tam też ocenia się ją na połowie, której budowa nie widziała.
SKŁONNOŚCI = Path(__file__).parent / 'skłonności.txt'
module-attribute
¶
WSPARCIE = 2
module-attribute
¶
PRÓG = 0.85
module-attribute
¶
Licznik = dict[tuple[str, str, str], tuple[int, int]]
module-attribute
¶
CZASOWNIKOWE = frozenset({'fin', 'praet', 'impt', 'bedzie', 'inf', 'ppas', 'pact', 'winien', 'imps', 'pred'})
module-attribute
¶
IMIENNE = frozenset({'subst', 'ger', 'depr'})
module-attribute
¶
IMIENNE_LUB_NIEZNANE = IMIENNE | {'ign'}
module-attribute
¶
Kandydat = tuple[str, str, Iterable[str]]
module-attribute
¶
SŁOWO = re.compile('[\\w-]+', re.UNICODE)
module-attribute
¶
ZASIĘG_FRAZY = 3
module-attribute
¶
Kandydaci = Callable[[Sequence[str], int], Iterator[str]]
module-attribute
¶
PUSTE = Sąsiedztwo()
module-attribute
¶
Leksykon = Callable[[str, str], frozenset[str]]
module-attribute
¶
Rozstrzygnięcie
dataclass
¶
Wskazanie gospodarza wraz z tym, co je wydało.
Source code in olski/rozstrzyganie.py
119 120 121 122 123 124 125 126 127 128 129 130 131 | |
Świadek
¶
Bases: Protocol
Jedno źródło dowodu nad jednym przyłączeniem.
Sąsiedztwo dostaje każdy, także ten, który go nie czyta. Sygnatura jedna
znaczy, że kolejność świadków jest listą, a nie dwiema listami wołanymi
inaczej, i że świadek dopisany jutro nie rusza ani rozstrzygnij,
ani miejsca, z którego warstwa jest wołana.
Source code in olski/rozstrzyganie.py
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | |
nazwa
instance-attribute
¶
__call__(przyłączenie, sąsiedztwo)
¶
Wskazanie albo milczenie; milczenie jest odpowiedzią, a nie brakiem.
Source code in olski/rozstrzyganie.py
145 146 147 148 | |
Pytany
¶
Bases: Protocol
Świadek, którego dowodem jest przyimek i kandydaci na gospodarza.
Takich świadków jest dwóch — Rama i Skłonność —
a różni ich dowód, nie droga do niego,
więc drogą jest dla obu _wskaż,
a wybierz jest tym, czym się różnią.
Tym samym protokołem pyta ich oceń,
bo wypadek banku drzew przyłączeniem nie jest
i sygnatury Świadek nie ma czym wypełnić.
Source code in olski/rozstrzyganie.py
199 200 201 202 203 204 205 206 207 208 209 210 211 212 | |
wybierz(przyimek, kandydaci)
¶
Etykieta wskazanego gospodarza wraz z powodem; None znaczy milczenie.
Source code in olski/rozstrzyganie.py
211 212 | |
Dowód
dataclass
¶
Miejsce, w którym ta fraza stała już przy gospodarzu.
Lemat jest tym, którym gospodarz się dopasował, a zdanie tym, w którym fraza stała: powód wskazania cytuje oba, żeby dało się je sprawdzić bez wracania do tekstu.
Source code in olski/rozstrzyganie.py
325 326 327 328 329 330 331 332 333 334 335 | |
Sąsiedztwo
dataclass
¶
Zdania, które w tym akapicie stoją przed zdaniem rozstrzyganym.
Akapit jest granicą, a nie okno o stałej długości, i granicę tę bierzemy
stąd, skąd bierze ją druga strona: olski/skład/opowieść.py opuszcza
podmiot tylko wtedy, gdy o rzeczy była mowa w zdaniu obok, a akapit jest
tym, w czym „obok” się kończy. Nagłówek wypada z sąsiedztwa tą samą regułą,
bo stoi we własnym akapicie.
Wstecz, a nie w obie strony, bo czytelnik idzie od początku do końca i zdania, którego jeszcze nie przeczytał, do rozstrzygnięcia nie ma.
Source code in olski/rozstrzyganie.py
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 | |
zdania = ()
class-attribute
instance-attribute
¶
__init__(zdania=())
¶
przy_czym_stała(przyimek, rzeczownik, gospodarze, kandydaci=_łańcuch, kopuly=KOPULA)
¶
Ci z gospodarzy, przy których ta fraza w tym sąsiedztwie już stała.
Fraza jest tu przyimkiem i lematami swojego rzeczownika, a nie napisem,
bo w systemie i w systemach są tą samą frazą o tej samej rzeczy.
Przyimek też idzie przez lemat, bo z i ze są jednym słowem.
Rzeczownik idzie przez lemat imienny po obu stronach dopasowania,
bo lemat wszystkich czytań zlewa odsłownik z imiesłowem (IMIENNE).
Gospodarz idzie przez lematy wszystkich swoich czytań, bez zawężenia
do imiennych, bo gospodarzem bywa czasownik:
jest przetwarzany jest dowodem o gospodarzu przetwarzania.
Kandydatów na niego wyznacza Powtórzenie.kandydaci,
domyślnie _łańcuch, a nie jedna pozycja,
i gospodarz, którego wśród kandydatów nie ma, dowodu stąd nie dostaje.
Lematy, którymi dopasować się nie wolno, podaje Powtórzenie.kopuly,
i podstawia się je z tego samego powodu co kandydatów: żeby sonda
wypisała cenę tego warunku zamiast pozostawiać ją różnicy między commitami.
Source code in olski/rozstrzyganie.py
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 | |
Powtórzenie
dataclass
¶
Gospodarz, przy którym ta sama fraza stała już w podanym sąsiedztwie.
Dowodem jest powtórzenie, a nie znajomość rzeczy. Wystąpiła awaria
w systemie. mówi o Operator zgłosił awarię w systemie. to, czego nie
mówi żaden słownik ani żadna tabela: że w systemie jest w tym tekście
opisem awarii, a nie miejscem zgłoszenia, bo już raz nim było.
Jednostki sąsiedztwa świadek nie zna i nie nazywa jej w powodzie. Wyznacza ją
Sąsiedztwo, dziś akapitem, a sonda mierząca cenę tej granicy podaje
tu granicę inną, więc „w tym akapicie” byłoby tam nieprawdą.
Świadek milczy, kiedy fraza stała przy więcej niż jednym z gospodarzy, bo
dowód wskazujący dwie strony naraz nie wskazuje żadnej. Dwaj gospodarze
w jednym łańcuchu imiennym (_łańcuch) są tym samym wypadkiem:
sąsiedztwo powtarza wtedy sporne przyłączenie, zamiast je rozstrzygać.
Milczy też tam, gdzie jedynym dowodem jest powtórzenie przy kopuli
(kopuly), bo powtórzenie prawdziwe bywa puste. Kopula przy drugim
dowodzie wskazania nie blokuje: dwóch gospodarzy liczy się po odsianiu par
z takim lematem.
Source code in olski/rozstrzyganie.py
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 | |
nazwa = 'powtórzenie'
class-attribute
instance-attribute
¶
kandydaci = _łańcuch
class-attribute
instance-attribute
¶
kopuly = KOPULA
class-attribute
instance-attribute
¶
__init__(nazwa='powtórzenie', kandydaci=_łańcuch, kopuly=KOPULA)
¶
__call__(przyłączenie, sąsiedztwo)
¶
Source code in olski/rozstrzyganie.py
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 | |
Rama
dataclass
¶
Gospodarz imienny, którego rama żąda tego przyimka, gdy rama czasownika go nie żąda.
Dowodem jest słownik, a nie częstość, i tym ten świadek różni się
od Skłonność:
fraza, której schemat jednej ze stron żąda, przeczytana po drugiej stronie
łamie ten schemat,
więc wskazanie da się sprawdzić jednym wierszem olski/leksykon.txt,
a nie wolno go przenieść na inną parę słów.
Wskazuje sam rzeczownik i jest to połowa kryterium, a nie jego całość.
Obie strony wyceniono przed dopisaniem świadka (harness/rama.py)
i wypadły inaczej:
rama rzeczownika myli się rzadziej niż raz na dwadzieścia odpowiedzi,
a rama czasownika tyle, ile rzut monetą nad wyborem dwóch stron.
Powodem jest brak ramy, a nie rama:
czasownik żąda przyimków tak licznie,
że jego schemat pasuje do okolicznika, o którym nie mówi nic.
Rama czasownika zostaje przez to wetem.
Żądanie obustronne kończy się milczeniem,
bo schematu nie łamie wtedy żadne czytanie,
i to samo weto odbiera wskazanie tam, gdzie żąda sam czasownik.
Weto kosztuje zasięg — bez niego świadek odpowiada blisko dwa razy częściej —
a kupuje powód pod wskazaniem:
bez weta powód mówi o jednej stronie i milczy o drugiej.
Obie ceny wypisuje --oceń,
a wywód nad nimi trzyma docs/rozstrzyganie.md.
Milczy, gdy przyimka żąda rama więcej niż jednego gospodarza imiennego,
bo dowód wskazujący dwie strony naraz nie wskazuje żadnej —
tak samo jak Powtórzenie.
Source code in olski/rozstrzyganie.py
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 | |
nazwa = 'rama'
class-attribute
instance-attribute
¶
weto = True
class-attribute
instance-attribute
¶
leksykon = _leksykon
class-attribute
instance-attribute
¶
__init__(nazwa='rama', weto=True, leksykon=_leksykon)
¶
__call__(przyłączenie, sąsiedztwo=PUSTE)
¶
Source code in olski/rozstrzyganie.py
563 564 565 566 | |
wybierz(przyimek, kandydaci)
¶
Gospodarz imienny, którego rama żąda tego przyimka, wraz z powodem.
Jedno miejsce, w którym kryterium rozstrzyga, bo pytają o nie dwie strony,
tak samo jak przy Skłonność.wybierz:
werdykt, który ma formy gospodarzy,
i ocena, która ma lematy z banku drzew.
Przyimek idzie przez lemat, bo z i ze są jednym słowem,
a Walenty wypisuje w schemacie lemat.
Tą samą drogą idzie fraza u Sąsiedztwo.przy_czym_stała.
Drugi człon powodu należy do weta, więc wariant bez weta go nie wypisuje: powód ma mówić, co świadek sprawdził, a nie co sprawdza zwykle.
Source code in olski/rozstrzyganie.py
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 | |
Skłonność
dataclass
¶
Jak często para przyimka i gospodarza przyłączała się w banku drzew w tę stronę.
Kluczem jest lemat, a nie forma, bo o gwieździe i o gwiazdach mówią
o tej samej parze. Forma gospodarza ma jednak lematów kilka, a warstwa ta
stoi za parserem, który lematu nie wybrał (signature w olski/parse/czytanie.py),
więc pytanie idzie o każdy lemat formy naraz i liczniki się sumują. Podnosi
to wsparcie i rozmywa skłonność, a rozmycie kończy się milczeniem, czyli
stroną bezpieczną.
Source code in olski/rozstrzyganie.py
627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 | |
licznik
instance-attribute
¶
nazwa = 'skłonność'
class-attribute
instance-attribute
¶
wsparcie = WSPARCIE
class-attribute
instance-attribute
¶
próg = PRÓG
class-attribute
instance-attribute
¶
__init__(licznik, nazwa='skłonność', wsparcie=WSPARCIE, próg=PRÓG)
¶
z_pliku(path=SKŁONNOŚCI, **kwargs)
classmethod
¶
Source code in olski/rozstrzyganie.py
645 646 647 | |
__call__(przyłączenie, sąsiedztwo=PUSTE)
¶
Source code in olski/rozstrzyganie.py
649 650 651 652 | |
wybierz(przyimek, kandydaci)
¶
Kandydat o najwyższej skłonności wraz z powodem, albo None poniżej progów.
Jedno miejsce, w którym progi rozstrzygają, bo pytają o to dwie strony:
werdykt, który ma formy gospodarzy, i ocena, która ma lematy z banku drzew.
Druga kopia tej reguły kazałaby ocenie mierzyć innego świadka niż ten,
którego wypuszcza olski-check.
Liczniki sumują się po lematach formy (Kandydat), co podnosi
wsparcie i rozmywa skłonność, a rozmycie kończy się milczeniem.
Source code in olski/rozstrzyganie.py
654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 | |
rozstrzygnij(przyłączenia, świadkowie=None, sąsiedztwo=None)
¶
Po jednej odpowiedzi na przyłączenie, w kolejności, w jakiej je podano.
Przyłączenie, o którym nie wypowiedział się nikt, wraca takie, jakie weszło, a nie znika: warstwa ma powiedzieć, czego nie rozstrzygnęła, tak samo jak to, co rozstrzygnęła.
Sąsiedztwem domyślnym jest puste, czyli zdanie postawione samo. Odpowiada to
olski-check -c z jednym zdaniem i jest stroną bezpieczną: świadek
kontekstowy milczy wtedy zamiast czytać kontekst, którego nie dostał.
Source code in olski/rozstrzyganie.py
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | |
domyślni()
¶
Świadkowie w kolejności rodzaju dowodu, od tekstu autora do cudzego korpusu.
Source code in olski/rozstrzyganie.py
186 187 188 | |
sąsiedztwa(text)
¶
Po jednym sąsiedztwie na zdanie tekstu, w kolejności zdań.
Dokument buduje się tu drugi raz, obok tego, który zdania oddał gramatyce, i
nie jest to rozjazd: podział jest własnością tekstu, a nie miejsca, które o
niego pyta (Document w olski/document.py).
Source code in olski/rozstrzyganie.py
408 409 410 411 412 413 414 415 416 417 418 419 420 | |
strona(forma)
¶
Po której stronie wyboru stoi gospodarz o tej formie.
Jedno miejsce, bo pytają o to dwie strony:
świadek statystyczny, który pod tą nazwą bierze liczniki pary,
i pomiar, który jego wskazanie zestawia z cudzym drzewem
(harness/wskazania.py).
Druga kopia tej reguły kazałaby pomiarowi mierzyć innego świadka niż ten,
którego wypuszcza olski-check.
Source code in olski/rozstrzyganie.py
759 760 761 762 763 764 765 766 767 768 769 770 | |
czytaj(path=SKŁONNOŚCI)
¶
Tabela z pliku; brak pliku znaczy świadka, który milczy zawsze.
Wypisuje ten plik harness/skłonności.py, czyli druga strona granicy
pakietu: czyta go każdy, kto sprawdza własny tekst, a buduje ten, kto
olskiego zmienia.
Source code in olski/rozstrzyganie.py
779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 | |