Czasowniki

Problem czasowników dotychczas niezbyt mnie interesował. Wydawało mi się, że nie jest on tak złożony i błędy popełniane na podczas odmiany czasowników nie są tak rażące. Trochę utwierdzała mnie w tym tabela koniugacji, która wydaje się być prostsza w implementacji, choć oczywiście również wymaga zastanowienia i dokładniejszej analizy. Na tym etapie bardziej interesujące jest jak rozpoznać czasowniki. Bezokoliczniki są niby najprostsze, bo mają słowo to na początku. Jenak może to być zwodnicze, bo przecież słowo to jest w angielskim tak uniwersalne, że zęby bolą. Aż szkoda, że nie jestem anglistą, bo może miałbym bardziej wyczerpującą wiedzę na ten temat. Poza tym bezokoliczniki to wierzchołek góry lodowej. Chyba się powtarzam, ale przecież bardzo wiele słów angielskich może być użyte jako czasowniki, rzeczowniki, przymiotniki, przysłówki i nie wiem co jeszcze. Chyba muszę trochę postudiować gramatykę angielską, bo nie dam sobie rady z tym galimatiasem.

W lesie przypadków

W poprzednim wpisie zastanawiałem się, jak rozpoznawać przypadek rzeczownika, który trzeba wybrać w tłumaczeniu. Im dłużej nad tym myślę, tym bardziej widzę, że to będzie jakaś mocno sztuczna inteligencja, żadne proste algorytmy. Przyszły mi do głowy dwa szczególne przypadki. Pierwszy wiąże się z rzeczownikiem stojącym bezpośrednio za czasownikiem być. Zwykle występuje on w narzędniku. Tutaj, jako przykład, zamiast programisty, przychodzi mi do głowy papuga: ten ptak jest papugą. Ale nagle nastąpiło olśnienie: to jest papuga – mianownik. Jak to wykryć i rozróżnić? Jako przypadek szczególny?

Drugi przykład jest, mam nadzieję, prostszy: niektóre rzeczowniki, które w angielskim używa się w liczbie mnogiej, na polski tłumaczy się w liczbie pojedynczej, chociaż niby liczba mnoga istnieje i jest dopuszczalna, bo nie są to rzeczowniki, które mogą występować tylko w liczbie mnogiej, jak drzwi czy spodnie. Najbardziej oczywiste są mathematics, czy physics. Tłumaczy się je na liczbę pojedynczą, chociaż liczba mnoga może wystąpić (mieliśmy dziś dwie matematyki). Trzeba gdzieś zaznaczyć, że dany rzeczownik, zarówno polski jak angielski, może mieć tylko formę liczby pojedynczej, albo tylko liczby mnogiej.

Co z rzeczownikami

Mam już grupy deklinacyjne i mogę im przypisywać rzeczowniki, czyli mogę sobie napisać klasę, która zaimplementuje interfejs PolskiRzeczownik. Teraz kolejna tura – dobranie przypadku rzeczownika do kontekstu zdania. Mam na początek kilka pomysłów:

  • mianownik (kto? co?) – na początku zdania, jako podmiot; może być ewentualnie poprzedzony przymiotnikiem, wtedy powstaje pewna trudność, ale można ją rozwiązać przez założenie, że jest to pierwszy wyraz przed czasownikiem; tu pojawia się kolejna trudność – co jest czasownikiem, skoro wiele słów może być zarówno rzeczownikami, jak czasownikami; nie mnóżmy jednak problemów, mogę założyć, że szukam pierwszego wyrazu, który nie może być rzeczownikiem, tylko czasownikiem, wtedy przed nim jest podmiot, czyli rzeczownik w mianowniku; już widać na początku, że algorytmy będą nietrywialne 🙂
  • dopełniacz (kogo? czego?) – wszelkie braki są w dopełniaczu (no reason, no time), a także szukanie, potrzeby, czyli ‚dla’ (looking for, need sth)
  • celownik (komu? czemu?) – najczęstszym przykładem jest przyglądać się czemuś, tyle że po angielsku look, to najczęściej tłumaczy się jako patrzeć, a patrzymy na kogo? co?, czyli mamy biernik; znalazłem taki przykład „we must look at these sort of situations” – musimy przyglądać się tego rodzaju sytuacjom, ale jak to zalgorytmizować? wpadłem na pomysł, żeby przypadek ustalać według polskiego czasownika, wtedy ‚ufać komuś’ też zadziała; wynika z tego, że muszę mieć powiązanie pomiędzy polskimi czasownikami i odpowiadającymi im przypadkami rzeczowników
  • biernik (kogo? co?) – widzę, dostaję, biorę itd., po prostu są czasowniki, które implikują ten przypadek
  • narzędnik (kim? czym?) – z pewnością będą to zwroty z with i oczywiście mój ulubiony programista, czyli z czasownikiem to be
  • miejscownik (o kim? o czym?) – about, ale nie we wszystkich kontekstach, bo ten wyraz ma sporo znaczeń (ponad, odnośnie, prawie, w pobliżu, w przybliżeniu, wokół, przy, dotyczący itd.); być może lepiej wiązać to z polskim wyrazem ‚o’
  • wołacz – zasadniczo wołacza w angielskim nie ma, to znaczy można go poznać jedynie po kontekście; chwilowo nie będę się nim szczególnie zajmował

Pascha

Niewątpliwie mamy Wielkanoc. Przez ostatnie dni mniej skupiałem się na pracy zawodowej oraz innej działalności związanej z komputerami, a bardziej na przygotowaniach i uczestniczeniu w Triduum Paschalnym. Neokatechumenalna pascha zaczyna się ok. godz. 22:00, trwa kilka godzin i kończy uroczystym śniadaniem nad ranem. Potem trzeba jeszcze odespać i odwiedzić rodzinę.

W każdym razie życzę wszystkim Czytelnikom wszelkich łask Bożych, niezależnie od tego, czy są wierzący, czy nie, bo Chrystus umarł za wszystkich i wszyscy są przez niego kochani.

Koszt interfejsu

Ponieważ będę musiał pracowicie wypełniać danymi tabelkę zawierającą rzeczowniki, zacząłem myśleć o zbudowaniu do niej jakiegoś interfejsu, żeby praca szła raźniej. Kiedyś tworzyłem interfejsy przy pomocy Formsów, jeszcze w wersji staroświeckiej, nieprzeglądarkowej, które jawiły się użytkownikowi jako zwyczajna aplikacja windowsowa, choć był to tzw. gruby klient i przeglądarka była konieczna do uruchomienia owej aplikacji. W każdym razie zbudowanie prostego interfejsu dla jednej tabelki było w Formsach niezwykle proste, a to dzięki kilku mechanizmom, które były gotowymi rozwiązaniami do ewentualnej adaptacji. Blok danych, tworzony wizardem, był bezpośrednim odwołaniem do tabeli i był związany z kanwą, która zawierała elementy interfejsu użytkownika. Można było w prosty sposób rozłożyć na kanwie pola rekordu wraz z jakimś opisem, dołożyć do tego logikę i wywoływać ją przyciskami lub innymi elementami interfejsu. Można też było kilkoma kliknięciami na innej kanwie zbudować zestawienie zbiorcze, które pokazywało wprowadzone rekordy i stosunkowo prosto dodać przyciski nawigacyjne i umożliwiające edycję, dodawanie, usuwanie itp. operacje na rekordzie. Oczywiście wszystko to można zrobić w Javie i zapewne są do tego odpowiednie biblioteki, które mocno to ułatwiają. Jednak kiedy pomyślę, że musiałbym ręcznie wyrzeźbić formularz do wprowadzania danych i zbiorczy do obsługi wielu rekordów, od razu sobie myślę, że te dane wystarczy wprowadzać w Eclipsie, za pomocą wbudowanego weń standardowego edytora bazodanowego, albo nawet wczytywać do bazy danych przez zwykłe pliki tekstowe, które mogę sobie edytować dowolnie w Notepadzie++. Moja niechęć wynika z faktu, że dla każdej tabelki konieczne są przynajmniej trzy klasy: jedna odwzorowująca rekord tabeli jako obiekt, druga zawierająca metody operacji na rekordzie i trzecia, odpowiadająca za działanie elementów interfejsu (tzw. logikę biznesową, cokolwiek by to nie było). Dodatkowo potrzebna jest strona przeglądarkowa, lub dwie, jeśli rozdzielić formularz pojedynczego rekordu od zestawienia zbiorczego. Muszą one zawierać wypasioną treść html, żeby użytkownik mógł to wszystko widzieć i sensownie klikać.

Jakoś nowoczesna technika kosztuje strasznie dużo, zwłaszcza dla pojedynczego szarego, prostego programisty.

Bez automatyki

Wprowadzam te deklinacje, co prawda niezbyt śpiesznie, do tabelki i mam coraz większy mętlik. W zasadzie one mogą stanowić podstawę do zautomatyzowania odmiany co najwyżej połowy rzeczowników. Jest tyle dziwnych odstępstw od reguł deklinacyjnych, że albo trzeba by stworzyć bardzo skomplikowany program, który umie odmieniać wszelkie możliwe nieregularności, albo pójść po linii najmniejszego oporu, jak mawiają elektrycy i działa prąd, bo można też iść po najmniejszej linii oporu: całą odmianę wrzucić do bazy danych. Wyszło mi okropnie długie zdanie, bardzo podrzędnie złożone. W każdym razie chcę zastosować metodę mało skomplikowaną, nie mam zamiaru pisać jakiejś koszmarnie zawiłej sztucznej inteligencji. Po prostu tam, gdzie temat (rdzeń) rzeczownika odmienia się zgodnie z deklinacją, program będzie brał formę zgodną z deklinacją, czyli łączył temat z końcówką deklinacyjną. We wszystkich innych przypadkach będzie brał odpowiednią formę rzeczownika po prostu z bazy danych. Właściwie to opisałem ten algorytm w odwrotnej kolejności: najpierw będzie sprawdzał, czy jest nieregularna forma w bazie danych, a jeśli nie będzie, sklejał temat z końcówką. Zaletą jest prostota i niezawodność algorytmu, wadą duży nakład na prawidłową zawartość bazy danych, gdyż każdy rzeczownik będzie musiał mieć pieczołowicie określoną grupę deklinacyjną i uzupełnione wszystkie formy nieregularne.

Całkowicie poza tematem

Prace nad wbiciem danych do tabelki z grupami deklinacyjnymi wloką się powoli. Trochę mi się schodzi, bo dużo śpię z powodu leczenia litem. Lit, w moim przypadku, ma działanie usypiające, czyli mam do wyboru: brać go więcej i spać całymi dniami, albo brać mniej i przeżywać wszystko tak intensywnie, że aż nieznośnie. Wtedy człowiek zakłada strony internetowe z blogami i postanawia napisać program tłumaczący.

Jeszcze kwestia obrazków: mam tysiące zdjęć, które robiłem będąc tu i ówdzie w Polsce i na świecie oraz całkiem blisko domu. Postanowiłem je upublicznić w formie lekko podretuszowanej efektem „ołówkowym”. Obrobione w ten sposób spodobały mi się, w dodatku można dzięki temu przedstawić interesująco w zasadzie dowolny temat.

Obrazek jest kolejnym przykładem.

Pierwszy kod

Na bazie doświadczeń z wklepywaniem danych do tabelki deklinacji wymyśliłem sobie pierwszy interfejs:

public interface PolskiRzeczownik {
public String mianownikLp();
public String dopelniaczLp();
public String celownikLp();
public String biernikLp();
public String narzednikLp();
public String miejscownikLp();
public String wolaczLp();
public String mianownikLmn();
public String dopelniaczLmn();
public String celownikLmn();
public String biernikLmn();
public String narzednikLmn();
public String miejscownikLmn();
public Rzeczownik getRzecz();
public void setRzecz(Rzeczownik rzecz);
}

Wołacz liczby mnogiej zawsze jest taki sam, jak mianownik. Zakładam, że implementacja tego interfejsu będzie umiała wziąć z bazy danych rzeczownik i jego grupę deklinacyjną i wymyślić sobie formę każdego z przypadków. Teraz pozostaje pytanie, czy takie podejście jest właściwe. W zasadzie dla konkretnego słowa użytego w konkretnym zdaniu nie jest konieczna znajomość wszystkich form. Z drugiej strony, coś co wywoła metodę dla znalezienia właściwej formy nie będzie wymuszać wyznaczania wszystkich, czyli tak może chyba zostać. Bardziej interesujące jest może, którą formę trzeba wybrać, czyli którą metodę wywołać. Muszę pomyśleć nad tą kwestią.

Obrazek przedstawia ważkę.

Deklinacje

Zabrałem się do wbijania danych o deklinacjach do tabelki. Ponieważ robiłem to ręcznie, więc przy okazji dowiedziałem się nieco o odmianie rzeczowników. Zasadniczo panuje tu wolna amerykanka. Już samo to, że jest 146 grup deklinacyjnych mówi za siebie. Co prawda niektóre z nich różnią się bardzo nieznacznie, ale za to inne pozwalają na wieloraką swobodę interpretacji, zwłaszcza jeśli chodzi o przetwarzanie cyfrowe i zalgorytmizowane. Innymi słowy mamy bogaty język. Weźmy pierwszego z brzegu Rosjanina:

  • mianownik: Rosjanin
  • dopełniacz (końcówka -a): Rosjanina
  • celownik (-owi): Rosjaninowi
  • biernik (-a): Rosjanina
  • narzędnik (-em): Rosjaninem
  • miejscownik (-e): Rosjaninie (dochodzi dodatkowe i)
  • wołacz (-e): Rosjaninie

W liczbie mnogiej zaczyna się jazda, ogólnie liczba mnoga zwykle jest ciekawsza i bogactwo deklinacji głównie w niej się zaznacza.

  • mianownik i wołacz (-e): Rosjanie (zginęło n)
  • dopełniacz i biernik (bez końcówki): Rosjan (zginęło in)
  • celownik (-om): Rosjanom (z punktu widzenia algorytmu powinno być Rosjaninom)
  • narzędnik (-ami): Rosjanami (konsekwentnie ginie in)
  • miejscownik (-ach): Rosjanach

Reasumując: oprócz standardowych końcówek innych dla każdego przypadku pojawiają się albo znikają dodatkowe zgłoski i to w sposób nieregularny… Co z tym fantem zrobić?

Obrazki nie obrazują problemu.

Odkręcone ogonki

Chyba się jednak przeproszę z Postgresem. W poprzednim wpisie napisałem, że Postgres umie użyć pod Windowsami tylko strony 1250. Zacząłem drążyć temat i doczytałem się o dosyć elastycznym podejściu do stron kodowych, jeśli chodzi o transmisję danych. Można ustawić stronę kodową przechowywania danych w bazie na UTF-8. Sztywność strony 1250 dotyczy tylko porównań koniecznych do sortowania (ang. collation). Do przesyłania danych można użyć kilku stron kodowych, w przypadku polskich ogonków może to być również UTF-8 i iso-8859-2, a także coś, co zostało nazwane Multilingual Emacs. Nie mam pojęcia o Emaksie, więc nie wiem, o co chodzi, ale Postgres potrafi przekodować dane z klienta na stronę kodową bazy danych. W każdym razie przetestowałem, że spod Eclipse’a można wprowadzić dane z polskimi literami zakodowane w UTF-8, a potem wyeksportować je z bazy za pomocą pgAdmina do pliku i kodowanie UTF-8 jest zachowane. Rozumiem, że dotyczy to również aplikacji napisanej w Javie przesyłającej dane przez JDBC, bo w końcu przecież Eclipse jest taką aplikacją.

Kamień z serca.

Obrazki pokazują co innego.