2015-04-15 1 views
3

Je suis novice en python et je tente de créer une chaîne markov. D'autres exemples montrent l'utilisation d'une instance d'objet et je ne suis pas allé aussi loin. Je n'ai pas encore fait la sélection aléatoire de la partie des valeurs, mais fondamentalement, je suis à court de perte pour ma sortie de ce code jusqu'à présent.Chaîne de Markov en Python (débutant)

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) 

sortie:

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?']} 

Un exemple de sortie bizarre (il ne devrait y avoir 4 valeurs 'vous' et il y en a six):

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

fichier FYI texte utilisé:

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

Je pense que vous avez besoin de revoir l'algorithme que vous essayez de mettre en œuvre. Le code (comme je le lis) pour chaque "vous" obtiendra le comparable_tuple ("Would you") qui existe 6 fois dans votre cas. Peut-être que vous avez besoin d'un idx, mot dans enumerate (file_list) et travailler avec idx au lieu de word_number. –

Répondre

3

Votre problème est le wa y vous trouvez l'index du mot: index donne la première instance. Il y a 6 'you' (et 4 'you,' qui sont différents) et chacun d'eux aura le même index word_number = 3, donc ils seront tous ajoutés à la paire ('Would', 'you,').

Pour obtenir l'index, vous devez utiliser le haut-enumerate:

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