12.3.10

Testy segmentacji

Do niedawna nie było dla polszczyzny korpusu, w którym ręcznie zweryfikowano by podział na zdania (a przynajmniej ja nic o dostępności takiego zasobu nie wiedziałem). Całe szczęście, trwają prace nad Narodowym Korpusem Języka Polskiego – i obejmują one także ręczne oznaczenie tekstu, w tym podział go na zdania. Uzyskałem do testów próbkę obecnie opracowywanego tekstu, aby móc przetestować swoje reguły.
Okazało się, że stosujemy nieco inne konwencje – np. ja uznawałem, że liczby porządkowe na początku zdań są osobnym elementem, a nie fragmentem zdania (w OpenOffice.org takie liczby generowane automatycznie nie są w ogóle widoczne dla LanguageTool). Ale po ujednoliceniu takich konwencji przystąpiłem do testów. Wykryłem trochę usterek w regułach SRX, usunąłem je i wyniki są obecnie następujące.
W próbce było 42426 znaczników podziału (dalej oznaczone jako Z). Dokładność (precision) podziału wyniosła 0,993234. Kompletność (recall) 0,998353. Poprawność (accuracy) 0,991609. (Wszystkie te parametry liczyłem jako ilorazy, odpowiednio Z oraz sumy Z i podziałów dodanych przez SRX; Z oraz sumy Z i podziałów brakujących w pliku posegmentowanym przez SRX; wreszcie Z oraz sumy Z i podziałów dodanych przez SRX i brakujących w SRX).
Nie da się dojść, rzecz jasna, mechanicznymi środkami typu reguły SRX, do poziomu 1, bo niektóre podziały zależą od analizy znaczeniowo-logicznej zdania. Ale jest całkiem już nieźle! :)

AKTUALIZACJA: przy właściwym ustawieniu segmentacji na końcach wierszy udało się uzyskać kompletność równą 1 (to trochę artefakt wynikający z przetwarzania danych wejściowych) i dokładność 0,996933.

AKTUALIZACJA 2: po zamianie końców wierszy na spacje, udało się uzyskać bardziej wiarygodny wynik, mianowicie kompletność wynosi 0,994935, a dokładność – 0,997027. Przy zamianie 50% końców wierszy na spacje i usunięciu 50% wierszy kompletność spadła do
0,949978, a dokładność do 0,997426. Przy usunięciu wszystkich spacji wyniki były odpowiednio 0,909843 (kompletność) i 0,997695 (dokładność). Ponieważ w tekstach brak spacji lub końca wiersza po kropce przed kolejnym zdaniem jest zjawiskiem sporadycznym (lecz jego częstość w języku jest trudna do oszacowania ze względu na to, że w przetworzonych korpusach występują już całe zdania), w wypadku innych tekstów kompletność powinna być bliższa wartości z przedziału od 0,994935 a 0,949978, co jest całkiem niezłym wynikiem.

5 komentarzy:

Adam Radziszewski pisze...

Wyniki są bardzo obiecujące!

W związku z tym jestem ciekaw jednej kwesti implementacyjnej. O ile dobrze zrozumiałem z artykułu, to używana implementacja SRX-a jest bardzo naiwna: dla każdego znaku odpalamy sekwencyjnie wszystkie "pozytywne" wyrażenia regularne z pliku, a wspomniana optymalizacja polega na tym, że nie odpalamy "negatywnych", o ile żadne "pozytywne" wyrażenie nie zostanie spełnione ("pozytywne" to te z break="yes"). Czy tak faktycznie to działa?

Marcin Miłkowski pisze...

W artykule Jarek opisał algorytm ze specyfikacji i określił jedną dodatkową optymalizację, ale jest kilka dodatkowych. Np. żeby przyspieszyć przetwarzanie, konkatenujemy wyrażenia regularne, łącząc je nawiasami, ale nawiasami niegrupującymi (:? ). Ale najlepiej pytać Jarka, bo on odpowiada za bibliotekę segment, ja robiłem same reguły.

Adam Radziszewski pisze...

Dziękuję za odpowiedź! Faktycznie takimi nawiasami można wymusić utworzenie jednego transduktora z wielu wyrażeń regularnych.

To mam jeszcze jedno pytanie co do samych reguł :) W pliku SRX niektóre kropki nie są poprzedzone znakiem "\". Czy to pomyłka? Np.: \bk.k\.\s, \bm.in\.\s., \bk.p.a\.\s

Marcin Miłkowski pisze...

Tak, pomyłka. W tych wypadkach chyba dosyć niewinna, ale i tak poprawię.

Marcin Miłkowski pisze...

Poprawione w CVS.