【问题标题】:An algorithm for declension of nouns of Polish/Slavic languages波兰语/斯拉夫语名词的变格算法
【发布时间】:2016-05-26 21:27:09
【问题描述】:

注意!! 了解 波兰语 或任何其他具有强烈屈曲性的自然语言,最好是带有大小写系统(例如德语),这将有很大帮助回答这个问题。特别是,波兰语的变格系统与其他斯拉夫语言的系统非常相似,例如:俄语、捷克语、塞尔维亚语等。

看看这个波兰语,未完成的偏角器: 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 子句吗?我必须为每种类型的名词写这么多偏角吗?

这个问题向我展示了波兰语的变格规则是多么简单且数量惊人。这让我的算法变得乏味和单调。希望你们中的一个可以帮助我使它变得有趣和简洁!

干杯

【问题讨论】:

  • 表格驱动软件非常适合这种事情。

标签: java algorithm linguistics


【解决方案1】:

尽管我的母语是波兰语,但我的回答将与您程序中的代码模式有关。正如其他人所指出的,桌子是要走的路。但是,您可以尝试使用命令模式重构长 if/else 块。有关图表,请参阅 this page

【讨论】:

    【解决方案2】:

    我相信,正确的做法是从一本好的形态学书籍中重现一个算法(具有许多实用函数和条件),然后在大型字典上作为单元测试对其进行润色。

    更新了我的俄罗斯偏角图书馆的链接: https://github.com/georgy7/RussianNounsJS

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多