|
Dawid Weiss
Lametyzator
http://www.cs.put.poznan.pl/dweiss/xml/projects/lametyzator/index.xml
Uaktualnienie (19 styczeń, 2015)
Nie pracuję już na uczelni i nie będę odpowiadał na prośby i pytania dotyczące
Lematyzatora. Projekt (kod i dyskusja) przeniosła się do projektu
Morfologik stemming . Zarówno program
jak i ewentualne e-maile powinny być kierowane tam.
Uaktualnienie (27 wrzesień, 2006)
Poprawiono duży błąd w kodzie FSA. Nowe wersje (oraz repozytorium źródeł) jest
teraz częścią projektu Morfologik .
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 .
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 . 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 .
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:
-
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 .
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).
-
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.
-
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.
-
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...
-
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 .
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ł:
-
Proszę o powiadomienie e-mailem o chęci pobrania/ wykorzystania programu na
adres dawid.weiss@cs.put.poznan.pl.
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ż :).
-
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.
-
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ć.
-
Przeprowadzić parę eksperymentów, które pokazałyby jak zachowuje się
lematyzator na prawdziwych tekstach.
-
Sprawdzić ile słów z korpusu ispella Mirosława Prywaty
jest pokrywanych przez lematyzator.
-
Dodać nowe słowa do słownika (i przy okazji do ispella).
-
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ł.
- [Mirosław Prywata]
Flagi przedrostkowe (prefix) w ispellu tworzą zwykle wyrazy o znaczeniu przeciwnym, a na pewno różnym.
- [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 ;)
|