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

时间:2016-05-26 21:27:09

标签: java algorithm linguistics

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

看看这个波兰人,未完成的,下降者: 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);

等。这些只是此方法具有的几十个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";
    }
}

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

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

干杯

2 个答案:

答案 0 :(得分:1)

尽管我自己是波兰语母语人士,但我的答案将与您计划中的代码模式有关。正如其他人所指出的那样,桌子是要走的路。但是,您可以尝试使用Command模式重构长if / else个块。有关图表,请参阅this page

答案 1 :(得分:1)

我相信,正确的方法是从一本好的形态学书籍中复制一个算法(具有许多实用功能和条件),然后将其作为大型单元测试在大词典上进行修饰。

更新到我的俄罗斯磁偏角库的链接: https://github.com/georgy7/RussianNounsJS