Search code examples
pythonmarkov-chainsmarkov

Python: Running this code from terminal


I have this code which is meant to generate text via Markov chains/processes. It compiles fine with no errors and runs on terminal with no errors but doesn't generate any response/return?

I do this by going into the directory were the Markov.py file is held, and running Python3 Markov.py on terminal, as shown below enter image description here

I know I'm doing something incorrect but not sure what it is, do I need to call the functions also?

import random

class Markov (object):
    def __init__(self,order):
        self.order = order
        self.group_size = self.order + 1 
        self.text = "testFile.txt"  #The training text
        self.graph = {}  #Holds the information learnt
        return

    def train (self,filename):
        self.text = file (testFile.txt).read () .split()    
        self.text = self.text + self.text [ : self.order]   
        for i in range (0, len (self.text) - self.group_size):
            key = tuple (self.text [i : i + self.order]) 
            value = self.text[i + self.order] 

            if key in self.graph:
                self.graph [key].append (value)
            else:
                self.graph [key] = [value]

    def generate (self, length):
        index = random.randint (0, len(self.text) - self.order)
        result = self.text[index : index + self.order]
        for i in range (length):
            state = tuple(result[len(result) - self.order:])
            next_word = random.choice(self.graph[state])
            result.append(next_word)

        return " ".join (result[self.order : ])

x = Markov(2)
files = open("testFile.txt", "r")
filename = files

x.train(filename)
print(x.generate(10))

Solution

  • Assuming that your code snippet was copied over correctly, it looks like you forgot a level of indentation. The generate() and train() methods are part of the Markov() object, so they need an extra level of indentation.

    Try this:

    import random
    
    class Markov (object):
        def __init__(self,order):
            self.order = order
            self.group_size = self.order + 1 
            self.text = "testFile.txt"  #The training text
            self.graph = {}  #Holds the information learnt
            return
    
        def train (self,filename):
            self.text = file (testFile.txt).read () .split()    
            self.text = self.text + self.text [ : self.order]   
            for i in range (0, len (self.text) - self.group_size):
                key = tuple (self.text [i : i + self.order]) 
                value = self.text[i + self.order] 
    
                if key in self.graph:
                    self.graph [key].append (value)
                else:
                    self.graph [key] = [value]
    
        def generate (self, length):
            index = random.randint (0, len(self.text) - self.order)
            result = self.text[index : index + self.order]
            for i in range (length):
                state = tuple(result[len(result) - self.order:])
                next_word = random.choice(self.graph[state])
                result.append(next_word)
    
            return " ".join (result[self.order : ])