33

我想构建一个机器人,它会根据答案向某人提出一些简单的问题和分支。我意识到从人类响应中解析含义将是一项挑战,但是您如何设置程序来处理对话的“状态”?

这将是人和机器人之间的一对一对话。

4

11 回答 11

24

您可能希望将马尔可夫链作为机器人 AI 的基础。很久以前我写了一些东西(我一点也不引以为豪的代码,并且需要一些 mods 才能在 Python > 1.5 上运行),这对你来说可能是一个有用的起点:http://sourceforge.net/projects/benzo/

编辑:这是 Python 中一个最小的马尔可夫链示例,它接受来自标准输入的输入,并根据输入中单词的连续概率输出文本。它针对 IRC 风格的聊天日志进行了优化,但是通过它运行任何大小合适的文本都应该展示这些概念:

import random, sys

NONWORD = "\n"
STARTKEY = NONWORD, NONWORD
MAXGEN=1000

class MarkovChainer(object):
    def __init__(self):
        self.state = dict()

    def input(self, input):
        word1, word2 = STARTKEY
        for word3 in input.split():
            self.state.setdefault((word1, word2), list()).append(word3)
            word1, word2 = word2, word3 
        self.state.setdefault((word1, word2), list()).append(NONWORD)

    def output(self):
        output = list()
        word1, word2 = STARTKEY
        for i in range(MAXGEN):
            word3 = random.choice(self.state[(word1,word2)])
            if word3 == NONWORD: break
            output.append(word3)
            word1, word2 = word2, word3
        return " ".join(output)

if __name__ == "__main__":
    c = MarkovChainer()
    c.input(sys.stdin.read())
    print c.output()

从这里插入持久性和 IRC 库并拥有您正在谈论的机器人类型的基础非常容易。

于 2008-09-10T19:04:47.463 回答
14

人们已经提到,有状态并不是典型聊天机器人的重要组成部分:

  • 一个纯马尔可夫实现可能会表达一种非常松散的状态,如果它正在实时增长它的词典和表格——人类对话者之前的话语可能会在对话的后期偶然出现——但马尔可夫模型没有任何固有的选择或产生这种反应的机制。

  • 基于解析的机器人(例如 ELIZA)通常会尝试响应用户最近输入的(某些)语义内容,而不考虑先前的交换。

也就是说,您当然可以向聊天机器人添加一些状态,而不管您使用的是哪种输入解析和语句合成模型。如何做到这一点在很大程度上取决于你想用你的状态来完成什么,这从你的问题中并不清楚。然而,有几个一般的想法:

  • 创建关键字堆栈。当您的人提供输入时,从他们的陈述/问题中解析出关键字并将这些关键字扔到某种堆栈上。当您的聊天机器人无法在最近的输入中提出令人信服的响应时——或者,也许只是随机地,把事情混在一起——回到你的堆栈,抓住一个以前的关键字,然后用它来播下你的下一个关键字合成。对于加分,让机器人明确承认它正在回到以前的主题,例如“等等,人类,你之前提到过 foo。[由 foo 播种的句子]”。

  • 在机器人中构建类似 RPG 的对话逻辑。当您解析人工输入时,为来自用户的特定对话提示或内容切换标志,并有条件地更改聊天机器人可以谈论的内容或交流方式。例如,聊天机器人对粗话大发雷霆(或责骂或大笑)是相当普遍的;一个聊天机器人会兴奋起来,并且有条件地保持这种状态,直到向 道歉,这将是一个有趣的状态变化。将输出切换为全部大写,投入对抗性言论或要求或抽泣等。

你能澄清一下你希望国家帮助你完成什么吗?

于 2008-09-18T17:53:27.490 回答
5

想象一个在每个节点或神经元中具有解析能力的神经网络。根据规则和解析结果,神经元会触发。如果某些神经元被激发,你会对问题的主题和语义有一个很好的了解,因此可以给出一个很好的答案。

记忆是通过保持会话中讨论的主题来完成的,增加下一个问题的触发,因此指导最后可能答案的选择过程。

将您的规则和模式保存在知识库中,但在开始时将它们编译到内存中,每个规则都有一个神经元。您可以使用诸如侦听器或事件函数之类的东西来设计突触。

于 2008-10-20T09:20:26.820 回答
3

我认为您可以查看Kooky的代码,而 IIRC 它也使用马尔可夫链。

另请查看古怪的引语,它们不久前出现在 Coding Horror 中,有些很搞笑。

于 2008-09-10T19:09:13.257 回答
2

我认为要开始这个项目,最好有一个带有问题的数据库(组织为一棵树。在每个节点中都有一个或多个问题)。这些问题应该用“是”或“否”来回答。

如果机器人开始提问,它可以从您标记为开始问题的问题数据库中的任何问题开始。答案是通往树中下一个节点的路径。

编辑:这是一个用 ruby​​ 编写的简单文件,您可以从以下内容开始:rubyBOT

于 2008-09-10T19:11:27.433 回答
1

天真的聊天机器人程序。没有解析,没有聪明,只是一个训练文件和输出。

它首先在文本上训练自己,然后使用来自该训练的数据来生成对对话者输入的响应。训练过程创建一个字典,其中每个键是一个单词,值是训练文本中任何位置顺序跟随该单词的所有单词的列表。如果一个词在这个列表中出现了不止一次,那么这反映了它更有可能被机器人选择,不需要概率性的东西,只需用一个列表来做。

机器人从您的输入中选择一个随机词,并通过选择另一个随机词来生成响应,该随机词已被视为其持有的词的后继词。然后它通过依次找到该词的后继词并迭代地继续执行该过程,直到它认为它已经说得足够多,从而重复该过程。它通过停在训练文本中标点符号之前的一个词来得出这个结论。然后它再次返回输入模式以让您响应,依此类推。

这不是很现实,但我在此挑战任何人在 71 行代码中做得更好!对于任何初露头角的 Python 爱好者来说,这都是一个巨大的挑战,我只希望我能向更广泛的受众开放挑战,而不是我访问这个博客的少数访问者。为了编写一个始终保证语法正确的机器人,它肯定接近几百行,我通过尝试考虑最简单的规则来极大地简化程序,让计算机仅仅尝试有话要说。

它的反应至少可以说是相当印象派的!此外,您必须将您所说的内容放在单引号中。

我使用战争与和平作为我的“语料库”,训练运行需要几个小时,如果您不耐烦,请使用较短的文件……</p>

这是教练

#lukebot-trainer.py
import pickle
b=open('war&peace.txt')
text=[]
for line in b:
    for word in line.split():
        text.append (word)
b.close()
textset=list(set(text))
follow={}
for l in range(len(textset)):
    working=[]
    check=textset[l]
    for w in range(len(text)-1):
        if check==text[w] and text[w][-1] not in '(),.?!':
            working.append(str(text[w+1]))
    follow[check]=working
a=open('lexicon-luke','wb')
pickle.dump(follow,a,2)
a.close()

这是机器人

#lukebot.py
import pickle,random
a=open('lexicon-luke','rb')
successorlist=pickle.load(a)
a.close()
def nextword(a):
    if a in successorlist:
        return random.choice(successorlist[a])
    else:
        return 'the'
speech=''
while speech!='quit':
    speech=raw_input('>')
    s=random.choice(speech.split())
    response=''
    while True:
        neword=nextword(s)
        response+=' '+neword
        s=neword
        if neword[-1] in ',?!.':
            break
    print response

当它说一些似乎部分有道理的东西时,你往往会有一种不可思议的感觉。

于 2014-05-28T01:31:02.643 回答
0

我建议查看贝叶斯概率。然后只需监视聊天室一段时间即可创建您的概率树。

于 2008-09-10T19:03:42.163 回答
0

我不确定这就是你要找的东西,但是有一个名为ELIZA的旧程序,它可以通过接受你所说的内容并在执行一些简单的文本转换后向你吐出它来进行对话。

如果我没记错的话,很多人都相信他们是在和一个真实的人“交谈”,并与它进行了长时间的精心对话。

于 2008-09-10T23:03:14.427 回答
0

如果您只是涉足,我相信Pidgin允许您编写聊天风格行为的脚本。框架的一部分可能会记录谁在何时发送消息的状态,并且您希望为最后 N 条消息中的每一条记录您的机器人的内部状态。未来的状态决策可以基于对先前状态的检查和最近几条消息的内容进行硬编码。或者你可以做一些类似马尔可夫链的事情,并将其用于解析和生成。

于 2009-08-05T20:40:54.520 回答
0

如果您不需要学习机器人,那么使用 AIML ( http://www.aiml.net/ ) 很可能会产生您想要的结果,至少在机器人解析输入和基于它的回答方面。

您将重用或创建由 XML(以 AIML 格式)制成的“大脑”,并在程序(解析器)中解析/运行它们。有几种不同语言的解析器可供选择,据我所知,在大多数情况下,代码似乎是开源的。

于 2012-10-09T00:45:43.783 回答
0

您可以使用“ChatterBot”,并使用“flask-chatterbot-master”在本地托管它

链接:

  1. [ChatterBot 安装] https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [主机本地使用-flask-chatterbot-master]:https ://github.com/chamkank/flask-chatterbot

干杯,

拉特纳卡尔

于 2018-08-17T13:10:04.823 回答