我打算使用马尔可夫链之类的东西创建一个聊天机器人,但我不确定如何使其正常工作。据我所知,您可以从给定单词和后续单词的数据中创建表格。在训练机器人时是否可能附加任何概率或计数器?这是个好主意吗?
问题的第二部分涉及关键字。假设我已经能够从用户输入中识别关键字,那么我该如何生成使用该关键字的句子呢?我并不总是想以关键字开头,那么我应该如何为马尔可夫链进行初始设置呢?
我打算使用马尔可夫链之类的东西创建一个聊天机器人,但我不确定如何使其正常工作。据我所知,您可以从给定单词和后续单词的数据中创建表格。在训练机器人时是否可能附加任何概率或计数器?这是个好主意吗?
问题的第二部分涉及关键字。假设我已经能够从用户输入中识别关键字,那么我该如何生成使用该关键字的句子呢?我并不总是想以关键字开头,那么我应该如何为马尔可夫链进行初始设置呢?
{'a b': ['c','k'], 'b c': ['a'], 'c a': ['b']}
2. 现在,你已经拥有了需要构建奇妙文本的结构。你可以选择随机选择一个键或一个固定位置来开始!所以,给定我们拥有的结构,我们可以从保存“a b”开始,然后随机从值中取一个单词,即c或k。这样,在循环中,第一次保存"a b k"(如果"k"是随机选择的值),然后继续向右移动一个步骤,在我们的例子中是 "b k",如果你有一个随机值对于那个键,则将其保存,否则跳出循环(或者你可以决定其他事情,比如重新开始)。当循环完成时,你就可以打印你保存的文本字符串了。"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”保存)。现在向右移动一步,以“my name”作为下一个键并选择一个随机值……“is”(将“hi my name is”保存)。现在继续移动并选取“name is”……“Al”(将“hi my name is AL”保存)。现在选取“is Al”……“and”(将“hi my name is Al and”保存)。虽然不是非常逼真,但我在此挑战任何人在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