我需要一个非常有效的算法来执行以下操作:
我必须把任何语言中的复合词分开。例如英语。在
但是,当一个单词由两个单词组成,它们共享最后一个字母和第一个字母时,就会出现一个问题。在
也就是说,第一个单词以第二个单词开头的字母结尾。在
所以,我们有一本字典,里面有所有可能的单词,简短点:
假设我们想用这个例子来划分“lightshow”这个词:
d = {"light": "Noun, S, N",
"lights": "Noun, P, N",
"how": "Q",
"show": "Noun, S, N",
...}
我的算法现在将单词分成两个列表:
^{pr2}$然后我找到左边最长的单词和右边列表中最长的单词。在
所以,我知道这个词是由哪些词组成的,它们在复合词中的开始和结束位置。在
现在不要担心单词不在dict中,单词不匹配的情况,我只想向您介绍这个方法的想法和我最大的问题。在
在整个算法的最后使用这种方法,结果将是:
["lights", "how"]
而不是:
["light", "show"]
是什么,你可以想象不可接受。在
哦,是的,我可以使用以下命令检查dict中是否存在单词show:
l = ["lights", "how"]
if l[0][-1]+l[1] in d: <repair the list>
但在实际中,我的算法递归地处理由两个以上单词组成的单词。在
它也处理用不同的大小写分开的单词
这就是为什么我没有完整地发布它,因为它是大的和优化的,所以它将是许多不重要的代码阅读。在
哦,是的,我可以做一些改进,把最后一个单词作为主单词。或者在选择哪一个先走的时候比较长度等等
但通过这些操作并不总是能够正确地作出决定。例如,如何处理在多个字母中相交的最长单词?在
我想在一个循环内完成。速度是必须的。在
注:我提供的字典是典型的。我要处理的数据集不包含任何关于单词类型的信息。只是它的发音,从中唯一有用的信息可以是这个词在说的时候是短还是长。在
希望在这里看到一些非常好的想法。记住,代码必须非常高效。TTS实时使用它来发音字典中没有的单词,但实际上包含的单词通常发音匹配。 不需要为我提供代码,只需要想法付诸行动。在
在这种情况下,你可以使用连字符算法或字典建议的单词中的音节分隔符。一个好的断字算法将告诉您}正确地分解单词。在
light-show
和{但我不认为在任何情况下都能做到这一点,如果没有一个数据文件显式地将},并将{}映射到{}等等。无论你提出什么样的算法,都会出现出错的异常。在
lightshow
映射到{Frank Liang的断字算法is available here for Python,并帮助您举两个例子之一:
您可以尝试测试
hyphenate_word()
返回的音节组合(这应该是非常有效的,因为它在TeX中使用),如果找不到任何东西,请尝试您原来的方法。在它在以下方面做得很好:
^{pr2}$A handy list of compound words,还有一些{a3}。在
有两个因素会立即出现在我的脑海中,但是您可能需要先用您的数据集验证它。在
N + Q
和{N + N
可能是正确的解决方案。从我的脑子里,我想不出一个例子,你更喜欢某个名词,但这一点你应该检查一下S + X
而不是{相关问题 更多 >
编程相关推荐