1

我在课堂上遇到问题,我不知道原因,有人可以帮助我吗?

问题出在 def together() 中,这是我的代码。

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'

有谁知道原因吗?

4

2 回答 2

4

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

取消缩进以匹配类主体中的其他函数。

于 2013-05-09T18:54:12.267 回答
1

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

于 2013-05-09T18:54:36.503 回答