注意!! 了解波兰语或任何其他具有强烈屈曲性的自然语言,最好是带有格系统(例如德语),将有很大帮助回答这个问题。特别是,波兰语变格系统与其他斯拉夫语言系统非常相似,例如:俄语、捷克语、塞尔维亚语等。
看看这个未完成的波兰偏角: 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子句吗?我必须为每种类型的名词写那么多变格词吗?
这个问题向我展示了波兰语变格规则是多么简单和多得令人难以置信。它使我的算法变得乏味和单调。希望你们中的一位能帮助我让它变得有趣和简洁!
干杯
最佳答案
尽管我的母语是波兰语,但我的回答将与您程序中的代码模式有关。正如其他人所指出的那样,表格是必经之路。但是,您可以尝试使用命令模式重构长 if
/else
block 。参见 this page一张图。
关于java - 波兰/斯拉夫语言名词变格算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37471296/