2016-01-13 75 views
0

编辑:错误固定Defaultdict()正确的选择?

的想法是从文件中读取文本,清洁,以及对连续单词(不permuations):

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] 

因此,引用给定对的字典将返回可以跟随该对的所有单词。例如。

wordsThatFollow[('she', 'was')] 
>> ['alone', 'happy', 'not'] 

我的算法来实现这涉及到一个defaultdict(名单) ...

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 

我不那么担心值错误我有规避“尝试 - 除了'(除非我应该)。问题是,该算法只有成功返回追随者之一:

wordsThatFollow[('she', 'was')] 
>> ['not'] 

很抱歉,如果这个职位是坏的社会,我盘算的事情了,因为我去^^

+0

你想改变'wordsThatFollow [元组(对[1])] =对第[i + 1] [1]' to words wordsThatFollow [tuple(pairs [i])] .append(pairs [i + 1] [1])< - - 你想添加到列表中,这是该对的值,而不是在每次迭代时重新定义它的值 – inspectorG4dget

回答

1

你的问题是您始终覆盖值,当你真的想延长它:

# Instead of this 
wordsThatFollow[tuple(pairs[i])] = pairs[i+1][1] 

# Do this 
wordsThatFollow[tuple(pairs[i])].append(pairs[i+1][1]) 
+0

有趣的是我发布这个回过头来,突然意识到这一点。可能是休息的时间。谢谢肖恩 –