2016-05-26 43 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