我正在编写一个程序,使波兰语的单词变换。在这种语言中,词干在某些情况下会有所不同(因为腭化或移动/转瞬即逝的e和其他影响)。
例如,我们有单词“karzeł”,它是单词的基本词典形式。它的主干也是'karzeł'。但这个词的形式是“karła”,词干是“karł”。我们可以看到'e'消失,'rz'变为'r'。
另一个例子:
'uzda' - >干'uzd'
'uździe' - >干'uździ'
替代:'zd' - > 'ździ'
我想在词典中只存储词干的基本形式('karzeł'和'uzd'),当我把我的程序词'karł'或'uździ'放入时,它会找到合适的基本词干。交替仅发生在词干的末尾,最多包含4个字母。
有没有算法可以做到这一点? Levensthein距离平等对待所有字母,所以如果我输入'barzeł'字样,那么干'karzeł'的距离将小于干'karł'。
我还想到了神经网络,但我不确定如何对单词进行编码(给每个词干变异提供不同的ID?)。
另一个想法是编写算法,使反向交替产生一些东西,并创建一组可能的词干并尝试在词典中找到它们。
我想强调一点,我只想要商店的基本形式的干和其他一切在飞行中。
答案 0 :(得分:1)
首先,我记得有很多关于波兰形态的项目。所以我先看看他们,然后开始你自己的。
关于Levenshtein,正如Pierre在评论中正确指出的那样,距离函数可以定制。它应该是。让我这样说吧:想想Levenshtein不是一个算法本身,而是作为特定错误模型的解决方案。首先,他建议一个模型,当你输入一个单词时,由于某些随机过程(手指没有按下右键),每个字母都可以被删除或被另一个字母替换。然后,他的算法只是这个模型下最大似然解的生成器。您允许的错误越多,实际发生此错误序列的概率就越小,得分就越大。
你(含蓄地)陈述了一个非常不同的假设。波兰语最终可能具有一定的灵活性(在这个框架中你并不完全理解的一些语言过程)。然后,当您删除后缀(或看起来像一个)时,有三个选项: 1)你在这里所拥有的只是你在词典中存储的一种不同形式的词干,或者 2)它是一个完全不同的词干,或 3)你没有正确地剥掉你的后缀,你所拥有的东西根本就不是。 例如,您可以通过查看假设词干开头的多少个字母匹配某些字典条目来启发式地估计这些概率(如何找到这些条目是一个相关但不同的问题)。然后,您可以根据您的指标/启发式选择最合理的猜测。
现在,请注意您可以使用任何算法在字典中查找候选项。包括Levenshtein算法 - 只要您有理由确定正确的算法将被选中。但显然你最好编写自己的字典搜索算法,该算法遵循你自己的度量标准或模拟它。例如,通过给单词开头的字母变化提供最大/最高成本,并在结束时减少它。