【问题标题】:Python: Running this code from terminalPython:从终端运行此代码
【发布时间】:2018-07-14 12:12:00
【问题描述】:

我有这段代码,旨在通过马尔可夫链/进程生成文本。它编译得很好,没有错误,在终端上运行没有错误,但不产生任何响应/返回?

我通过进入保存 Markov.py 文件的目录并在终端上运行 Python3 Markov.py 来执行此操作,如下所示

我知道我做错了,但不确定是什么,我还需要调用这些函数吗?

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))

【问题讨论】:

  • 是的,你需要调用函数。现在没有“主”程序。但这你真的会在 Python 速成课程中学到。投入一些时间可能是件好事......
  • 当然它不会打印任何东西,因为您只定义了一些类。需要在代码末尾创建类的实例
  • 你这里的代码只有一个导入、一个类定义和两个函数定义。但是没有执行任何语句,因为从未调用函数并且从未实例化该类。添加一些实际执行某些命令和/或使用类的行。

标签: python markov-chains markov


【解决方案1】:

假设您的代码 sn-p 被正确复制,您似乎忘记了缩进级别。 generate() 和 train() 方法是 Markov() 对象的一部分,因此它们需要额外的缩进级别。

试试这个:

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 : ])

【讨论】:

  • @usr2564301 OP 在另一条评论中澄清说,这段代码 sn-p 后面有一些声明。
  • 好的,很抱歉当时得出这样的结论。这是 OP 的错(当然!)因为没有在问题本身中包含所有信息......关于同一主题:OP 的 original 源中的缩进肯定是正确的!因为否则 Python 肯定不得不对那个糟糕的缩进说 something
【解决方案2】:

是的,您必须在代码中调用这些函数,否则它们将不会被调用并且不会运行。您只需调用一个类,您必须实例化该类,尝试实例化您的类并适当地调用函数。 更多函数信息请见here

【讨论】:

  • 好的,它生成的输入是什么。
  • 但是,我得到 print(x.generate(10)) 的无效语法 ^
  • 在代码中,我看到了 generate() 函数的两个参数。但是你只输入了一个。
  • 肯定因为第一个参数是'self',我就不用再重新输入了。
  • 修复了! x = Markov(2) files = open("testFile.txt", "r") filename = files x.train(filename) print(x.generate(10))。错误消息在错误的位置,但由于“文件”已在 Train 功能下使用,因此出现问题,将声明重命名为“文件”进行排序,感谢您的帮助!
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多