Python:将复合词拆分为已知词(来自词典)

2024-05-23 15:29:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个非常有效的算法来执行以下操作:

我必须把任何语言中的复合词分开。例如英语。在

但是,当一个单词由两个单词组成,它们共享最后一个字母和第一个字母时,就会出现一个问题。在

也就是说,第一个单词以第二个单词开头的字母结尾。在

所以,我们有一本字典,里面有所有可能的单词,简短点:

假设我们想用这个例子来划分“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实时使用它来发音字典中没有的单词,但实际上包含的单词通常发音匹配。 不需要为我提供代码,只需要想法付诸行动。在


Tags: 方法代码算法列表字典show字母单词
2条回答

在这种情况下,你可以使用连字符算法或字典建议的单词中的音节分隔符。一个好的断字算法将告诉您light-show和{}正确地分解单词。在

但我不认为在任何情况下都能做到这一点,如果没有一个数据文件显式地将lightshow映射到{},并将{}映射到{}等等。无论你提出什么样的算法,都会出现出错的异常。在

Frank Liang的断字算法is available here for Python,并帮助您举两个例子之一:

>>> hyphenate_word("dataset")
['dataset']
>>> hyphenate_word("lightshow")
['light', 'show']

您可以尝试测试hyphenate_word()返回的音节组合(这应该是非常有效的,因为它在TeX中使用),如果找不到任何东西,请尝试您原来的方法。在

它在以下方面做得很好:

^{pr2}$

A handy list of compound words,还有一些{a3}。在

有两个因素会立即出现在我的脑海中,但是您可能需要先用您的数据集验证它。在

  1. 单词类型的权重。通常组合词是由名词组成的,所以如果你可以在N + Q和{}之间进行选择,N + N可能是正确的解决方案。从我的脑子里,我想不出一个例子,你更喜欢某个名词,但这一点你应该检查一下
  2. 单数和复数的重量。尤其是中间的“s”通常是复数形式的s,所以更喜欢S + X而不是{}

相关问题 更多 >