2016-01-13 4 views
0

EDIT: ошибка фиксированной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] [1]' to 'wordsThatFollow [кортеж (пары [i])] .append (пары [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

Самое смешное, что я публикую это, я смотрю назад и вдруг осознаю это. Вероятно, время для перерыва. Спасибо, Шон –

Смежные вопросы