Liczebnik polski
Wyrażenia liczbowe – narzędzia programistyczne (Java) PlNumbers.jar
Postać wyrażenia z liczebnikiem – nawet wtedy, gdy jest on zapisany cyframi – jest w polszczyźnie uzależniona od wartości tego liczebnika.
Np. powiemy:
  • do zakończenia pozostało pięć lat i trzy miesiące,
lecz
  • do zakończenia pozostały dwa lata i sześć miesięcy,
  • do zakończenia pozostał (jeden) rok i (jeden) miesiąc.
Widzimy, że liczebnik wpływa na formę rzeczownika (rok) i czasownika (pozostać). Więcej na ten temat możesz przeczytać na stronie Odmiana i składanie liczebników głównych i zbiorowych.
Tę zmienność powinny brać pod uwagę aplikacje, które dynamicznie generują tekst takich wyrażeń liczbowych. Użyteczna może być tu moja biblioteka PlNumbers.jar (dla Javy), która zawiera klasy z metodami generującymi takie wyrażenia. Bibliotekę tę udostępniam bezpłatnie (kontakt: Z.Bronk[at]ai[kropka]pl).

Zapis słowny liczebników (głównych i zbiorowych)

Zapis słowny podanej liczby zwracają metody klasy PlNumberFlexer (pakiet pl.zbronk.nlp.num):
  • String getFlexStringForNumber(Case casec,Gender gender, long n, [Preferences prefs]) – dla wskazanej liczby (n) oraz kategorii przypadka (casec) i rodzaju (gender) zwraca tekst będący zapisem słownym liczby. Fakultatywnie mogą być wskazane preferencje (prefs; patrz niżej).
  • ArrayList<FlexForm> getFlexFormsForNumber(Case casec,Gender gender, long n, [Preferences prefs]) – dla wskazanej liczby (n) oraz kategorii przypadka (casec) i rodzaju (gender) zwraca listę form fleksyjnych składowych liczebników. Fakultatywnie mogą być wskazane preferencje (prefs).
  • ArrayList<ArrayList<FlexForm>> getFlexFormsForNumberWithVariants(Case casec,Gender gender, long n) – dla wskazanej liczby (n) oraz kategorii przypadka (casec) i rodzaju (gender) zwraca listę wariantów form fleksyjnych składowych liczebników.
Klasy Case, Gender, Preferences... opisane są w sekcji Model gramatyczny.
Przykład 1. Użycie metody getFlexStringForNumber
Podaj liczbę (zapis cyfrowy)
Wynik (dla rodzaju żeńskiego w mianowniku): sto dwadzieścia trzy
Przykładowy kod w Javie:
import pl.zbronk.nlp.num.PlNumberFlexer;
import pl.zbronk.nlp.gr.GrammarCategory;
...
String result = PlNumberFlexer.getFlexStringForNumber(GrammarCategory.Case.nom, GrammarCategory.Gender.f, n);

Zapis słowny liczebników porządkowych (przymiotników odliczebnikowych)

Zapis słowny liczebnika porządkowego zwraca metoda klasy PlNumberFlexer (pakiet pl.zbronk.nlp.num):
  • String getOrdinalFlexStringForNumber (Case casec,Gender gender,Numberc numberc, long n ) – dla wskazanej liczby (n) oraz kategorii przypadka (casec), rodzaju (gender) i kategorii liczby (numberc) zwraca tekst będący zapisem słownym liczby.
Przykład 2. Użycie metody getOrdinalFlexStringForNumber
Podaj rok (zapis cyfrowy)
Wynik (przykład z narzędnikiem): (przed) dwa tysiące dwudziestym pierwszym (rokiem)
Przykładowy kod w Javie:
import pl.zbronk.nlp.num.PlNumberFlexer;
import pl.zbronk.nlp.gr.GrammarCategory;
...
String result = PlNumberFlexer.getOrdinalFlexStringForNumber(GrammarCategory.Case.inst, GrammarCategory.Gender.m3, GrammarCategory.Numberc.sg, n);

Wyrażenie liczbowe

Klasa PlNumPhrasesBuilder (pakiet pl.zbronk.nlp.num) dostarcza metod służących do budowy wyrażeń z liczebnikami:
  • ArrayList<String> getNumPhrasesNumFormsSubstForms (long n,Case casec,Flexem flexem,[PlNumberFlexer.Preferences prefs]) – dla wskazanej liczby (n) oraz kategorii przypadka (casec) i fleksemu rzeczownikowego (flexem) zwraca listę wyrażeń liczbowo-rzeczownikowych. Składnik liczbowy ma postać słowną.
  • String getNumPhrase1NumFormSubstForm (long n,Case casec,Flexem flexem,[PlNumberFlexer.Preferences prefs]) – dla wskazanej liczby (n) oraz kategorii przypadka (casec) i fleksemu rzeczownikowego (flexem) zwraca jedno wyrażenie liczbowo-rzeczownikowe. Składnik liczbowy ma postać słowną.
  • ArrayList<String> getNumPhrasesDigitsSubstForms (long n,Case casec,Flexem flexem) – dla wskazanej liczby (n) oraz kategorii przypadka (casec) i fleksemu rzeczownikowego (flexem) zwraca listę wyrażeń liczbowo-rzeczownikowych. Składnik liczbowy ma postać cyfrową.
  • String getNumPhrase1DigitsSubstForm (long n,Case casec,Flexem flexem) – dla wskazanej liczby (n) oraz kategorii przypadka (casec) i fleksemu rzeczownikowego (flexem) zwraca jedno wyrażenie liczbowo-rzeczownikowe. Składnik liczbowy ma postać cyfrową.
  • Akomod getAkomodForSubst(long n,Case casec,Gender gender) – dla wskazanej liczby (n) oraz gramatycznego rodzaju (gender) i przypadka (casec) wyrażenia liczbowo-rzeczownikowego zwraca akomodację (rekcję, rząd) względem składnika rzeczownikowego.
  • ArrayList<Case> getCasesForSubst(long n,Case casec,Gender gender) – dla wskazanej liczby (n) oraz gramatycznego rodzaju (gender) i przypadka (casec) wyrażenia liczbowo-rzeczownikowego zwraca możliwe przypadki składnika rzeczownikowego.
  • ArrayList<String> getSubstForms(long n,Case casec,Flexem flexem) – dla wskazanej liczby (n) oraz przypadka (casec) wyrażenia liczbowo-rzeczownikowego, dla wskazanego fleksemu (flexem) składnika rzeczownikowego, zwraca jego formy fleksyjne.
  • ArrayList<String> getPraetForms(long n,Flexem pflexem,Gender gender) – dla wskazanej liczby (n) w wyrażeniu z podmiotem liczbowo-rzeczownikowym wskazanego rodzaju (gender) ze wskazanym fleksemem orzeczenia w czasie przeszłym (pflexem), zwraca formy fleksyjne tego orzeczenia.
  • String getPraet1Form(long n,Flexem pflexem,Gender gender) – dla wskazanej liczby (n) w wyrażeniu z podmiotem liczbowo-rzeczownikowym wskazanego rodzaju (gender) ze wskazanym fleksemem orzeczenia w czasie przeszłym (pflexem), zwraca formę fleksyjną tego orzeczenia.
  • String getPraet1Form(long n,Flexem pflexem,Flexem sflexem) – dla wskazanej liczby (n) w wyrażeniu z podmiotem liczbowo-rzeczownikowym rodzaju właściwego dla wskazanego fleksemu składnika rzeczownikowego (sflexem) ze wskazanym fleksemem orzeczenia w czasie przeszłym (pflexem), zwraca formę fleksyjną tego orzeczenia.
Przykład 3. Użycie metod getNumPhrase1NumFormSubstForm i getNumPhrase1DigitsSubstForm
Podaj liczbę osób (zapis cyfrowy):
Wynik (biernik wyrażenia): (widziano) cztery osoby
(widziano) 4 osoby
Porównaj wyniki np. dla liczb: 1, 2, 5, 32.
Przykładowy kod w Javie:
import pl.zbronk.nlp.num.PlNumPhrasesBuilder;
import pl.zbronk.nlp.gr.GrammarCategory;
import pl.zbronk.nlp.gr.FlexemClass;
import pl.zbronk.nlp.gr.FlexDictionary;
import pl.zbronk.nlp.gr.Flexem;
import pl.zbronk.nlp.num.examples.ExamSubstDict;
...
FlexDictionary substDict = new ExamSubstDict();
...
Flexem osoba_subst = substDict.getFlexems("osoba").get(0);
...
String result1 = PlNumPhrasesBuilder.getNumPhrase1NumFormSubstForm(n,GrammarCategory.Case.acc, osoba_subst);
String result2 = PlNumPhrasesBuilder.getNumPhrase1DigitsSubstForm(n,GrammarCategory.Case.acc, osoba_subst);
Przykład 4. Użycie metody getPraetForm1 oraz getNumPhrase1NumFormSubstForm i getNumPhrase1DigitsSubstForm
Podaj liczbę miesięcy (zapis cyfrowy):
Wynikowe wyrażenie: pozostało pięć lat i trzy miesiące
pozostało 5 lat i 3 miesiące
Przykładowy kod w Javie:
import ...
...
FlexDictionary substDict = new ExamSubstDict();
FlexDictionary verbDict = new ExamVerbDict();
...
Flexem rok_subst = substDict.getFlexems("rok").get(0);
Flexem miesiąc_subst = substDict.getFlexems("miesiąc").get(0);
Flexem pozostać_praet = verbDict.getFlexems("pozostać", FlexemClass.praet).get(0);
...
int lat = n / 12;
int mcy = n % 12;
String result1 = PlNumPhrasesBuilder.getPraetForm1(lat, pozostać_praet, rok_subst) + " " + PlNumPhrasesBuilder.getNumPhrase1NumFormSubstForm(lat, GrammarCategory.Case.nom, rok_subst) + " i " + PlNumPhrasesBuilder.getNumPhrase1NumFormSubstForm(mcy, GrammarCategory.Case.nom, miesiąc_subst);
String result2 = PlNumPhrasesBuilder.getPraetForm1(lat, pozostać_praet, rok_subst) + " " + PlNumPhrasesBuilder.getNumPhrase1DigitsSubstForm(lat, GrammarCategory.Case.nom, rok_subst) + " i " + PlNumPhrasesBuilder.getNumPhrase1DigitsSubstForm(mcy, GrammarCategory.Case.nom, miesiąc_subst);

Model gramatyczny

Fleksemy i ich klasy

Fleksem to zbiór form fleksyjnych tej samej klasy gramatycznej (w przybliżeniu części mowy) ze wspólnym lematem (hasłem, formą podstawową).
Fleksemem jest np. zbiór form czasu przeszłego czasownika ‹pozostać› (pozostał, pozostała, pozostało, pozostali, pozostały...), lecz zbiór osobowych form nieprzeszłych tego samego czasownika (pozostanie, pozostaną, pozostanę...) jest już innym fleksemem (choć z tym samym lematem ‹pozostać›).
Oznaczenie i opis klas gramatycznych fleksemów znajdziesz w System znaczników morfosyntaktycznych w korpusie IPI PAN. Tu interesują nas przede wszystkim fleksemy klas:
  • num – liczebnik,
  • subst – rzeczownik,
  • adj – przymiotnik,
  • praet – osobowa forma czasownika w czasie przeszłym (zwana też pseudoimiesłowem),
  • fin – osobowa forma czasownika w czasie nieprzeszłym (zależnie od aspektu teraźniejszym lu przyszłym).
Javowską definicję fleksemu zawiera Flexem.java, a klas gramatycznych FlexemClass.java.

Kategorie gramatyczne

Opis używanych kategorii gramatycznych znajdziesz w Podstawy teoretyczne SGJP.
Tu interesują nas przede wszystkim kategorie:
  • rodzaju - kategoria selektywna (wspólna dla wszystkich form fleksemu) rzeczowników i kategoria fleksyjna dla liczebników, przymiotników i form osobowych czasownika w czasie przeszłym,
  • przypadka - kategoria fleksyjna dla rzeczowników, liczebników i przymiotników,
  • liczby - kategoria selektywna dla liczebników, a fleksyjna dla rzeczowników, przymiotników i osobowych czasowników,
  • akomodacji (rządu) - kategoria fleksyjna liczebników,
  • osoby - kategoria fleksyjna form osobowych czasownika.

Javowskie definicje wybranych kategorii gramatycznych zawiera GrammarCategory.java.

Słowniki fleksemów

Jako parametr wejściowy, niektórych z opisanych wyżej metod, występują fleksemy. Fleksemy można kolekcjonować w słownikach (klasa Javy FlexDictionary ).
Słownik liczebników jest wbudowany w bibliotekę PlNumbers.jar, lecz potrzebne mogą być i inne fleksemy.
Nie musisz jednak dysponować całym słownikiem fleksyjnym (np. SGJP). Tu możesz zobaczyć źródła przykładowych słowników z wybranym fleksemami: rzeczownikowymi, czasownikowymi (klasy praet i fin) i przymiotnikowymi.

Generator fleksemów

Javowskie konstruktory fleksemów (rzeczownikowych, przymiotnikowych lub czasownikowych) możesz wygenerować tutaj pod warunkiem, że interesujący Cię wyraz znajduje się w Słowniku gramatycznym języka polskiego.
Lemat (forma hasłowa):
Kod konstruktora fleksemu:
new SubstFlexem("człowiek", Gender.m1 , new FlexForm("człowiecze","daw.", Numberc.sg, Case.voc) , new FlexForm("człowieka","", Numberc.sg, Case.gen, Case.acc) , new FlexForm("człowieka","daw.", Numberc.sg, Case.gen, Case.acc) , new FlexForm("człowiek","", Numberc.sg, Case.nom) , new FlexForm("człowiek","daw.", Numberc.sg, Case.nom) , new FlexForm("człowiekiem","", Numberc.sg, Case.inst) , new FlexForm("człowiekiem","daw.", Numberc.sg, Case.inst) , new FlexForm("człowiekowi","", Numberc.sg, Case.dat) , new FlexForm("człowiekowi","daw.", Numberc.sg, Case.dat) , new FlexForm("człowieku","", Numberc.sg, Case.loc) , new FlexForm("człowieku","daw.", Numberc.sg, Case.loc) , new FlexForm("człowieku","", Numberc.sg, Case.voc) , new FlexForm("ludziach","", Numberc.pl, Case.loc) , new FlexForm("ludziach","daw.", Numberc.pl, Case.loc) , new FlexForm("ludzi","", Numberc.pl, Case.gen, Case.acc) , new FlexForm("ludzi","daw.", Numberc.pl, Case.gen, Case.acc) , new FlexForm("ludzie","", Numberc.pl, Case.nom, Case.voc) , new FlexForm("ludzie","daw.", Numberc.pl, Case.nom, Case.voc) , new FlexForm("ludziom","", Numberc.pl, Case.dat) , new FlexForm("ludziom","daw.", Numberc.pl, Case.dat) , new FlexForm("ludźmi","", Numberc.pl, Case.inst) , new FlexForm("ludźmi","daw.", Numberc.pl, Case.inst) ) ;

Opcje odmiany liczebników (Preferences)

Występująca w parametrach niektórych metod klasa PlNumberFlexer.Preferences pozwala wskazać preferowane opcje odmiany liczebników. Jej metody:
  • setPrefInstOma(boolean prefInstOma) - ustala, czy w wypadku alternatywnych form narzędnika liczebników typu pięćdziesięciu/pięćdziesięcioma, wybierana ma być forma z końcówką -oma,
  • setPrefNom(boolean prefNom) - pozwala ustalić brak odmiany (gdy jest to dozwolone) pewnych składników liczebnika wielorazowego (mają one wówczas formę mianownikową, np. dopełniacz tysiąc(a) dwudziestu dziewięciu ),
  • setPrefNColl(boolean prefNColl) - pozwala wybrać formę niezbiorową liczebnika na pozycji dziesiątek dla rodzajów zbiorowych, np. trzydzieści dwoje (dzieci) a nie trzydzieścioro dwoje...
Domyślnie opcje te są wyłączone.

Podstawa teoretyczna:
  • Z. Saloni, M. Świdziński – Składnia współczesnego języka polskiego,
  • W. Gruszczyński, Z. Saloni - Składnia grup liczebnikowych we współczesnym języku polskim,
  • H. Jadacka – Kultura języka polskiego

Dane leksykalne: Słownik gramatyczny języka polskiego


Opracowanie: Zbigniew Bronk, Agencja Informatyczna. Kontakt: Z[kropka]Bronk[at]ai[kropka]pl