马尔可夫链随机句子生成:如何设置for循环使含标点的单词作为字典键且值为空列表
问题:马尔可夫链生成中,含标点的单词无法设置为空列表值
我正在尝试编写代码开发一个马尔可夫链,用于从字符串生成随机句子。我已完成字符串拆分并正在进行逻辑验证,当前代码如下:
string = '''how much wood could a woodchuck chuck if a woodchuck could chuck wood? as much wood as a woodchuck could chuck if a woodchuck could chuck wood.''' st_dict={} # 我漏写了words的定义,实际应该是words = string.split() for i in range(0, len(words)-1): #print(words) word=words[i] next_word=words[i+1] if word in ['.','?']: st_dict[word]=[] elif word in st_dict: st_dict[word].append(next_word) else: st_dict[word]=[next_word] st_dict[words[-1]]=[] print(st_dict)
我的需求是:任何包含标点的单词都应仅以空列表作为其对应的值,但目前无法实现该效果。我曾尝试在上述if语句外添加word not in ['.','?'... etc]的判断,但字符串中包含标点的单词仍会将下一个单词追加为其值。请问该如何解决这个问题?
解决方案
问题出在你的判断逻辑上:你当前检查的是word是否等于单独的标点符号(.或?),但实际字符串拆分后,标点是和单词绑定在一起的(比如wood?、wood.),所以这个条件永远不会触发,导致这些带标点的单词被当成普通单词处理,进而把下一个单词追加到它的列表里。
要解决这个问题,你需要修改判断逻辑,检测单词是否包含标点符号,而不是是否等于标点符号。同时记得补全words的定义(你当前代码里漏掉了words = string.split()这一步)。
修改后的代码如下:
string = '''how much wood could a woodchuck chuck if a woodchuck could chuck wood? as much wood as a woodchuck could chuck if a woodchuck could chuck wood.''' words = string.split() # 补全单词拆分步骤 st_dict = {} punctuations = ['.', '?'] # 定义需要检测的标点集合 for i in range(len(words) - 1): word = words[i] next_word = words[i+1] # 判断当前单词是否包含任意标点 if any(punct in word for punct in punctuations): st_dict[word] = [] else: if word in st_dict: st_dict[word].append(next_word) else: st_dict[word] = [next_word] # 统一处理最后一个单词:无论是否带标点,都设为空列表(无后续单词) last_word = words[-1] st_dict[last_word] = [] print(st_dict)
关键修改说明:
- 标点检测逻辑:用
any(punct in word for punct in punctuations)替代精确匹配,只要单词里包含指定标点,就将其对应值设为空列表。 - 补全单词拆分:添加
words = string.split()确保变量正确初始化。 - 最后一个单词处理:不管最后一个单词是否带标点,都设为空列表,符合马尔可夫链的终止逻辑(没有后续单词可关联)。
这样修改后,所有包含.或?的单词(比如wood?、wood.)都会被正确映射到空列表,不会再追加下一个单词。
内容的提问来源于stack exchange,提问作者Veneratu
相关产品推荐
相关产品推荐

