我正在考虑如何构建一个跨语言词典,它存储“基本”单词(例如“创建”,“创建”等),并且不存储派生单词(例如“创建”, “创造”、“创造”、“创作”等)。它不存储派生词,而是存储某种规则,指定如何创建派生词。
一条规则可能是“如果单词以 -p 结尾,并且我们要添加 -ing,则执行 -pping”,因此“flip”变为“flipping”等。不将派生单词存储在字典中的原因英语中至少有数百万个这样的单词(只有几十万个“基本”单词),而在土耳其语等某些语言中,可能有大约无限数量的派生单词。
问题是,算法应该如何大致确定派生词是否在字典中?
我们可以有一个Trie来存储基本单词,但是前缀和后缀呢(暂时忽略中缀和外接符)呢?当组合点改变前一个块的结尾和/或后一个块的开始时(例如“翻转”在中间添加额外的“p”等)又如何?我主要想知道在执行此操作时是否需要执行前向/后向操作,或者我是否可以直接浏览前缀列表,然后是基本单词列表,然后是后缀列表。
对于“flipping”,我在基本词trie中看到“flip”,然后我们遇到“p”,没有不在字典中,所以检查后缀。如果最后一个片段以“p”结尾,后缀可以插入“p”...那么还记得最后一个字符吗?或者也许有更多的情况,它不仅仅是最后一个字符,而是最后几个字符...因此,反向遍历后缀“最后一个片段以”结尾的属性(可能是反向特里树),我们发现我们的单词以“p”结尾,我们有几个后缀(让我们假设)。现在如何过滤到正确的后缀?也许我们尝试所有后缀?尝试“-p-p-ed”,我们得到“翻转”,不,不匹配。尝试“-p-p-ing”,好吧,匹配,我们找到赢家。
到目前为止看来:
类似这样的事情吗?你会如何实现这个目标?
没有任何算法可以在没有任何额外信息的情况下绝对完成此任务,因为语言很奇怪。这有几个问题:
那么你如何解决这个问题呢?您可以使用 nltk 等工具找出某个单词的“词性”。我建议您使用 wordnet 生成单词的同义词集(同义词集),并找到具有多种含义的单词的词性(同样,例如 shed)。然后,删除所有仅充当动名词、复数名词或非现在时动词的单词。