首先,我对Python非常陌生,所以如果我做了一些糟糕的事情,我会在这篇文章中面对一个抱歉。我被分配了这个问题:
我们想为下面的问题设计一个动态编程解决方案:有一串字符可能是一系列删除了所有空格的单词,我们希望找到一种方法(如果有的话)插入分隔有效英语单词的空格。例如,他们的故事可能来自“你的发泄”,“青年事件”或“他们出去发泄”。如果输入是theeaglehaslande,则没有这样的方法。您的任务是以两种不同的方式实现动态编程解决方案:
假设单词的原始序列没有其他标点符号(例如句号),没有大写字母,也没有专有名称 - 所有单词都将在提供给您的字典文件中提供。
所以我有两个主要问题:
我想要的是什么:
一如既往地感谢任何人给予这一点的任何时间和努力,我们总是感激不尽。
这是我的尝试:
#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]
答案 0 :(得分:3)
有关如何进行英语分词的另一个真实示例,请查看source的Python 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)
Here is the solution。阅读并理解概念,然后实施。
这个video对理解DP方法非常有帮助。
我认为可以提供帮助的另一种方法是Trie数据结构。这是解决上述问题的更好方法。