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