马尔可夫链聊天机器人如何工作?
我正在考虑用markov链来创build一个聊天机器人,但是我不完全确定如何使它工作。 根据我的理解,你可以用一个给定的单词和随后的单词创build一个表格。 在训练机器人的时候是否可以附加任何概率或计数器? 这是一个好主意吗?
问题的第二部分是关键字。 假设我已经可以从用户input中识别关键字,那我该如何生成一个使用该关键字的句子呢? 我并不总是想用这个关键字来开始这个句子,那么我怎么种马尔可夫链呢?
几年前,我在Python中为IRC制作了一个马尔可夫链聊天机器人,并且可以揭示出我是如何做到的。 生成的文本不一定是有意义的,但是读起来真的很有趣。 让我们分阶段分解。 假设你有一个固定的input,一个文本文件(你可以使用来自聊天文本或歌词的input,或者只是使用你的想象力)
通过文本循环,并形成一个字典,这意味着键值容器。 并把所有的单词作为关键字和单词作为一个值。 例如:如果您有一个文本“abcabk”,您以“ab”作为键,“c”作为值,然后“bc”和“a”作为值…该值应该是一个列表或任何集合,包含0 ..一些'项目',因为你可以有一个给定的单词对不止一个值。 在上面的例子中,“ab”两次用“c”紧接拳头,最后用“k”紧接着。 所以最后你会看到这样的字典/哈希: {'a b': ['c','k'], 'b c': ['a'], 'c a': ['b']}
现在你已经有了构build你的时髦文本所需的结构。 你可以select随机密钥或固定的地方开始! 因此,考虑到我们的结构,我们可以先保存“ab”,然后随机从数值c或k中取一个下一个单词,这样循环中的第一个保存“abk”(如果“k”是所选的随机值)那么你继续向右移动一步,在我们的例子中是“bk”,如果有的话,保存一个随机值,在我们的例子中不是,所以你跳出循环(或者你可以决定其他的东西从头再来)。 什么时候循环完成,你打印你保存的文本string。
input越大,你会得到更多的值(对话),然后会有一个“更智能的机器人”,所以你可以通过增加更多的文本(也许是聊天input?)来“训练”你的机器人。 如果你有一本书作为input,你可以构造一些不错的随机句子。 请注意,你不需要把一个单词作为一个值,你可以取2或10个。不同之处在于,如果你使用“更长”的积木,你的文本会更准确。 从一对作为一个关键字开始,下一个词作为一个值。
所以你看到你基本上可以有两个步骤,首先做一个结构,你随机select一个键开始,然后拿到这个键,打印一个随机的键值,并继续,直到你没有一个值或其他条件。 如果你想要的话,你可以从你的键值结构的聊天input中“种下”一对单词来开始。 它取决于你的想象力如何开始你的链条。
真实的词的例子:
"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"] ......
现在构build一个循环:
select一个随机的键,说:“嗨我”,随机select一个值,这里只有一个,所以它的“名称” (保存“你好我的名字”) 。
现在向右移“我的名字”作为下一个键,并select一个随机值…“是” (保存“你好我的名字是”) 。
现在移动并采取“名称是”…“铝” (保存“你好我的名字是AL”) 。
现在采取“是铝”…“和” (保存“你好我的名字是铝和”) 。
…
当你来到“和我”你会随机select一个值,让我们说“可以”,然后“我可以”这个词是等等…当你来到你的停止条件或你没有价值打印构造string在我们的情况:
“嗨,我叫Al,只要我想要,我就可以住在那里”
如果你有更多的价值,你可以跳转到任何键。 价值越高,你拥有的组合越多,文本的随机性和趣味性就越强。
机器人从你的input中select一个随机的单词,并通过select另一个被认为是其所持有的单词的随机单词来产生响应。 然后重复这个过程,依次find这个词的inheritance者,反复进行,直到它认为它已经足够了。 通过停止训练文本中的标点符号之前的单词来达到这个结论。 然后再次返回到input模式,让您回应,等等。
这是不是很现实,但我特此挑战任何人在71行代码做得更好! 对于任何萌芽的Python专家来说,这是一个巨大的挑战,我只希望我可以向更多的观众开放挑战,而不是我访问这个博客的less量访问者。 要编写一个总是保证语法的机器人,一定要接近几百行,我简单地简单地考虑一下最简单的规则,让计算机有一些东西要说。
至less可以说,它的反应是相当写意的! 你也必须把你说的单引号。
我用“战争与和平”为我的“语料库”进行了几个小时的训练,如果你不耐烦,请使用较短的文件。
这里是教练
#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()
这是bot:
#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
当它说出某种似乎部分有意义的东西时,你往往会有一种不可思议的感觉。
你可以这样做:做一个订单1马尔科夫链发电机,使用文字而不是字母。 每次有人发布的东西,他发布的内容都被添加到机器人数据库。 当他去聊天的时候,当一个人发布第一个post(10秒的倍数)时,机器人会保存,然后他将节省这个同样的人再等待的时间量(以10秒为单位)。第二部分将用于查看这个人将会发布什么,所以他join聊天,并在一段时间之后,根据一张桌子“在join聊天之后,一个人发了多less十秒”之后,他会继续以相同的表格思考“如何使用X时间来思考和书写的post后发布的post的时间量”