我当时在考虑使用markov链创建聊天机器人,但我不确定如何使它工作。据我了解,您是根据数据创建一个表的,其中包含给定的单词,然后是给定的单词。训练机器人时是否可以附加任何可能性或计数器?那是个好主意吗?
问题的第二部分是关键字。假设我已经可以从用户输入中识别关键字,那么如何生成一个使用该关键字的句子?我并不总是想要以关键字开头的句子,那么如何播种马尔可夫链呢?
我当时在考虑使用markov链创建聊天机器人,但我不确定如何使它工作。据我了解,您是根据数据创建一个表的,其中包含给定的单词,然后是给定的单词。训练机器人时是否可以附加任何可能性或计数器?那是个好主意吗?
问题的第二部分是关键字。假设我已经可以从用户输入中识别关键字,那么如何生成一个使用该关键字的句子?我并不总是想要以关键字开头的句子,那么如何播种马尔可夫链呢?
Answers:
几年前,我用Python为IRC制作了一个Markov链聊天机器人,可以说明我的工作方式。生成的文本不一定有意义,但是阅读起来确实很有趣。让我们分步分解它。假设您有一个固定的输入文本文件(您可以使用聊天文本或歌词中的输入,也可以只是想像力)
循环遍历文本并创建一个Dictionary,意思是键-值容器。并将所有单词对作为键,并将其后的单词作为值。例如:如果文本为“ abcab k”,则以“ ab”为键,以“ c”为值,然后以“ bc”和“ a”为值...该值应为列表或任何保存的集合0 ..许多“项目”,因为给定的单词对可以有多个值。在上面的示例中,您将有两次“ a b”,然后是拳头,然后是“ c”,最后是“ k”。因此,最终您将获得一个类似于以下内容的字典/哈希:{'a b': ['c','k'], 'b c': ['a'], 'c a': ['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"]
......
现在构造一个循环:
选择一个随机密钥,说“ hi my”,然后随机选择一个值,这里只选一个,以便其为“ name”
(保存“ hi my name”)。
现在,以“我的名字”作为下一个键,向右移动一步,并选择一个随机值...“是”
(保存“我的名字是”)。
现在移动并取“ name is” ...“ Al”
(保存“ hi my name is AL”)。
现在取“是Al” ...“和”
(保存“嗨,我叫Al和”)。
...
当您来到“和我”时,您将随机选择一个值,让我们说“可以”,然后用单词“我可以”等。本例中的字符串:
“嗨,我叫Al,只要我愿意,我就可以住在那里”
如果您有更多值,则可以跳至任何键。值越多,组合越多,文本的随机性和趣味性就越大。
机器人从您的输入中选择一个随机词,然后通过选择另一个被视为其保留词的后继词的随机词来生成响应。然后,通过依次找到该单词的后继单词并重复进行直到其认为足够说完为止,来重复此过程。通过停止训练文本中标点符号之前的单词可以得出结论。然后,它再次返回到输入模式,让您响应,依此类推。
这不是很现实,但我特此挑战任何人,使其在71行代码中做得更好!对于任何刚起步的Python工作者来说,这都是一个巨大的挑战,我只希望我可以向比这个博客访问者少的访问者开放更多的受众。要编写始终保证语法合理的机器人程序,必须肯定要接近几百行,我通过尝试考虑最简单的规则来简化计算机,让计算机仅需说些什么就大大简化了程序。
至少可以说,它的回应是印象派的!同样,您必须将您所说的内容放在单引号中。
我为我的“语料库”使用了“战争与和平”,这花了几个小时进行训练,如果您急躁,请使用较短的文件…
这是教练
#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
当您说出某些似乎有道理的话时,您往往会感到一种古怪的感觉。