Ułatwianie zabawy Ithkuilem

Ostatnie dni poświęciłem ulepszaniu dawno stworzonego narzędzia, mającego na celu ułatwienie ludziom bawienia się Ithkuilem. Ale po kolei.

Ithkuil

Ithkuil to sztuczny język, którego autorem jest John Quijada. Sztuczne języki kojarzą się zwykle z zabawami dzieci (sam tworzyłem swoje języki w wieku ok. 10-12 lat), jednak w tym przypadku trudno być dalej od prawdy. Jakkolwiek trzeba przyznać, że trudno znaleźć dla Ithkuila jakieś praktyczne zastosowanie, jest to w moim odczuciu język niezwykle interesujący.

W Ithkuilu nacisk kładziony jest na przekazanie jak największej ilości informacji w jak najkrótszej wypowiedzi. W efekcie język ten posiada 45 spółgłosek i 13 samogłosek i niemalże każda głoska w słowie niesie osobny fragment informacji. Jak to zostało osiągnięte?

Ithkuil posiada dwie główne klasy słów - ang. formatives i adjuncts. Formatives to słowa pełniące rolę rzeczowników lub czasowników, adjuncts natomiast pełnią rolę dodatkowych określeń oraz zaimków osobowych. Skupmy się na formatives. Każde z nich składa się z rdzenia, niosącego główne znaczenie (np. "dźwięk wydawany ustami"), który następnie jest "odmieniany" przez ponad 20 różnych kategorii gramatycznych za pomocą doklejanych przyrostków i przedrostków. Np. rdzeń "dźwięk wydawany ustami" (-l-) możemy odmienić, dopisując z przodu "e-" -> "el-", otrzymując "wypowiedź". Aby otrzymać najmniejsze możliwe słowo, musimy dokleić jeszcze co najmniej jedną samogłoskę i spółgłoskę -> "elal". "a" określa przypadek "oblique", będący przypadkiem neutralnym, nie niosącym żadnej szczególnej informacji. Końcówka "-l" z kolei określa, że mamy na myśli pojedynczy obiekt, funkcjonujący osobno, rozpatrujemy go w całości i chodzi nam o sam obiekt, a nie np. jego wyobrażenie. W ten sposób "elal" oznacza właśnie "wypowiedź".

Możemy jednak nieco zmienić końcówkę. Na pozycji, na której mamy "l", możemy wstawić jedną z ponad 1700 kombinacji spółgłosek, z których każda określa wartości 5 kategorii gramatycznych. Końcówka "-rtkʰ", na przykład, oznacza myślową reprezentację pojedynczego obiektu, złożonego z wielu różnych części, opisywanych rdzeniem, służących wspólnemu celowi. Dla lepszego brzmienia można dopisać na końcu jeszcze "a", które nie zmienia znaczenia (jest to akurat wartość domyślna). "elartkʰa" oznacza zatem reprezentację zestawu różnych, służących wspólnemu celowi wypowiedzi - czyli języka ;) Takie właśnie znaczenie miało w jednej z wcześniejszych wersji języka słowo "ithkuil" i dlatego zresztą zostało jego nazwą.

Jeden z najlepszych przykładów możliwości Ithkuila jest przedstawiony na jego stronie. Nie będę go tu przepisywał, podam jedynie link: http://ithkuil.net/texts.html#duchamp

Ponieważ słowa mogą składać się z kilkunastu morfemów, z których każdy może mieć jedną z kilkudziesięciu lub nawet kilkuset postaci, tłumaczenie tekstów z Ithkuila i na Ithkuil jest bardzo czasochłonne i w dużej mierze składa się z przeglądania tabelek na stronie. Fajnie byłoby jakoś to przyspieszyć.

Komputerowa analiza

Na pomoc przychodzi, a jakże, komputer. Ithkuil, jakkolwiek bardzo złożony, ma bardzo regularną strukturę. Słowa mogą składać się jedynie z pewnych konkretnych kombinacji głosek, połączonych w ściśle określony sposób. Ta regularność pozwala na stworzenie programu, dokonującego rozkładu słów w Ithkuilu na części pierwsze - morfemy. Powstało zatem wiele projektów, mających dokładnie to na celu, z których jednego - mojego autorstwa - dotyczy ten wpis ;)

Podstawowa analiza jest bardzo prosta, jako że każdy morfem w Ithkuilu składa się albo ze spółgłosek, albo z samogłosek. To pozwala z marszu podzielić słowo na morfemy, zostaje jeszcze jednak kwestia przyporządkowania ich do poszczególnych pozycji, tzw. "slotów". To zadanie okazuje się trudniejsze.

Problem polega na tym, że aby uzyskać jednoznaczność przyporządkowania morfemów do slotów, autor musiał wprowadzić wiele złożonych reguł. Niektóre sloty wymagają obecności innych, niektóre mogą zawierać tylko niewielkie podzbiory wszystkich dostępnych głosek, niektóre w pewnych okolicznościach muszą być oddzielone od innych zwarciem krtaniowym (zapisywanym "’"). Analiza wciąż jest możliwa, ale dość skomplikowana.

Pierwotna wersja programu była skupiona na "formatives" - jest to najbardziej skomplikowana klasa słów, zatem poprawne obsłużenie jej to już jakieś 70% wysiłku. Algorytm był wówczas zawarty w jednej, długiej funkcji, która po kolei rozpoznawała, czy dany blok spółgłoskowy lub samogłoskowy może znajdować się w tym a tym slocie. Program działał, aczkolwiek był brzydki i trudny do rozszerzania, w związku z czym po zakodowaniu analizy formatives odechciało mi się dalszej pracy nad nim.

Kilka dni temu przyszło mi do głowy, aby podejść do problemu nieco bardziej informatycznie i stworzyć parser oparty na formalnej gramatyce. W pierwszej chwili zamierzałem stworzyć gramatykę bezkontekstową, potem jednak zmieniłem zdanie i wybrałem PEG ("Parsing Expression Grammar") ze względu na bardzo łatwe przekształcanie takich gramatyk w parsery. Potem okazało się, że ten wybór ułatwił mi jeszcze jedną kwestię, ale o tym za chwilę.

Przystępując do pisania gramatyki, planowałem zawrzeć w niej wszystko oprócz akcentu, który w Ithkuilu również niesie część znaczenia. Akcent jest jednak oznaczany w bardzo złożony sposób, ze względu na to, że część liter posiada znaki diakrytyczne i postawienie nad nimi dodatkowej kreski byłoby brzydkie. W zasadzie do interpretowania akcentu można by było napisać osobną gramatykę, więc połączenie jej z gramatyką opisującą morfologię wydawało się bardzo pracochłonne.

Szczęśliwie gramatyki PEG zawierają w swoim formalizmie tzw. predykat &. Zastosowanie reguły w takim predykacie każe parserowi sprawdzić, ciąg znaków na początku wejścia spełnia regułę, ale go nie konsumuje. W rezultacie można dopasować wejście do kilku reguł naraz. Przyszedł mi wobec tego do głowy pomysł, żeby dopasowywać akcent predykatami &, po czym zwykłymi regułami rozbić słowo na morfemy. Okazało się to bardzo praktycznym rozwiązaniem i tak rzeczywiście funkcjonuje aktualna gramatyka.

Innym problemem sprawiającym trudności okazało się łączenie poszczególnych morfemów z ich znaczeniami. Rdzenie są określone w bardzo arbitralny sposób i od razu odpadły, ale przedrostki i przyrostki mają jednoznaczne przyporządkowanie do swoich znaczeń, więc nic teoretycznie nie stoi na przeszkodzie, aby program po rozbiciu słowa na części pisał, która z nich co znaczy. W praktyce niestety na przeszkodzie stanęła struktura tabelek na stronie z gramatyką. Każda z nich ma swoją strukturę, nieregularności, różnice w zapisie itp., co powoduje, że ściągnięcie znaczeń kilku tysięcy morfemów staje się trudne. Na szczęście nic nie stało na przeszkodzie, aby pobierać i zapisywać w bazie danych każdą tabelkę z osobna z uwzględnianiem specyfiki każdej z nich oddzielnie, co zrobiłem, choć była to raczej nudna praca. Efekt to baza danych dostępna w repozytorium.

Rezultat

Podczas projektu stworzyłem ostatecznie kilka programów:

  1. Podlinkowany już wcześniej moduł w języku Python, zawierający podstawowe funkcje analizowania słów.
  2. Aplikację internetową, która pozwala na wpisanie zdania w Ithkuilu i zwraca jego analizę. W nazwy poszczególnych kategorii gramatycznych można klikać - strona wyświetla wtedy jej opis zaczerpnięty z http://ithkuil.net
  3. Bota redditowego, który analizuje oznaczone akapity i wypisuje wyniki w skróconej postaci. Na razie działa tylko na subreddicie testowym, wkrótce zamierzam jednak przełączyć go na /r/ithkuil.

Plany

Mam też kilka rzeczy w planach, choć obecnie zaczynam tracić zainteresowanie tym projektem i wracać myślami do innych zajęć, więc pewnie trochę poczekają na realizację.

Po pierwsze, stworzone dotychczas narzędzia pozwalają na analizę słów, jednak nie umożliwiają łatwej ich konstrukcji. Fajnie byłoby to zmienić. Baza danych morfemów na szczęście jest już gotowa, pozostaje tylko stworzyć kod, jednak po tym projekcie można spodziewać się kolejnych wyzwań.

Po drugie, Ithkuil ma własny system pisma. W przeciwieństwie do alfabetu łacińskiego, znaki w nim przeważnie nie oznaczają dźwięków jako takich, a kategorie gramatyczne. Mając jednak kod, który potrafi analizować słowa, stosunkowo łatwo powinno dać się przekształcić rezultat tej analizy w Ithkuilowe pismo.

Po trzecie, istnieją już programy odczytujące tekst z obrazu, a znaki pisma Ithkuila nie są zbyt złożone. Fajnie byłoby więc stworzyć system potrafiący odczytać to pismo i przełożyć na zapis łaciński. To jednak jest całkiem nowa sprawa - nie zajmowałem się nigdy takimi tematami, więc przedsięwzięcie tego typu jest raczej kwestią odległej przyszłości ;)