2016-05-26 47 views
5

注意!!這將有助於很多知道波蘭或任何其他具有強烈的彎曲自然語言,最好與案例系統(如德國人),以回答這個問題。特別是,波蘭的變格系統非常相似,像其他斯拉夫語的系統:俄語,捷克語,塞爾維亞語等一種波蘭/斯拉夫語名詞變體的算法

看一看這個波蘭,未完成的,declinator: declinators.com 我打算將其擴展到其他語言,即俄語和拉丁語,但現在我正在與波蘭人苦苦掙扎。

除了擁有數百個名詞的大量數據庫,我支持不存在的衰落名詞。 直到現在我想出的最好的解決方案是簡單地檢查名詞的結尾,以便它們可以相應地被拒絕。

在我的代碼中,它涉及到這calculateDeclination方法。如果名詞不在數據庫中,我稱之爲它。該方法的內臟是這樣的:

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); 

等,這些都是隻有前三幾十else if條款此方法的。

示範declinator的代碼如下所示:

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"; 
    } 
} 

因此,這裏的問題,還有沒有其他的,更優雅的算法來減少波蘭的話嗎?它是否必須有很多if else子句?我必須爲每種類型的名詞寫出如此多的declinators嗎?

這個問題告訴我波蘭變格規則是多麼的簡單和令人難以置信。它讓我的算法變得無聊而單調。希望你們中的一位能幫助我使它變得有趣和簡潔!

乾杯

+1

表驅動的軟件適用於這種事情。 – user3386109

+1

我會盡快爲俄文發佈一個=)https://github.com/georgy7/russian_nouns/blob/gh-pages/js/RussianNouns.coffee它幾乎完成單詞形式的單詞。 –

回答

1

儘管自己是一個母語波蘭語揚聲器,我的答案會屬於你的程序代碼模式。正如其他人指出的那樣,桌子是要走的路。但是,您可以嘗試使用命令模式重構長塊。有關圖表,請參閱this page