使用动态编程进行分词

时间:2014-03-05 09:55:23

标签: python dynamic-programming text-segmentation

首先,我对Python非常陌生,所以如果我做了一些糟糕的事情,我会在这篇文章中面对一个抱歉。我被分配了这个问题:

我们想为下面的问题设计一个动态编程解决方案:有一串字符可能是一系列删除了所有空格的单词,我们希望找到一种方法(如果有的话)插入分隔有效英语单词的空格。例如,他们的故事可能来自“你的发泄”,“青年事件”或“他们出去发泄”。如果输入是theeaglehaslande,则没有这样的方法。您的任务是以两种不同的方式实现动态编程解决方案:

  • 迭代自下而上版本
  • 递归记忆版

假设单词的原始序列没有其他标点符号(例如句号),没有大写字母,也没有专有名称 - 所有单词都将在提供给您的字典文件中提供。

所以我有两个主要问题:

  1. 我知道这可以而且应该在O(N ^ 2)中完成,我不认为我的
  2. 查找表并未添加所有单词,以致可以降低时间复杂度
  3. 我想要的是什么:

    1. 任何类型的输入(更好的方法,你在代码中看到错误的东西,我如何使查找表工作,如何使用布尔表来构建一系列有效的单词)
    2. 关于如何处理递归版本的一些想法,虽然我觉得一旦我能够解决迭代解决方案,我将能够设计递归版本。
    3. 一如既往地感谢任何人给予这一点的任何时间和努力,我们总是感激不尽。

      这是我的尝试:

      #dictionary function returns True if word is found in dictionary false otherwise
      def dictW(s):
          diction = open("diction10k.txt",'r') 
          for x in diction:
              x = x.strip("\n \r")
              if s == x:
                  return True
          return False
      
      def iterativeSplit(s):
          n = len(s)
          i = j = k = 0
          A = [-1] * n
          word = [""] * n
          booly = False
          for i in range(0, n):
              for j in range(0, i+1):
                  prefix = s[j:i+1]
                  for k in range(0, n):
      
                      if word[k] == prefix:
                          #booly = True
                          A[k] = 1
                          #print "Array below at index k %d and word = %s"%(k,word[k])
                          #print A
                  # print prefix, A[i]
                  if(((A[i] == -1) or (A[i] == 0))):
                      if (dictW(prefix)):
                          A[i] = 1
                          word[i] = prefix
                          #print word[i], i
                      else:
                          A[i] = 0
          for i in range(0, n):
              print A[i]
      

2 个答案:

答案 0 :(得分:3)

有关如何进行英语分词的另一个真实示例,请查看sourcePython wordsegment module。它有点复杂,因为它使用单词和短语频率表,但它说明了记忆方法。

特别是,segment说明了记忆方法:

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

如果您替换了score函数,使其在字典中为单词返回“1”,如果没有则返回“0”,那么您只需枚举所有得分正确的候选人即可。

答案 1 :(得分:1)

C ++中的

Here is the solution。阅读并理解概念,然后实施。

这个video对理解DP方法非常有帮助。

我认为可以提供帮助的另一种方法是Trie数据结构。这是解决上述问题的更好方法。