一种波兰语/斯拉夫语言名词变异的算法

GA1*_*GA1 5 java algorithm linguistics

注意!!知道波兰语或任何其他具有强烈屈曲的自然语言将有很大帮助,最好是使用案例系统(例如德语)来回答这个问题.特别是,波兰语的变形系统非常类似于其他斯拉夫语言的系统,如:俄语,捷克语,塞尔维亚语等.

看看这个波兰语,未完成的,declinator: declinator.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);
Run Code Online (Sandbox Code Playgroud)

这些只是else if这种方法的几十个条款中的前三个.

示例性下降器的代码如下所示:

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

所以这就是问题,还有其他更优雅的算法来减少波兰语单词吗?是否必须有这么多if else条款?我是否必须为每种类型的名词写下这么多的拒绝者?

这个问题向我展示了波兰的变态规则是多么简单和令人难以置信的数量.它使我的算法枯燥乏味.希望你们中的一个可以帮助我让它变得有趣和简洁!

干杯

luk*_*keg 1

尽管我的母语是波兰语,但我的答案将与您程序中的代码模式有关。正如其他人指出的那样,桌子是最佳选择。但是,您可以尝试使用命令模式重构长if/块。else请参阅本页的图表。