Dynamic 有人知道使用动态规划的分词算法吗?
如果你在谷歌上搜索分词,确实没有很好的描述,我只是想完全理解动态编程算法将字符串分割成单个单词的过程。有人知道一个地方有一个很好的分词问题的描述,或者有人能描述它吗 分词基本上就是提取一个字符串,如果你不知道的话,决定在哪里把它分割成单词。使用动态规划,它会考虑一些子问题。这是非常简单的使用递归,但我还没有能够找到任何地方在线找到,甚至只是一个迭代算法的描述,为这个在线,所以如果有任何人有任何例子或可以给出一个算法,这将是伟大的Dynamic 有人知道使用动态规划的分词算法吗?,dynamic,word,iteration,text-segmentation,Dynamic,Word,Iteration,Text Segmentation,如果你在谷歌上搜索分词,确实没有很好的描述,我只是想完全理解动态编程算法将字符串分割成单个单词的过程。有人知道一个地方有一个很好的分词问题的描述,或者有人能描述它吗 分词基本上就是提取一个字符串,如果你不知道的话,决定在哪里把它分割成单词。使用动态规划,它会考虑一些子问题。这是非常简单的使用递归,但我还没有能够找到任何地方在线找到,甚至只是一个迭代算法的描述,为这个在线,所以如果有任何人有任何例子或可以给出一个算法,这将是伟大的 谢谢您的帮助。我假设我们这里讨论的不是简单的大小写(也就是说,不只
谢谢您的帮助。我假设我们这里讨论的不是简单的大小写(也就是说,不只是在空格周围拆分字符串,因为这只是一个基本的标记器问题),而是如果没有明确的单词分隔符字符,那么我们就必须“猜测”字符串->单词的最佳匹配是什么-例如,一组不带空格的串联单词的情况,例如:
lotsofwordstogether
为此:
lots, of, words, together
在这种情况下,动态规划方法可能是计算出一个表,其中一个维度对应于序列中的
M
th个字,另一个维度对应于输入字符串中的每个N
th个字符。然后,您为表格的每个正方形填写的值是“如果我们在位置N
处结束(或者开始)第M
个单词,我们可以得到的最佳匹配分数。”(主要思想是将问题分解为:在输入的某个范围内找到正好有1,2,3..n个分词的分词。请原谅,如果有任何小的索引错误,我现在的头脑非常模糊。但这是一个迭代解决方案。)
静态列表连接器(列表令牌){
//使用而不是数组,键是from'int'
映射数据=新的HashMap();
int n=tokens.size();
对于(int i=0;i
源代码位于,以下是相关的代码片段:
def segment(text):
"Return a list of words that is the best segmenation of `text`."
memo = dict()
def search(text, prev='<s>'):
if text == '':
return 0.0, []
def candidates():
for prefix, suffix in divide(text):
prefix_score = log10(score(prefix, prev))
pair = (suffix, prefix)
if pair not in memo:
memo[pair] = search(suffix, prefix)
suffix_score, suffix_words = memo[pair]
yield (prefix_score + suffix_score, [prefix] + suffix_words)
return max(candidates())
result_score, result_words = search(clean(text))
return result_words
def段(文本):
“返回“text”最佳分段的单词列表。”
memo=dict()
def搜索(文本,上一个=“”):
如果文本=“”:
返回0.0,[]
def候选者():
对于除法(文本)中的前缀和后缀:
prefix_score=log10(分数(前缀,prev))
pair=(后缀、前缀)
如果备忘录中没有配对:
备注[对]=搜索(后缀、前缀)
后缀\分数,后缀\单词=备注[配对]
产量(前缀分数+后缀分数,[前缀]+后缀单词)
返回最大值(候选项()
结果分数,结果单词=搜索(清除(文本))
返回结果\u个字
注意memo
如何缓存对search
的调用,然后从候选者中选择最大值
为什么这比在每个空格处拆分字符串更难?请参见我的答案,例如,d。是的,为字符串删除空格。Dav,如果您有一个如果单词是有效的,那么您还必须检查单词是否有效?我很难准确理解您的实现。如果我在这里出错,请随意更正索引
def segment(text):
"Return a list of words that is the best segmenation of `text`."
memo = dict()
def search(text, prev='<s>'):
if text == '':
return 0.0, []
def candidates():
for prefix, suffix in divide(text):
prefix_score = log10(score(prefix, prev))
pair = (suffix, prefix)
if pair not in memo:
memo[pair] = search(suffix, prefix)
suffix_score, suffix_words = memo[pair]
yield (prefix_score + suffix_score, [prefix] + suffix_words)
return max(candidates())
result_score, result_words = search(clean(text))
return result_words