【发布时间】:2018-06-07 21:08:36
【问题描述】:
我需要一个非常有效的算法来执行以下操作:
我必须分隔任何语言的复合词。以英语为例。
但是当一个单词由共享最后一个和第一个字母的两个单词组成时,就会出现问题。
即第一个单词以第二个单词开头的字母结尾。
所以,我们有一个包含所有可能单词的字典,请简短:
假设我们想用这个示例性的 dict 拆分“lightshow”这个词:
d = {"light": "Noun, S, N",
"lights": "Noun, P, N",
"how": "Q",
"show": "Noun, S, N",
...}
我的算法现在将单词分块分成两个列表:
left = []; right = []
for x in range(len(word)-1, 1, -1):
ls = word[:x]; rs = word[x:]
if ls.lower() in d: left.append(ls)
if rs.lower() in d: right.append(rs)
然后我找到左边最长的单词和右边列表中最长的单词。
所以,我知道这个词由哪些词组成,以及它们在复合词中的开始和结束位置。
现在不用担心单词不在字典中,单词不匹配等过度杀伤的情况,我只是想向您介绍这个想法以及这种方法的最大问题。
在整个算法结束时使用这种方法,结果将是:
["lights", "how"]
代替:
["light", "show"]
什么是你可以想象的不可接受的。
哦,是的,我可以使用以下命令检查 dict 中是否存在单词 show:
l = ["lights", "how"]
if l[0][-1]+l[1] in d: <repair the list>
但这是不切实际的,我的算法也递归处理由两个以上单词组成的单词。
它还处理因大小写等不同而分开的单词。
这就是为什么我没有将其全部发布的原因,因为它很大且经过优化,因此需要阅读很多不重要的代码。
哦,是的,我可以做一些改进,让最后一个词成为主要。或者在选择哪个先行时比较长度等。
但并不总是可以通过这些操作做出正确的决定。例如,如果发现最长的单词与多个字母相交,该怎么办?
我想在一个循环中完成所有操作。速度是必须的。
注意:我提供的字典是典型的。我必须使用的数据集不包含有关单词类型的任何信息。只是它的发音,唯一有用的信息可以是这个词在说话时是短还是长。
希望在这里看到一些非常好的想法。请记住,代码必须非常高效。 TTS 实时使用它来发音不在字典中但实际上包含单词的单词,并且通常发音匹配。 无需向我提供代码,只需将想法付诸实施即可。
【问题讨论】:
标签: python