code: def viterbi_segment(text, P):
      
      # best[i] = best probability for text[0:i]
      # words[i] = best word ending at position i
      n = len(text)
      words = [''] + list(text)
      best = [1.0] + [0.0] * n
      ## Fill in the vectors best, words via dynamic programming
      for i in range(n+1):
          for j in range(0, i):
              w = text[j:i]
              if P[w] * best[i - len(w)] >= best[i]:
                  best[i] = P[w] * best[i - len(w)]
                  words[i] = w
      ## Now recover the sequence of best words
      sequence = []; i = len(words)-1
      while i > 0:
          sequence[0:0] = [words[i]]
          i = i - len(words[i])
      ## Return sequence of best words and overall probability
      return sequence, best[-1]
docs: Find the best segmentation of the string of characters, given the
      UnigramTextModel P.