2016-05-26 12 views
5

Uwaga !! Pomoże to dużo poznać polski lub dowolny inny język naturalny z silnym zgięciem, najlepiej z systemem spraw (np. Niemiecki na przykład), aby odpowiedzieć na to pytanie. W szczególności, Polski System deklinacja jest bardzo podobny do systemów innych językach słowiańskich, takich jak: rosyjski, czeski, serbski itpAlgorytm deklinacji rzeczowników języka polskiego/słowiańskiego

Wystarczy popatrzeć na tym polskim, niedokończone, declinator: declinators.com Mam zamiar przedłużyć go do innych języki: rosyjski i łaciński, ale na razie walczę z polszczyzną.

Oprócz posiadania dużej bazy danych deklinacji dla setek rzeczowników wspieram odmawiające rzeczowniki, które nie istnieją. Najlepszym rozwiązaniem, na które wpadłem, jest po prostu sprawdzanie końcówek rzeczowników, aby można je było odpowiednio odrzucić.

W moim kodzie sprowadza się do tej metody calculateDeclination. Nazywam to, jeśli rzeczownik nie znajduje się w bazie danych. Wnętrzności metody wyglądać następująco:

if (areLast2Letters(word, "il")) 
     declinator = new KamilDeclinator(word); 
else if (areLast2Letters(word, "sk")) 
     declinator = new DyskDeclinator(word); 
else if (isLastLetter(word, 'm')) 
     declinator = new RealizmDeclinator(word); 

itd. Są to tylko trzy pierwsze z kilkudziesięciu else if klauzul tej metody.

Kod przykładowego declinator wygląda następująco:

import static declining.utils.StringUtils.*; 

public class RealizmDeclinator extends realizm_XuXowiX_XemXieXieDeclinator{ 

    public RealizmDeclinator(String noun) { 
     super(noun); 
    } 

    @Override 
    protected String calculateStem() { 
     return word; 
    } 

    @Override 
    public String calculateLocative() { 
     return swap2ndFromEnd(stem, "ź") + "ie"; 
    } 

    @Override 
    public String calculateVocative() { 
     return swap2ndFromEnd(stem, "ź") + "ie"; 
    } 
} 

Więc tutaj jest pytanie, czy jest jakiś inny, bardziej elegancki algorytm dla upadających polskich słów? Czy musi zawierać tak wiele klauzul, jeśli nie? Czy muszę pisać tak wiele deklinatorów dla każdego rodzaju rzeczownika?

Ten problem pokazał mi, jak proste i niewiarygodnie liczne są polskie deklinacje. Dzięki temu mój algorytm był nudny i monotonne. Mam nadzieję, że jedno z was może mi pomóc uczynić go interesującym i zwięzłym!

Cheers

+1

Oprogramowanie sterowane tabelą sprawdza się w tego typu sytuacjach. – user3386109

+1

Niedługo wypuszczę jednego na rosyjski =) https://github.com/georgy7/russian_nouns/blob/gh-pages/js/RussianNouns.coffee Jest prawie kompletny dla pojedynczej formy słowa. –

Odpowiedz

1

Pomimo sobie bycie native speaker Polski, moja odpowiedź będzie odnosić się do kodu wzorce w swoim programie. Jak zauważyli inni, stoły są drogą do zrobienia. Możesz jednak próbować refaktoryzacji długich bloków if/else przy użyciu wzorca Polecenie. Zobacz diagram this page.