1

我一直在尝试添加一种存储和检索程序animal.py获得的知识的方法,这是一个通过二叉决策树工作的“20 个问题”学习算法。(请点击链接查看原程序)

在原始程序中,我为每个节点添加了“向上”状态,以指向决策树中节点的父节点,以便更轻松地在树上上下移动。我还使用正则表达式将所有非字母数字用户输入更改为空格,因此用户不会混淆我的两个新功能:

def know(know):
    #Load preset knowledge
    p=node("")
    knowledge=p
    for char in know:
            if char not in "+-":p.question+=char
            if char=="+":
                    p.right=node("")
                    p.right.up=p
                    p.left=node("")
                    p.left.up=p
                    p=p.right
            if char=="-": p=p.up.left
    return knowledge

def output(node,accum=""):
    #Output all knowledge
    accum=accum+node.question
    if node.right!= None : accum=output(node.right,accum+"+")
    if node.left!= None : accum=output(node.left,accum+"-")
    return accum

函数“输出”旨在返回作为单个字符串传递给它的节点下方的完整树,其中“+”和“-”字符指示该字符串跟随哪个节点。函数“know”应该采用先前由“output”创建的字符串,创建二叉决策树并返回指向顶部节点的指针。这是我无法弄清楚的不太有效的部分。(目前我是直接将初始知识字符串输入到程序源中:加载和保存文件会在后面添加,看起来很简单)

例如: output(know('mineral+crystal+quartz-obsidian-nothing')) 返回:'mineral+crystal+quartz-obsidiannothing-'

它应该在哪里返回原始字符串:'mineral+crystal+quartz-obsidian-nothing'

我确信这应该可行(理论上),但我已经碰壁了,我真的很迷茫为什么它不是。

我的想法是错误的,还是只是我试图实现它?有没有更好的方法来存储从原始程序创建的决策树?

我是一个狂热的读者,但第一次发布到 stackoverflow,并且对这个网站上的人才感到敬畏,所以我非常期待你的想法。

4

2 回答 2

0

根据请求,我无法找到“猜动物”的实现,但我确实找到了它生成的存档泡菜文件。值得注意的是,我不需要原始应用程序就能解释它:

>>> import pickle
>>> with open('animal.pickle') as inf:
...     animals = pickle.load(inf)
... 
>>> import pprint
>>> pprint.pprint(animals)
['is it fuzzy',
 ['does it have a tail',
  ['is it a pack hunter',
   'dog',
   ['does it have thumbs',
    'lemur',
    ['Does it have a bushy tail',
     'chipmunk',
     ['Does it have a horn', 'rhinoceros', 'cat']]]],
  'chimp'],
 ['can it breathe air',
  ['Does it have feathers',
   'cockatoo',
   ['Does it have 8 legs', 'spider', 'iguana']],
  'catfish']]

创建这个嵌套列表树的程序的实现留给读者练习。我记得,它的长度和一般方法与问题中链接的方法大致相同,它会让您熟悉列表操作。

于 2013-05-03T11:31:53.763 回答
0

pickle 模块可以序列化和反序列化复杂的结构。这应该很简单:

with open('animal.dat', 'w') as outf:
    pickle.dump(knowledge, outf)

with open('animal.dat', 'r') as inf:
    knowledge = pickle.load(inf)

正如他们所说,“电池已包含在内”,因此学习标准库可以让困难的事情变得简单,甚至是飞行

于 2013-05-03T10:42:18.007 回答