【问题标题】:dynamic programming word segmentation动态规划分词
【发布时间】:2012-10-29 19:50:01
【问题描述】:
假设我有一个像 'meetateight' 这样的字符串,我需要使用动态编程将它分割成有意义的单词,比如 'meet' 'at' 'eight'。
为了判断一个块/段“x = x1x2x3”有多“好”,给我一个黑盒子,在输入 x 上,它返回一个实数 quality(x),这样:一个大的正值 quality( x) 表示x接近英文单词,大的负数表示x远离英文单词。
我在设计算法方面需要帮助。
我尝试考虑一种算法,在该算法中,只要质量下降,我就会根据它们的质量和分段迭代地添加字母。
但这在上面的例子中失败了,因为它切断了我而不是见面。
我需要更好的算法建议。
谢谢
【问题讨论】:
标签:
algorithm
theory
text-segmentation
【解决方案1】:
如何使用英语词典构建Trie 并向下导航,使用所有可能的叶子路径扫描您的字符串(当您有多个选择时回溯)。
【解决方案2】:
我在my blog写了一个程序来做这个;这里太长了。基本思想是切掉构成单词的前缀,然后递归处理输入的其余部分,在无法拆分整个字符串时回溯。
【解决方案3】:
您可以使用动态编程,并跟踪输入的每个前缀的分数,一次添加一个字母。每次添加一个字母时,看看是否可以在您已经使用过的前缀上添加任何后缀(选择得分最高的一个)。例如:
m = 0
me = 1
mee = 0
meet = 1
meeta = 1 (meet + a)
meetat = 1 (meet + at)
meetate = 1 (meet + ate)
meetatei = 1 (meetate + i)
meetateig = 0
meetateigh = 0
meetateight = 1 (meetat + eight)
要处理介于 0 和 1 之间的值,可以将它们相乘。还要保存你用过的单词,这样你就可以在最后分割整个字符串。