最近和学长想做一个自动问答的系统,有了一个整体模型的设计概念后,我就开始收集FAQ(常用聊天语料),大概就是“你好”、“你是谁”这类问题。但是网上关于这类问题的语料库质量都不高,或者要收费,于是我采取了让两个图灵机器人对聊的方式保存语料。
一、首先去注册图灵机器人。关于图灵机器人的使用方式不再赘述,官网上有很详细的说明,我们只需要知道它的url以及key(官网有API接入文档)
二、接下来就到了最令人激情的时刻:写代码!
1.引入相应的模块和编码设置,防止中文的打印出现乱码
import json
import requests
import time
import sys
import os
reload(sys)
sys.setdefaultencoding('utf-8')
2.初始化一个列表,列表元素为每次向机器人打招呼的句子。
FAQ = ['你好', '嗨', '欢迎', '嗨,最近如何', '你好吗', '很高兴见到你',\
'怎么了', '早上好!', '中午好!', '晚上好!', '你最喜欢什么书?', \
'你最喜欢什么颜色?', '你是谁?', '复杂优于晦涩', '你是一个程序员吗?',\
'我能问你一个问题吗?', '你喜欢什么食物?', '你的爱好是什么?', \
'什么是爱', '你爱我吗?']
这时你也许会产生疑惑,为什么不直接让机器人一直对聊下去呢?本来我也是这么想的,但是测试了几次之后发现,图灵机器人在对聊10轮左右都会陷入重复语句的无限循环,如图:
于是我的解决方法就是每当图灵机器人对聊10轮后,人为地插入新的语句,从而避免这个循环,即使出现循环也会马上进入下一个话题的轮次。
3.重头戏就是使用API与之交互
class tulingRobot(object):
#http://www.tuling123.com/member/center/
#发送json数据
data = {
"key" : '',
"info" : ''
}
#传入相应的url和key
def __init__(self, url, key):
self.url = url
self.key = key
def robot(self, myfile):
try:
with open(myfile, 'r+') as f:
#每次读取文件中的最后一行,作为问句发送给机器人
lastLine = f.readlines()[-1]
self.data['key'] = self.key
self.data['info'] = lastLine
#用py的requests模块发送请求
req = requests.post(self.url, data = self.data).text
#返回的数据也是json格式,截取机器人的回答
answer = json.loads(req)['text']
#把机器人的回答写入文件底部,作为下一个问句
f.write('\n' + answer)
#异常处理
except UnicodeError, e:
print e.reason
except IOError:
print 'IO Error'
4.在聊天记录中插入新问句的操作
def insertQuestion(myfile, i):
#print FAQ[i].decode('UTF-8').encode('GBK')
try:
with open(myfile, 'a') as f:
#双回车可以清晰地看出每轮对话的边界
f.write('\n' + '\n' + FAQ[i])
except Exception, e:
raise e
5.开始对话
def startTalking(myfile):
#路径下存在该文件则删除之
if os.path.exists(myfile):
os.remove(myfile)
url = 'http://www.tuling123.com/openapi/api'
key1 = 'your key'
key2 = 'your key'
#创建了两个机器人
r1 = tulingRobot(url, key1)
r2 = tulingRobot(url, key2)
i = 0
l = len(FAQ)
try:
print 'takling...'
#共进行l轮对话,l为FAQ表中句子数量
while i < l:
#插入新问句
insertQuestion(myfile, i)
j = 0
#两个机器人对一个句子展开j轮对话,j太大机器人会循环同一个回答
while j < 10:
r1.robot(myfile)
r2.robot(myfile)
#每次对话后暂停0.001秒,防止调用过于频繁
time.sleep(0.001)
j = j+1
i = i + 1
print '%d/%d finished' %(i, l)
print 'all finished'
except Exception, e:
raise e
6.运行程序。图灵机器人会对一个问句生成不同的回答,这里共进行5轮对话,可以搜集更多的语料。
if __name__ == '__main__':
startTalking('talk_1.txt')
startTalking('talk_2.txt')
startTalking('talk_3.txt')
startTalking('talk_4.txt')
startTalking('talk_5.txt')
三、运行结果
直接在cmd中执行我们的py脚本,然后机器人就开始欢快地聊天了。
然后就可以在我们的txt文件中看到机器人对聊的语句了,有神奇的,也有很蠢的。
对图灵机器人的调戏就到此为止~