赞
踩
天真的聊天机器人程序 . 没有解析,没有聪明,只是一个训练文件和输出 .
它首先在文本上训练,然后使用该训练中的数据生成对话者输入的响应 . 训练过程创建一个字典,其中每个键都是一个单词,值是在训练文本中的任何位置顺序跟随该单词的所有单词的列表 . 如果一个单词在此列表中不止一次出现,那么这反映出它更可能由机器人选择,不需要概率性的东西就可以用列表来做 .
机器人从您的输入中选择一个随机单词,并通过选择另一个被视为其持有单词的后继单词的随机单词来生成响应 . 然后,它通过依次找到该单词的后继者并反复进行直到它认为已经说得足够重复该过程 . 通过停止在训练文本中的标点符号之前的单词来达到该结论 . 然后它再次返回到输入模式以让您响应,依此类推 .
这不是很现实,但我在此挑战任何人在71行代码中做得更好!!对于任何崭露头角的Python主义者来说,这是一个巨大的挑战,我希望我可以向更广泛的受众开放挑战,而不是我访问此博客的少数访问者 . 要编写一个总是保证语法化的机器人肯定会接近几百行,我只是想通过最简单的规则来简化计算机只是为了让计算机只是在说些什么 .
至少可以说它的反应相当印象派!你也必须把你说的用单引号括起来 .
我使用War and Peace作为我的“语料库”,花了几个小时进行训练,如果你不耐烦则使用较短的文件......
这是培训师
#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
当它说出一些似乎有意义的东西时,你往往会有一种不可思议的感觉 .
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。