2015-04-15 4 views
3

Я новичок в python и пытаюсь создать цепочку марков. Другие примеры показывают использование экземпляра объекта, и я не так далеко ушел. Я еще не сделал случайный выбор части значений, но в основном я нахожусь в недоумении для моего вывода этого кода.Марковская цепочка в Python (новичок)

filename = open("dr-suess.txt") 

def make_list(filename): 
    """make file a list and a list of tuple tup_pairs""" 
    file_string = filename.read() #read whole file 
    file_list = file_string.split() #split on whitespace (not worrying about 
             # puncuation right now) 
    tup_pairs = [] 
    for i in range(len(file_list)-1): 
     tup_pairs.append((file_list[i], file_list[i+1])) #making my tuple pair list 
     return tup_pairs, file_list 

def mapping(filename): 
    tup_pairs, file_list = make_list(filename) 
    dictionary = {} 
    for pair in tup_pairs: 
     dictionary[pair] = [] #setting the value of dict to empty list 
    tup_pairs = set(tup_pairs) #throwing out repeated tuples 
    for word in file_list: 
     word_number = file_list.index(word) #index number of iter word 
     if word_number > 1: #because there is no -2/-1 index 
      compared_tuple = (file_list[word_number-2], file_list[word_number-1]) #to find 
                  #preceeding pair to compare 
      for pair in tup_pairs: 
       if compared_tuple == pair: 
        dictionary[pair].append(word) #should append the word to my dict value (list) 

    print dictionary #getting weird results (some words should appear that dont, some 
        # don't appear that should) 

mapping(filename) 

выход:

Lindsays-MBP:markov lindsayg$ python markov.py 
{('a', 'fox?'): [], ('Sam', 'I'): ['am?'], **('you,', 'could'): ['you', 'you', 'you', 'you', 'you', 'yo**u']**, ('could', 'you'): ['in', 'with', 'in', 'with'], ('you', 'with'): [], ('box?', 'Would'): [], ('ham?', 'Would'): [], ('I', 'am?'): [], ('you', 'in'): ['a', 'a', 'a', 'a'], ('a', 'house?'): [], ('like', 'green'): ['eggs'], ('like', 'them,'): ['Sam'], ('and', 'ham?'): [], ('Would', 'you'): ['like', 'like'], ('a', 'mouse?'): [], ('them,', 'Sam'): ['I'], ('in', 'a'): ['house?', 'box?'], ('with', 'a'): ['mouse?', 'fox?'], ('house?', 'Would'): [], ('a', 'box?'): [], ('Would', 'you,'): ['could', 'could', 'could', 'could'], ('green', 'eggs'): ['and'], ('you', 'like'): ['green', 'them,'], ('mouse?', 'Would'): [], ('fox?', 'Would'): [], ('eggs', 'and'): ['ham?']} 

Один пример странного вывода (должно быть только 4 'вы' ценности и есть шесть):

('you,', 'could'): ['you', 'you', 'you', 'you', 'you', 'you'] 

FYI файл текста используется:

Would you, could you in a house? 
Would you, could you with a mouse? 
Would you, could you in a box? 
Would you, could you with a fox? 
Would you like green eggs and ham? 
Would you like them, Sam I am? 
+0

Я думаю, что нужно пересмотреть алгоритм, который вы пытаетесь осуществить. Код (как я его читаю) для каждого «вас» получит сопоставимый_таблик («Would you»), который существует 6 раз в вашем случае. Может быть, вам нужен символ idx, word в списке (file_list) и работать с idx вместо word_number. –

ответ

3

Ваша проблема в том, y вы найдете индекс слова: index дает первый экземпляр. Есть 6 'you' (и 4 'you,', которые отличаются), и каждый из них получит тот же индекс word_number = 3, поэтому все они будут добавлены к паре ('Would', 'you,').

Чтобы получить индекс, вы должны использовать встроенный в enumerate:

for word_number, word in enumerate(file_list): 
    ...