Strona głównaProjekty
Dawid Weiss
Lametyzator
http://www.cs.put.poznan.pl/dweiss/xml/projects/lametyzator/index.xml
Uaktualnienie (27 wrzesień, 2006)

Poprawiono duży błąd w kodzie FSA. Nowe wersje (oraz repozytorium źródeł) jest teraz częścią projektu Morfologik [outlink].

Uaktualnienie (16 sierpnia, 2006)

Dodany konstruktor do klasy Lametyzator pozwalający na pracę z własnymi słownikami. Dodana opcja budowy pliku JAR bez wbudowanego słownika języka polskiego.

Uaktualnienie (26 maj, 2006)

Uaktualnienie Lametyzatora o funkcje potrzebne do wspólnego projektu z Marcinem Miłkowskim — Morfologik [outlink].

Uaktualnienie (3 luty, 2005)

Uaktualnienie Lametyzatora obejmuje nową tablicę form oraz nieco zmienione API (zmiana nazw pakietów). Dodatkowy bonus jest taki, że jest opcjonalna integracja z pakietem Stempel [outlink]. Jeśli tylko Lametyzator znajdzie Stempela w ścieżce CLASSPATH to automatycznie stanie się lematyzatorem hybrydowym, szczegółowiej opisanym w tym raporcie technicznym.

Uaktualnienie (7 sierpnia, 2004)

Od niedawna dostępny jest również algorytmiczny lematyzator dla języka polskiego, autorstwa Andrzeja Białeckiego. Z pewnością warto zajrzeć na stronę projektu Stempel [outlink].

Pierwszy darmowy lematyzator języka polskiego?

Lametyzator* jest prostym, aczkolwiek wydaje mi się jedynym ogólnie dostępnym, programem do zamiany słów języka polskiego z formy odmienionej na podstawową. Potrzeba takiego programu jest wręcz olbrzymia - wykorzystuje się je przede wszystkim przy komputerowym przetwarzaniu tekstów, przy odkrywaniu wiedzy z danych i w ogólności w lingwistyce komputerowej. W tej ostatniej zazwyczaj analizuje się również funkcję, jaką pełni dane słowo w zdaniu przy pomocy algorytmów o wiele bardziej skomplikowanych i dających lepsze rezultaty od prostego podejścia, które cechuje napisany przeze mnie lematyzator.

Ale... gdy nie ma innych opcji, należy rozwijać to, co jest. Zapraszam do korzystania z napisanego przeze mnie programu i do współpracy przy jego tworzeniu (wszelkie sugestie, uwagi pozytywne i krytyczne są mile widziane).

Pomysł

Pomysł jest trywialny: skoro mamy słowo A zamienić na jego formę podstawową B, to potrzebna jest nam tablica odwzorowań A->B. Mając wtedy odmienioną formę A szukamy jej w tablicy i odnajdujemy wersję podstawową B. Proste.

Problemy i rozwiązania

Problemów jest właściwie kilka:

  1. Jak efektywnie przechowywać pary A->B, skoro wiadomo, że dla na przykład język polski ma bogatą fleksję, więc każde słowo będzie generowało mnóstwo form fleksyjnych?

    Efektywne przechowanie słownika jest zapewnione przez użycie deterministycznego automatu o dość dobrej kompresji struktury danych przejść i węzłów. Automaty takie, sposób ich konstrukcji i wykorzystanie, są świetnie opisane przez Jan Daciuka [outlink]. Napisał on również bibliotekę programów w C, która służy do budowy automatów z plików tekstowych.
    Ja ze swojej strony napisałem klasy w języku Java obsługujące jeden z formatów produkowanych przez skrypty pana Daciuka (proszę zobaczyć strony tego projektu tutaj). Całość jest piorunująco szybka i bardzo zwięzła (44 megabajty słownika skompresowane są do około 1.5 megabajta).

  2. Jak efektywnie przeszukiwać nasz słownik?

    Efektywne przeszukiwanie słownika zapewnia ta sama struktura danych, którą użyliśmy do ich przechowywania. Automat skończony ma w każdym węźle najwyżej M przejść do innych stanów (gdzie M jest maksymalnie liczbą symboli z alfabetu poddanego obróbce). W każdym stanie musimy wykonać więc najwyżej przeszukanie M symboli by przejść do następnego stanu. Ponieważ stany odpowiadają znakom badanego słowa, więc złożoność takiej operacji jest liniowa i zależna jedynie od długości słowa.
    Alternatywnym (również zaimplementowanym) rozwiązaniem było użycie doskonałej funkcji mieszającej (ang. perfect hash table), to znaczy dla każdego znanego słowa funkcja haszująca zwracała dokładnie jedną pozycję w tablicy wszystkich znanych par. Jednak to rozwiązanie, mimo że jeszcze szybsze niż w wypadku automatu, wymagało haniebnych ilości pamięci na tablice, więc zostało zarzucone.

  3. Skąd wziąć pary A->B do słownika (jak taki słownik zdobyć legalnie).

    Dane o słowach i ich formach zostały pozyskane z publicznie dostępnego słownika języka polskiego programu ispell. Program ten posiada listę słów języka polskiego, wraz z oznaczeniem "kategorii", w jakiej dane słowo się odmienia. Kategoria określa modyfikacje, które należy poczynić, aby dany wyraz zamienić na jakąś jego formę fleksyjną. Szczęściem dla nas, program ispell potrafi definicje kategorii zaaplikować do danego zbioru słów produkując wszystkie możliwe formy. W ten sposób uzyskano około 45 megabajtów danych, które stanowią serce lematyzatora.

  4. Kiedy słownik będzie "pełny", to znaczy kiedy będzie można powiedzieć, że rozpoznaje każde słowo?

    Na to pytanie należy sobie wyraźnie powiedzieć: nigdy. Język jest tworem żywym, ulegającym ciągłym transformacjom; nowe słowa pojawiają się, stare odchodzą w zapomnienie. Co więcej, nie istnieje chyba możliwość zapamiętania wszystkich nazw własnych (imion, nazwisk, nazw przedmiotów, miejsc, ludzi etc).

    Dodatkowo, nawet sama konstrukcja języka odgrywa tutaj swoją rolę. W myśl prawa Zipf'a, nawet zbudowanie olbrzymiego słownika nie gwarantuje rozpoznania większości występujących w tekstach słów. Dla przykładu, w korpusie Rzeczpospolitej, zawierającym około 87 milionów słów (z czego 884 tysiące unikalnych), aż 613 tysięcy to słowa występujące 5 i mniej razy (to mniej więcej 69%!). Jak więc widać, nawet olbrzymi korpus, czy też słownik nie wyczerpuje wszystkich możliwości odmiany. Z drugiej strony, nieco bardziej optymistycznej, choćby te parenaście tysięcy słów dobrze rozpoznanych też stanowi jakąś jakość dodaną dla systemów, których działanie opiera się na porównywaniu ze soba słów w tekście...

  5. Co zrobić ze słowami, które posiadają więcej niż jedną możliwą formę bazową (wynika to z kontekstu ich użycia, na przykład celi może być formą słów cela (pomieszczenie) albo cel (na tarczy).

    Na to pytanie odpowiedź jest akurat prosta: oczywiście należy zwrócić wszystkie możliwe formy podstawowe słowa. Jest to w niektórych zastosowaniach kłopotliwe (szczególnie jeśli chodzi o późniejsze porównywanie takich przetworzonych form), jednak na razie innych pomysłów nie mam.

    Należy zwrócić uwagę iż zadanie lematyzatora jest nieco inne niż analizatora morfologicznego - lematyzator ma nam jedynie sprowadzić słowo do jakiejść formy, która byłaby identyczna dla wszystkich jego form fleksyjnych (w szczegolności nie musi być to prawidłowe słowo, co czyni większość lematyzatorów przeznaczonych do przetwarzania języka angielskiego).

Jak więc widać, lematyzator przeze mnie napisany ma swoje wady i zalety. Ja osobiście twierdzę, że jego największą zaletą jest to, że jest, bowiem programy świetnych polskich lingwistów i specjalistów od przetwarzania jezyka są zazwyczaj przeznaczone na rynek komercyjny (czemu zresztą trudno się dziwić, w końcu lematyzator chleba nie wyprodukuje).

Demonstracja

Z powodu małego zainteresowania demonstracja on-line jest niedostępna.

Pobierz program

Lametyzator/Stempelator oraz kod do FSA są teraz częścią projektu Morfologik [outlink].

Zarówno program, jak i wygenerowany słownik jest dostępny za darmo. Dostępny będzie również w przyszłości. Proszę jedynie o zastosowanie się do poniższych reguł:

  1. Proszę o powiadomienie e-mailem o chęci pobrania/ wykorzystania programu na adres dawid.weiss@cs.put.poznan.pl. Nic tak nie motywuje do pracy jak wiedza, że ktoś programu używa. Poza tym umożliwi mi to wysyłanie powiadomień o nowych wersjach i tym podobne. Sam słownik jest dostępny jako plik słownika pakietu FSA, procedury go obsługujące napisane są w Javie, ale mogą być dość łatwo przepisane do dowolnego języka imperatywnego (choć deklaratywnego pewnie też :).
  2. Zastosowania komercyjne: programy FSA Jana Daciuka nie są darmowe do celów komercyjnych. Myślę, że same słowniki nimi wygenerowane nie podlegają tym ograniczeniom, w przypadku, gdyby była konieczność używania pakietu FSA bezpośrednio, proszę kontaktować się z autorem.
  3. Proszę o umieszczenie w swoim produkcie referencji do mojego nazwiska. To mała cena, a będzie mi przyjemnie. Nakłaniałbym również do dodania nazwisk autora FSA oraz osób, które wielką pracę wkładają w utrzymywanie polskiego słownika ispella.
Do zrobienia (plany na przyszłość)

Wcale nie roszczę sobie praw do poniższych pomysłów. Jeśli ktoś z Państwa czuje się na siłach by się z nimi zmierzyć i udostępnić wyniki, bardzo proszę mnie powiadomić.

  1. Przeprowadzić parę eksperymentów, które pokazałyby jak zachowuje się lematyzator na prawdziwych tekstach.
  2. Sprawdzić ile słów z korpusu ispella Mirosława Prywaty jest pokrywanych przez lematyzator.
  3. Dodać nowe słowa do słownika (i przy okazji do ispella).
  4. Dodać opcję przybliżonej analizy słowa na podstawie końcówek w słowniku - taki quasilematyzator również już został kiedyś napisany na potrzeby mojej pracy magisterskiej (i sprawował się całkiem nieźle). Gdyby dodać go tutaj, być może udałoby się ominąć jakoś problem nazw własnych i słów nie wystepujących w słowniku.
Podziękowania

Chciałbym podziękować następującym osobom za pomoc, inspirację lub materiały:

Zgłoszone błędy

Tak, tak - nie istnieje nic perfekcyjnego :) Dziękuję za zgłaszane błędy - zamieszczam ich listę poniżej i będę nad nimi pracował.

  1. [Mirosław Prywata] Flagi przedrostkowe (prefix) w ispellu tworzą zwykle wyrazy o znaczeniu przeciwnym, a na pewno różnym.
  2. [Mirosław Prywata] Flaga K (rzeczowniki żeńskie od męskich) - np. beton -> betoniarka, fuszer -> fuszerka.

* Lametyzator to taki mały żart, właściwe określenie, lematyzator zostało tu zastąpione przekręcone do wyrazu "lame", co w języku angielskim oznacza coś lichego i kiepskiego... No cóż, mam nadzieję że to pozostanie jedynie żart ;)


(c) Dawid Weiss. All rights reserved unless stated otherwise.