2013-05-09 168 views
1

我想出了一个关于类的问题,我不知道原因,有没有人可以帮助我?'MarkovGenerator'对象没有属性'

问题是在一起def(),这里是我的代码。

class MarkovGenerator(object): 

    def __init__(self, n, max): 
    self.n = n # order (length) of ngrams 
    self.max = max # maximum number of elements to generate 
    self.ngrams = dict() # ngrams as keys; next elements as values 
    beginning = tuple(["That", "is"]) # beginning ngram of every line 
    beginning2 = tuple(["on", "the"]) 
    self.beginnings = list() 
    self.beginnings.append(beginning) 
    self.beginnings.append(beginning2) 
    self.sentences = list() 


    def tokenize(self, text): 
    return text.split(" ") 

    def feed(self, text): 

    tokens = self.tokenize(text) 

    # discard this line if it's too short 
    if len(tokens) < self.n: 
     return 

    # store the first ngram of this line 
    #beginning = tuple(tokens[:self.n]) 
    #self.beginnings.append(beginning) 

    for i in range(len(tokens) - self.n): 

     gram = tuple(tokens[i:i+self.n]) 
     next = tokens[i+self.n] # get the element after the gram 

     # if we've already seen this ngram, append; otherwise, set the 
     # value for this key as a new list 
     if gram in self.ngrams: 
     self.ngrams[gram].append(next) 
     else: 
     self.ngrams[gram] = [next] 

    # called from generate() to join together generated elements 
    def concatenate(self, source): 
    return " ".join(source) 

    # generate a text from the information in self.ngrams 
    def generate(self,i): 

    from random import choice 

    # get a random line beginning; convert to a list. 
     #current = choice(self.beginnings) 
    current = self.beginnings[i] 
    output = list(current) 

    for i in range(self.max): 
     if current in self.ngrams: 
     possible_next = self.ngrams[current] 
     next = choice(possible_next) 
     output.append(next) 
     # get the last N entries of the output; we'll use this to look up 
     # an ngram in the next iteration of the loop 
     current = tuple(output[-self.n:]) 
     else: 
     break 

    output_str = self.concatenate(output) 
    return output_str 


    def together(self): 
     return "lalala" 


if __name__ == '__main__': 

    import sys 
    import random 


    generator = MarkovGenerator(n=2, max=16) 
    for line in open("us"): 
    line = line.strip() 
    generator.feed(line) 

    for i in range(2): 
    print generator.generate(i) 
    print generator.together() 

但我得到的错误说:

Traceback (most recent call last): 
    File "markovoo2.py", line 112, in <module> 
    print generator.together() 
AttributeError: 'MarkovGenerator' object has no attribute 'together' 

有谁知道知道原因?

回答

1

看起来你的def together缩进得太深了。它在generate方法中。将其移出一个缩进级别。

4

您已经将def together()函数定义缩进了太多,它是def generate()函数体的一部分。

取消缩进以匹配类体中的其他功能。

+0

赠品是定义参数列表中的'self'。 – dwerner 2013-05-09 18:59:19

+0

非常感谢您回答我的问题! – Douuga 2013-05-10 01:43:49