Artificial intelligence 马尔可夫链聊天机器人是如何工作的?

Artificial intelligence 马尔可夫链聊天机器人是如何工作的?,artificial-intelligence,probability,chatbot,markov-chains,Artificial Intelligence,Probability,Chatbot,Markov Chains,我曾考虑使用马尔可夫链之类的东西创建聊天机器人,但我不完全确定如何让它工作。据我所知,您可以从数据中创建一个表,其中包含给定的单词,然后是后面的单词。在训练机器人时,是否可能附加任何类型的概率或计数器?这是个好主意吗 问题的第二部分是关键词。假设我已经可以从用户输入中识别关键字,我如何生成使用该关键字的句子?我不想总是以关键字开始句子,那么我如何为马尔可夫链播种呢?几年前,我用Python为IRC制作了一个马尔可夫链聊天机器人,可以说明我是如何做到的。生成的文本不一定有任何意义,但读起来确实很有

我曾考虑使用马尔可夫链之类的东西创建聊天机器人,但我不完全确定如何让它工作。据我所知,您可以从数据中创建一个表,其中包含给定的单词,然后是后面的单词。在训练机器人时,是否可能附加任何类型的概率或计数器?这是个好主意吗


问题的第二部分是关键词。假设我已经可以从用户输入中识别关键字,我如何生成使用该关键字的句子?我不想总是以关键字开始句子,那么我如何为马尔可夫链播种呢?

几年前,我用Python为IRC制作了一个马尔可夫链聊天机器人,可以说明我是如何做到的。生成的文本不一定有任何意义,但读起来确实很有趣。让我们把它分解成几个步骤。假设您有一个固定的输入,一个文本文件,(您可以使用聊天文本或歌词的输入,也可以使用您的想象力)

循环阅读文本并制作一个字典,意思是键值容器。并将所有成对的单词作为键,后面的单词作为值。 例如:如果您有一个文本“abccabk”,则以“abb”作为键,“c”作为值,然后以“bc”和“a”作为值。。。该值应该是一个列表或任何包含0..多个“项”的集合,因为对于给定的一对单词,可以有多个值。在上面的例子中,你将有两次“a b”,第一次是“c”,最后是“k”。因此,最终您将得到一个如下所示的字典/哈希:
{'ab':['c','k'],'bc':['a'],'ca':['b']}

现在,您有了构建时髦文本所需的结构。您可以选择以随机键或固定位置开始!根据我们的结构,我们可以先保存“AB”,然后从值c或k中随机抽取一个单词,循环中的第一个保存词是“AB k”(如果“k”是随机选择的值),然后继续向右移动一步,在我们的例子中是“BK”,如果有,则为该对保存一个随机值,在我们的例子中是否,所以你打破了循环(或者你可以决定其他事情,比如重新开始)。循环完成后,打印保存的文本字符串

输入越大,您的密钥(一对单词)的值就越多,然后会有一个“更智能的机器人”,因此您可以通过添加更多文本(可能是聊天输入?)来“训练”您的机器人。如果你有一本书作为输入,你可以构造一些漂亮的随机句子。请注意,不必只取一对后面的一个单词作为值,可以取2或10。不同之处在于,如果使用“更长”的构建块,文本将显示得更准确。以一对作为键,以下单词作为值

你可以看到,你基本上可以有两个步骤,首先建立一个结构,你可以随机选择一个键开始,然后取下这个键,打印出这个键的一个随机值,然后继续,直到你没有一个值或其他条件。如果您愿意,您可以从您的键值结构的聊天输入中“播种”一对单词来开始。这取决于你的想象力如何启动你的链条

用实词举例:

"hi my name is Al and i live in a box that i like very much and i can live in there as long as i want"

"hi my" -> ["name"]

"my name" -> ["is"]

"name is" -> ["Al"]

"is Al" -> ["and"]

........

"and i" -> ["live", "can"]

........

"i can" -> ["live"]

......
现在构造一个循环:

选择一个随机键,说“嗨,我的”,然后随机选择一个值,这里只有一个值,所以它是“名称” (保存“你好,我的名字”)
现在向右移动一步,将“我的名字”作为下一个键,然后选择一个随机值。。。“是” (保存“你好,我的名字是”)
现在移动并取“名字是”。。。“阿尔” (保存“你好,我的名字是AL”)
现在来看看“是艾尔”。。。“和” (保存“你好,我的名字是艾尔和”)

当你说到“和我”时,你会随机选择一个值,比如说“可以”,然后“我可以”这个词就出现了,等等。。。当达到停止条件或没有值时,在我们的示例中打印构造的字符串:

“嗨,我的名字叫艾尔,我想在那里住多久就住多久”

如果有更多值,可以跳转到任何关键点。值越多,您拥有的组合越多,文本就越随机和有趣。

您可以这样做: 使用单词而不是字母制作一个order 1马尔可夫链生成器。 每当有人发布某些内容时,他发布的内容都会添加到bot数据库中。 此外,当他去聊天时,当一个人发布第一篇帖子时,机器人会节省时间(10秒的倍数),然后他会节省这个人等待再次发布的时间(10秒的倍数)。。。
第二部分将用于查看该家伙何时发布,因此他将加入聊天,并且在一段时间后,根据一张表格显示“在该家伙加入聊天后发布了多少10秒”,然后他将继续使用相同的表格进行发布“在一篇他用X秒思考和撰写的文章之后,他又用了多少时间来撰写这篇文章?”“

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

这不是很现实,但我在此挑战任何人在71行代码中做得更好!!这对任何初露头角的Pythonists来说都是一个巨大的挑战,我只希望我能向更多的读者开放这一挑战,而不是向我在这个博客上看到的少数访问者开放。要编写一个总是保证语法正确的机器人,它的代码肯定要接近几百行,我只想想出一个最简单的规则,让计算机有话要说,从而大大简化了代码

至少可以说,它的反应相当印象派!你也必须把你想要的东西放进去
#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