31.8.06

Interpunkcja

Zacząłem formalizować zasady polskiej interpunkcji. Wiedziałem, że to nie będzie proste, więc nie spieszyło mi się z tym. Komplikacje wynikają z tego, że polska interpunkcja częściowo opiera się na kryterium składniowym, częściowo intonacyjnym, a w dodatku istnieje szereg reguł dodatkowych (na przykład reguła cofania przecinka w wypadku zbiegu dwóch spójników w tzw. spójniku zestawionym). Co prawda, znakomity Słownik interpunkcyjny prof. Podrackiego pomaga mi na co dzień, ale przekształcenie zawartej w nim wiedzy nie jest zadaniem banalnym (zwłaszcza że nie wszystkie wyjątki obejmuje). Trudność szczególna wiąże się z wyrazami, które inaczej oddziela się w zdaniach złożonych, a inaczej traktuje w zdaniu pojedynczym:

Kup mi chociaż dwie bułki!

ale:

Kupił mi dwie bułki, chociaż groszem nie śmierdzi.

Innym problemem są wyrazy takie jak „jednak”, „bowiem”, „zaś”: można je umieszczać w różnej odległości od przecinka (szyk przestawny), więc trudno zbudować właściwą podpowiedź dla użytkownika. Czary goryczy dopełnia interpunkcja zdań takich jak:

Marek, który kupuje zdechłe koty, obdziera je ze skóry i produkuje kocie futra.

Chodzi oczywiście o przecinek przed „obdziera”.

Mimo to już zaprojektowałem w miarę znośne reguły dla prostych spójników, dla „żeby” i jego kolegów, dla „gdy” i „kiedy”...

Dotychczas dla języka polskiego nie istniał żaden skuteczny system poprawiania interpunkcji. Co prawda, w programie Microsoft Word (używam wersji 2000) istnieje korektor gramatyczny, ale reguły interpunkcyjne w nim zawarte są zbyt proste: każde zdanie zaczynające się od „Kiedy” chce traktować jako pytanie... Tymczasem częstszy jest błąd postawienia pytajnika na końcu zdania złożonego: „Jadzia pytała, jak się czujesz?”. Drugim uproszczeniem w istniejącym korektorze jest brak uwzględnienia niektórych spójników zestawionych (np. nie uwzględnia „a zatem”, „a więc”, „a jednak”, „niemniej przeto”, „właśnie gdy”).

25.8.06

Nowe języki w LanguageTool 0.8.5dev

W najnowszej, właśnie tworzonej wersji LanguageTool wbudowuję obsługę nowych języków.
Już wbudowałem obsługę francuskiego (będzie oparta na słowniku inDico Myriam Lechelt; reguły, mam nadzieję, pomoże rozwijać Laurent Godard z Indesko). Początkowo chciałem dodać obsługę na bazie Uniteksa, ale wg Laurenta ten słownik niekoniecznie jest oparty na licencji LGPLLR (LGPL for Language Resources). No cóż... Zmieniłem na poprawiony InDico.

Wprowadziłem język hiszpański z taggerem części mowy opartym na FreeLing. Niestety, sam słownik taggera był bardzo ubogi, bo w pakiecie FreeLing używa się wielu strategii heurystycznych (wg autorów skutecznych w ponad 90%). Dlatego też, żeby wyłuskać więcej informacji, po prostu otagowałem całą hiszpańską Wikipedię, a potem odfiltrowałem powstałe pliki. W wyniku powstał niezły słownik, FreeLing radził sobie z tym nieźle (wywaliłem literówki za pomocą hunspell -l).

To oczywiście przypomniało mi, że stosowany w LT tagger OpenNLP jest niestety statystyczny i dokonuje ujednoznacznienia (przez to nie zauważa błędów – solecyzmów – typu „Bill Gates earn a lot of money”, bo przypisuje „earn” kategorię IN!). Ale od czego Wikipedia angielska... Otagowałem ją OpenNLP, a potem skonstruowałem leksykon. OpenNLP nie rekonstruował leksemów w formie podstawowej (FreeLing to robi, ale co chwila się wywala, więc musiałem pokroić 500 MB tekstu na 300 porcji, żeby dodać 300 zanalizowanych nie do końca próbek). Okazało się jednak, że wyniki ma – delikatnie mówiąc – bardzo niedokładne. Być może dałoby się dla iluś form przeprowadzić zgrubne ilościowe oszacowanie, ale nie miałem ochoty na tę zabawę.
Nowy tagger dla angielskiego oparłem na listach słów Kevina Atkinsona na sourceforge. Zawierały one formy podstawowe i niezłe znaczniki gramatyczne (które poprawiłem w wielu wypadkach). Do tego ręcznie dorobiłem listę przyimków, czasowników modalnych itd. (za dostępnymi w sieci opisami tagsetu Penn TreeBank, który stosujemy). Po zmianie taggera okazało się, że ujawniło się więcej fałszywych alarmów w niektórych regułach, ale zasadniczo LT działa szybciej i dokładniej. :) A porównanie taggerów słownikowych, statystycznych – kontekstowych i statystycznych – morfologicznych to już sprawa na osobny artykuł naukowy.

Inną strategię przyjmę dla włoskiego. Jest bowiem dostępny przyjemny słownik Morph-IT! Marco Baroniego; spory, więc powinien wystarczyć. Ostatnio został nawet zaktualizowany przez autora :)

Zupełnym zaskoczeniem była też wiadomość Jagana Nadha, który buduje słownik morfologiczny dla języka Malayalam. To jeden z wielu oficjalnych języków w Indiach; mówi nim około 30 milionów osób i dopiero od niedawna ma słownik ortograficzny. Martwi mnie to, że mają własny alfabet, ale zdaje się istnieje jednoznaczna transkrypcja fonetyczna na zwykły alfabet łaciński. Zobaczymy, jak to się dalej potoczy.

Prawdopodobnie trzeba będzie utworzyć angielski samouczek dla osób przystosowujących LT do kolejnych języków. No i przyda się kreator reguł, najlepiej z testerem online w czasie rzeczywistym... A do tego potrzebny jest serwer obsługujący Javę w czasie rzeczywistym. Sourceforge.net ma Javę 1.4 (za słabą). Kreator powinien być zapewne w PHP i obsługiwać dodawanie nowych reguł i edycję istniejących (po uwierzytelnieniu), a po zatwierdzeniu reguły automatycznie uruchamiać test. Prace nad tym trwają.

21.8.06

LanguageTool 0.8.4

Pojawiła się wersja 0.8.4 korektora gramatycznego i stylistycznego LanguageTool. Nowości:
  • wiele nowych reguł dla języka polskiego, niemieckiego i angielskiego;
  • zmniejszenie objętości słowników programu (przy zwiększeniu ich zasobu leksykalnego) dzięki użyciu innego formatu binarnego, tj. fsa Jana Daciuka;
  • możliwość schowania narzędzia w prawej części paska zadań systemu (przetestowano w systemach Windows i Linux); po maksymalizacji LanguageTool automatycznie sprawdza tekst, który został skopiowany do schowka;
  • zmieniona składnia reguł, umożliwiająca skuteczne zakodowanie większości wyszukiwanych błędów, w tym podawanie formy podstawowej i korzystanie z wyrażeń regularnych;
  • przy sprawdzaniu „fałszywych przyjaciół” (wyrazów zdradliwych) pojawiają się teraz podpowiedzi – niewiele jest ich dla języka polskiego, bo nie był to mój priorytet;
  • możliwość zapisu konfiguracji w katalogu domowym.
Niestety, okazało się, że moduł działający w OOo zawiera błąd, a mianowicie nie sprawdza tekstów dłuższych niż około 64 tysiące znaków. Rozwiązanie będzie w kolejnej wersji (nie chcieliśmy zatrzymywać wydania, bo trzeba by czekać kolejne tygodnie).

Przygotowana została także wersja Java Web Start, którą można uruchomić bez instalowania programu LanguageTool na dysku twardym: kliknij tutaj, aby uruchomić LanguageTool (wersja testowa, coś może nie działać!).
Wersja do pobrania – www.danielnaber.de/languagetool/.

Instalacja na dysku:

  • W programie OpenOffice.org (testowano tylko wersję 2.0)
    • Kliknij polecenie Narzędzia > Menedżer pakietów > Dodaj, a następnie wybierz plik LanguageTool-0.8.4.zip (bez rozpakowywania). Po otwarciu nowego okna edytora OpenOffice.org Writer (naciśnij klawisze Ctrl+N) w menu pojawi się nowe menu LanguageTool, które zawiera polecenie Check text... służące do sprawdzania tekstu.
  • Bez programu OpenOffice.org
    • Rozpakuj archiwum do jakiegoś katalogu, a następnie rozpakuj także archiwum standalone-libs.zip do tego samego katalogu (konieczne do obsługi funkcji chowania na pasku zadań). Uruchom plik LanguageToolGui.jar, klikając go dwukrotnie. Jeśli na danym komputerze nie skonfigurowano skojarzenia dla plików *.jar, uruchom program z wiersza poleceń za pomocą polecenia java -jar LanguageToolGUI.jar. Plik LanguageTool.jar jest natomiast korektorem działającym z poziomu wiersza poleceń.

17.8.06

Stempelator 1.0.3

Do pobrania jest już nowa wersja biblioteki Stempelator, którą wykorzystujemy w korektorze gramatycznym.

Morfologik 0.5 do pobrania

Do pobrania jest kolejna wersja słownika morfologicznego. Nowości:
  • synchronizacja ze słownikiem alternatywnym (więcej nazw własnych, poprawki, nowe wyrazy), m.in. usunięcie form potencjalnych (–łom, -łoś) i zaprzeczonych form liczby mnogiej gerundiów;
  • oznaczenie prostego stopnia wyższego i najwyższego przymiotników;
  • wprowadzenie specjalnego znacznika dla wyrazów, które mogą być zaprzeczane („pneg”); odpowiednik flagi „b” w słowniku alternatywnym;
  • zaimki osobowe i dzierżawcze;
  • więcej form regularnych (dzięki słownikowi alternatywnemu);
  • usunięcie błędnej postaci znacznika dla narzędnika (instr -> inst).
Łączna liczba form w słowniku: 3226649.

11.8.06

Kolejna wersja słownika - 0.4

Niedługo na serwerach sourceforge.net pojawi się wersja 0.4 słownika morfologicznego. W stosunku do nowej wersji są następujące zmiany:
  • ręcznie poprawiłem i przejrzałem wszystkie flagi i anotacje;
  • uzupełniłem brakujące znaczniki części mowy;
  • uporządkowałem kod, usunąłem błędy.
W wyniku powstał słownik zawierający 3286849 form wyrazowych, a więc większy od poprzedniego o 313020 hasła (poprzedni zawierał 2973829 form). Jest to chyba obecnie największy słownik morfologiczny dla języka polskiego :)

Znaczniki form wymagają jeszcze dokładniejszego przejrzenia, ale grubych byków już raczej nie ma, są drobniejsze usterki. Zupełnie nie przejmowałem się zaznaczaniem różnicy między różnymi odmianami rodzaju męskiego, to trzeba będzie robić później.

1.8.06

Słownik alternatywny: alternatywna wersja ortograficzna

Słownik alternatywny jest stosowany w całości jako do tworzenia słownika korektora ortograficznego. Tymczasem w grze dopuszczalne są tylko niektóre wyrazy. Myślę, że z tego samego powodu do korektora pewne wyrazy dopuszczalne w grach nie powinny być wprowadzane. Dotyczy to niesłychanie rzadkich form potencjalnych, które mogą być mylące, oraz bardzo rzadkich, mylących wyrazów. Oto wstępna lista:

  1. zaprzeczone rzeczowniki odsłowne w liczbie mnogiej (np. nieprzyjść, niezdań, niebyć, niewejść): są one generowane skryptem na podstawie bazy słownikowej z flag i oraz j; ten skrypt ewidentnie generuje flagi UV, a powinien tylko U (np. z być/BeGHj tworzone jest też niebycie/UV na podstawie form z flagi j, przynajmniej tak mi się wydaje).
  2. juz
  3. som
  4. sie (ręczne dodanie formy „siego” zamiast „si”)
  5. duha (?)
  6. pokuć (forma rozkazująca „pokuj”)
  7. łaba
  8. tłomaczyć
  9. formy czasu przeszłego kończące się na -łom i -łoś (nikt przy zdrowych zmysłach nie mówi o sobie ani do kogoś w rodzaju nijakim!); modyfikacja kilku przyrostków dla flagi H i F jest konieczna, czyli tylko plik afiksów
  10. tryb rozkazujący od móc, woleć, musieć (móż południowych ;)
  11. liczba mnoga nazw własnych – pełna dyskusja tutaj
  12. [raczej nie ma sensu: usunięcie formy -yj, -ij (np. dyferencyj) - wywalić flagę C z pliku afiksów i słownika ortograficznego]