通过【电影知识图谱问答(一)|爬取豆瓣影片与书籍详尽信息、电影知识图谱问答(二)|生成298万条RDF三元组数据、电影知识图谱问答(三)|Jena知识储存及知识检索、电影知识图谱问答(四)|问句理解及答案推理】四篇文章的介绍,我们早已了解怎样从豆瓣官网中爬取数据;怎样将爬取的数据转换得到可用的三元组数据,并储存至Jena之中;怎样借助查询语言进行知识检索和答案推理;怎样理解问句所抒发的深层语义信息,即获取问句实体和目标属性信息;怎样借助问句的深层语义信息,结合规则和表示学习方式,推理得到问题答案。结合前面几篇文章,早已才能从零开始建立一个影片知识图谱问答系统吴京个人资料,有兴趣的朋友可以尝试搭建。本篇文章,将介绍怎样将影片知识图谱问答系统布署至陌陌公众平台,布署完成后才能通过陌陌公众号进行知识问答。
本项目相关代码已然发布至,项目地址为/-KGQA,欢迎Star。1.服务器
将代码布署至陌陌公众平台须要一个服务器,倘若只是用于Demo展示的话,推荐订购腾讯云中学生服务器或则阿里云中学生服务器,价钱非常让利。个人订购的是腾讯云服务器,配置为1核CPU、2G显存、1Mbps带宽、50GB高性能网盘,价钱6个月60元。
订购好服务器以后,须要安装系统环境,个人安装的是.04系统。系统安装成功以后,安装,配置北大源。之后配置陌陌公众号,将服务器和陌陌公众号进行关联。
2.陌陌公众号开发
按照陌陌公众平台开发文档接入手册,将服务器接入至陌陌公众号。陌陌官方文档早已比较详尽,此处不再进行介绍,接入过程中有相关问题直接在文章下方评论即可。右图是个人陌陌公众号配置截图,有兴趣的话,也可以关注下个人陌陌公众号谓之小一。
目前只是将服务器成功接入到陌陌公众号,并且还不能处理用户发送过来的恳求,因而需编撰用户恳求处理方面的代码。处理方式可参考陌陌官方Demo,包括陌陌公众号处理用户恳求的流程,怎么接收消息,怎么发送消息等问题。
熟悉官方Demo以后吴京个人资料,开始编撰豆瓣影片知识图谱(BM-KGQA)对话处理的代码。首先创建.py文件,用于响应用户经陌陌公众号端发送过来的恳求,并返回相应答案。代码如下所示,其中fromQuery是单条问句处理的插口,,reply是定义的陌陌消息接收和返回函数。
# query_server.py
# -*- coding:utf-8 -*-
import web
import hashlib
from query_main import Query
import receive, reply
query = Query()
class Handle(object):
def __init__(self):
# 初始化query
# self.query = Query()
pass
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
# 和公众平台官网-->基本配置中信息填写相同
token = "douban_kgqa"
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return "I don't Know"
except Exception as err:
print('ERROR: ' + str(err))
return err
def POST(self):
try:
webData = web.data()
# 后台打印日志
print('Handle Post webdata is ', webData)
recMsg = receive.parse_xml(webData)
if isinstance(recMsg, receive.Msg):
toUser = recMsg.FromUserName
fromUser = recMsg.ToUserName
if recMsg.MsgType == 'text':
# result = "彩虹屁屁"
question = recMsg.Content
result = query.parse(question)
replyMsg = reply.TextMsg(toUser, fromUser, result)
return replyMsg.send()
if recMsg.MsgType == 'image':
mediaId = recMsg.MsgId
replyMsg = reply.ImageMsg(toUser, fromUser, mediaId)
return replyMsg.send()
else:
return reply.Msg().send()
else:
print('暂且不处理')
return reply.Msg().send()
except Exception as err:
print('ERROR: ' + str(err))
return err
urls = (
'/douban_kgqa', 'Handle'
)
if __name__ == '__main__':
douban_kgqa_web = web.application(urls, globals())
douban_kgqa_web.run()
.py是接收用户经陌陌公众号发送过来的恳求,解析后获取问句详尽信息。
# receive.py
# -*- coding:utf-8 -*-
import xml.etree.ElementTree as ET
def parse_xml(web_data):
if len(web_data) == 0:
return None
xmlData = ET.fromstring(web_data)
msg_type = xmlData.find('MsgType').text
if msg_type == 'text':
return TextMsg(xmlData)
elif msg_type == 'image':
return ImageMsg(xmlData)
class Msg(object):
def __init__(self, xmlData):
self.ToUserName = xmlData.find('ToUserName').text
self.FromUserName = xmlData.find('FromUserName').text
self.CreateTime = xmlData.find('CreateTime').text
self.MsgType = xmlData.find('MsgType').text
self.MsgId = xmlData.find('MsgId').text
self.Content = xmlData.find('Content').text
class TextMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.Content = xmlData.find('Content').text.encode("utf-8")
class ImageMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.PicUrl = xmlData.find('PicUrl').text
self.MediaId = xmlData.find('MediaId').text
reply.py是将须要返回的答案封装成陌陌要求的数据类型。
# reply
# -*- coding:utf-8 -*-
import time
class Msg(object):
def __init__(self):
pass
def send(self):
return "success"
class TextMsg(Msg):
def __init__(self, toUserName, fromUserName, content):
self.__dict = dict()
self.__dict['ToUserName'] = toUserName
self.__dict['FromUserName'] = fromUserName
self.__dict['CreateTime'] = int(time.time())
self.__dict['Content'] = content
def send(self):
XmlForm = """
{ToUserName}]]>
{FromUserName}]]>
{CreateTime}
{Content}]]>
"""
return XmlForm.format(**self.__dict)
class ImageMsg(Msg):
def __init__(self, toUserName, fromUserName, mediaId):
self.__dict = dict()
self.__dict['ToUserName'] = toUserName
self.__dict['FromUserName'] = fromUserName
self.__dict['CreateTime'] = int(time.time())
self.__dict['MediaId'] = mediaId
def send(self):
XmlForm = """
{ToUserName}]]>
{FromUserName}]]>
{CreateTime}
{MediaId}]]>
"""
return XmlForm.format(**self.__dict)
代码编撰完成以后,将所有代码移到服务器端,安装项目所须要的依赖包,最后借助.py80开启服务。开启成功以后,便就能借助陌陌公众号进行问答。
3.陌陌问答Demo
通过前面的配置,早已才能通过陌陌公众号处理影片,书籍方面的问题,下边来看看书籍-影片知识图谱问答系统(BM-KGQA)的最终疗效,右图为BM-KGQA才能处理的问句类型。
针对影片类信息,可提问其执导、导演、编剧、海报、上映地区、上映时间、时长、其他名子、简介、详细信息、评分、评分人数等内容。例如提问“流浪月球的出演是谁?”、“流浪月球的播出时间是哪些时侯?”、“流浪月球的评分是多少?”、“流浪月球的详尽信息是哪些”等。需要注意的是,针对问句“流浪月球的评分是多少?”,因“流浪月球”既有书籍也有影片,所以返回两种答案,并对其进行标明分辨。
针对影片人物类信息,可提问其相片、性别、星座、生日、出生地、职业、其他名子、详细信息、介绍等内容。例如提问“吴京的生日是哪些时侯?”、“吴京的出生地是在哪里?”、“吴京的职业是哪些?”、“吴京的天秤是哪些?”、“吴京个人的详尽信息和我说一下”、“吴京执导了什么影片”、“吴京指导了什么影片”等。
针对书籍类信息,可提问其图片、出版社、出版日期、页数、目录、简介、评分、评价人数、详细信息等内容。例如提问“《追风筝的人》的出版社是哪里?”、“《追风筝的人》的出版日期是哪些时侯?”、“《追风筝的人》总共多少页?”、“《追风筝的人》的作者是谁呢”、“《追风筝的人》的详尽信息?”。
针对书籍类人物信息,可提问其图片、性别、生日、出生地、其他名称、介绍、详细信息等内容。例如提问“杨绛的图片内容?”、“杨绛写作了什么书?”、“杨绛的出生地是哪里?”、“杨绛的其他名子称作哪些?”、“杨绛的详尽信息和我说一下?”。
以上,便是书籍-影片知识图谱智能问答系统(BM-KGQA)的最终疗效,还能通过陌陌公众号来精确回答用户关于书籍-影片方面的问题。其实,目前该知识图谱问答系统仅才能处理书籍,影片领域的问题,处理过程也须要依赖大量规则模版,功能还不是很健全。但通过此项目,就能给初学者提供一个解决问题的完整流程,即怎样借助知识图谱来进行特定领域知识问答。后续,将继续进行构建,包括但不限于将特定领域内知识问答推广至百科类知识问答;建立端到端的问句理解模块,直接从中抽取出问句三元组;才能提供复杂问句理解和复杂答案推理功能。