Defaultdict() 是正确的选择吗?
Defaultdict() the correct choice?
编辑:错误已修复
想法是从文件中读取文本,清理它,然后配对 连续 个单词(不是排列):
file = f.read()
words = [word.strip(string.punctuation).lower() for word in file.split()]
pairs = [(words[i]+" " + words[i+1]).split() for i in range(len(words)-1)]
然后,对于每一对,创建一个列表,其中包含整个文本中可以跟在该对之后的所有可能的 单个 单词。该字典看起来像
[ConsecWordPair]:[listOfFollowers]
因此,引用给定对的字典将 return 该对之后的所有单词。例如
wordsThatFollow[('she', 'was')]
>> ['alone', 'happy', 'not']
我实现这个的算法涉及 defaultdict(list)...
wordsThatFollow = defaultdict(list)
for i in range(len(words)-1):
try:
# pairs overlap, want second word of next pair
# wordsThatFollow[tuple(pairs[i])] = pairs[i+1][1]
EDIT: wordsThatFollow[tuple(pairs[i])].update(pairs[i+1][1][0]
except Exception:
pass
我不太担心我必须用 'try-except' 规避的值错误(除非我应该是)。问题是算法 只成功 return 一个追随者 :
wordsThatFollow[('she', 'was')]
>> ['not']
抱歉,如果这 post 对社区不利,我正在解决问题 ^^
你的问题是当你真的想扩展时,你总是覆盖值:
# Instead of this
wordsThatFollow[tuple(pairs[i])] = pairs[i+1][1]
# Do this
wordsThatFollow[tuple(pairs[i])].append(pairs[i+1][1])
编辑:错误已修复
想法是从文件中读取文本,清理它,然后配对 连续 个单词(不是排列):
file = f.read()
words = [word.strip(string.punctuation).lower() for word in file.split()]
pairs = [(words[i]+" " + words[i+1]).split() for i in range(len(words)-1)]
然后,对于每一对,创建一个列表,其中包含整个文本中可以跟在该对之后的所有可能的 单个 单词。该字典看起来像
[ConsecWordPair]:[listOfFollowers]
因此,引用给定对的字典将 return 该对之后的所有单词。例如
wordsThatFollow[('she', 'was')]
>> ['alone', 'happy', 'not']
我实现这个的算法涉及 defaultdict(list)...
wordsThatFollow = defaultdict(list)
for i in range(len(words)-1):
try:
# pairs overlap, want second word of next pair
# wordsThatFollow[tuple(pairs[i])] = pairs[i+1][1]
EDIT: wordsThatFollow[tuple(pairs[i])].update(pairs[i+1][1][0]
except Exception:
pass
我不太担心我必须用 'try-except' 规避的值错误(除非我应该是)。问题是算法 只成功 return 一个追随者 :
wordsThatFollow[('she', 'was')]
>> ['not']
抱歉,如果这 post 对社区不利,我正在解决问题 ^^
你的问题是当你真的想扩展时,你总是覆盖值:
# Instead of this
wordsThatFollow[tuple(pairs[i])] = pairs[i+1][1]
# Do this
wordsThatFollow[tuple(pairs[i])].append(pairs[i+1][1])