niedziela, kwietnia 15, 2007

Jak automatycznie zmienić słowo "laka" w "łąka"? :-)

Bazując na prostym spell checkerze, który opisywałem w poprzednim wpisie postanowiłem sprawdzić, czy można by było zautomatyzować proces zamiany tekstów zapisanych "polskawym" na takie z polskimi znakami :-)Samo rozwiązanie wydaje się być proste, w przypadku tekstu zapisanego "polskawym" czyli bez polskich znaków wystarczy rozważyć tylko kandydaturę słów, które powstaną poprzez zamianę odpowiedników polskiej literki na polską literkę.Np. dla słowa "laka", sprawdzić musimy: "laka", "laką", "ląka", "ląką", "łaka", "łaką", "łąka", "łąką". Sensownymi słowami są "łąka" i "łąką", wybieramy więc to które było bardziej prawdopodobne w tekście uczącym.Oczywiście może wprowadzić to nowy błąd :-) Wydaje się jednak, że tak automatycznie "upolskowiony" tekst będzie łatwiej poprawić niż ręcznie zmieniać cały tekst zapisany "polskawym".W celu stworzenia narzędzia poprawiającego tekst bez polskich liter na taki z polskimi znakami wystarczy w kodzie Petera Norviga zmienić definicję funkcji words i edits1:
def words(text): return re.findall('[a-z,ąćęłńóśżź]+', text.lower()) [...]pl = 'ąćęłńóśżź'pd = 'acelnoszz'def edits1(word): n=len(word) m=len(pd) z=set([word[0:i]+pl[c]+word[i+1:] for i in range(n) for c in range(m) if word[i:i+1]==pd[c]]) return z
Dla przykładu tłumacz nauczony tekstem książki "Ostatni rozdział czyli paragraf 22 bis" tekst "Ten ktory wyszedl, nie poszedl sobie stad. On poszedl precz, bo mu sie tu nie podobalo" przetworzył na "ten który wyszedl, nie poszedł sobie stąd on poszedł precz, bo mu sie tu nie podobało".Błędne pozostawienie "sie" wynika z faktu, iż w tekście było troszkę niemieckich wstawek, a więc i słowo "sie" zostało uznane za nieskończenie bardziej prawdopodobnie niż słowo "się" [szczegóły dlaczego tak, a nie inaczej w artykule Petera Norviga :-)]Mimo wszystko skuteczność na poziomie 70% byłaby niezła :-)


Podobne postybeta
Prosty spell checker, czyli jak umiejętnie połączyć teorie z praktyką
Ciekawy artykuł
Testowanie upolskawiacza
Statystyka
Plan lekcji - wersja hard ;-)

5 komentarzy:

  1. Przemek, ale laka to też polskie słowo. Określa pewną odmianę żywicy - takiej z drzewa :-)

    OdpowiedzUsuń
  2. Na szczęście mój model nie znał tego słowa :-)

    OdpowiedzUsuń
  3. Ale jeśli nie miałby to być spell-checker, tylko narzędzie do zamiany polskawego na polski, to nawet bym go słowa "laka" nie uczył... Słowo jest rzadkie i idę o zakład, że jeszcze rzadziej używane jest w polskawych tekstach (jak ktoś już pisze o sztuce japońskiej np. to pewnie i używa polskich liter). Gorzej z odmianą, np.: pika/piką i pospolitymi wyrazami: rodzic/rodzić czy splatać/spłatać.
    Co za język... Informatyczny koszmar po prostu.

    OdpowiedzUsuń
  4. Problem w wykorzystaniu modelu probabilistycznego do dodawania polskich znaków, czy korekty ortografii tkwi w tym, że brakującą informację zawartą w polskich znakach próbujemy "zgadnąć" bazując na tym modelu.
    Na razie szybkie i "brudne" testy które wykonuję na boku wskazują, że jakość poprawek jest znośna, ale trudno mi jeszcze ocenić ich użyteczność :-) [liczenie słów z polskimi znakami nie jest najprzyjemniejszym i najprostszym zadaniem ;-) a nie miałem czasu popełnić narzędzia do tego ;-)]

    OdpowiedzUsuń
  5. Zadanie upolskawiania, czyli tłumaczenia polskawego na polski jest ambitne. Stosowałem w czasach wczesnego Internetu prosty system, który wymagał od autora pewnego wysiłku (stosował kodowanie po lewej):

    a/ ==> ą
    c' ==> ć
    e/ ==> ę
    l/ ==> ł
    n' ==> ń
    o' ==> ó
    s' ==> ś
    z' ==> ź
    z^ ==> ż

    i napisałem także programy w C (są trywialnie proste) do tłumaczenia tego typu kodów, jedne na drugie i z powrotem (ISO, Windows, ...). Niechlujni internauci przypisali w pewnym momencie mój powyższy system kodowania bardziej poważanemu internautowi :-), ale to już głupstwo. Powtarzam, że takie mechaniczne 1-1 tlumaczenia są trywialnym projektem w porównaniu z "upolskawianiem". Jednak jako autor trochę ten swój sytem stosowałem, a z czasem mój program dodawał HTMLowską oprawę (jako opcję).

    OdpowiedzUsuń