新瓶装旧酒:实践篇(五)KBQA Demo

2020 年 9 月 25 日 AINLP



作为实践篇的最后一篇,我们将介绍如何用Python完成一个简易的问答系统。下图是demo的展示效果:








本实现参考了OpenKG上的demo“基于REfO的KBQA实现及示例”,读者也可以参考该示例,来完成本demo。web界面是基于streamlit(https://www.streamlit.io/)库实现。用这个库来做功能demo再方便不过,几行代码搞定。以后再也不用在终端里面给老师(老板)进行演示了。


  一、基本流程  


此demo是利用正则表达式来做语义解析。我们需要第三方库来完成初步的文本处理(分词、实体识别),然后利用支持词级别正则匹配的库来完成后续的语义匹配。


分词和实体识别(人名和电影名)我们用jieba来完成。对于分词,在实验环境中,jieba还是勉强能用。在我们这个demo当中,有些经常会被使用的词语并不能被正确切分。比如:“喜剧电影”、“恐怖电影”、“科幻电影”、“喜剧演员”、“出生日期”等,在分词的时候,jieba把它们当作一个词来处理,我们需要手动调整词语的频率使得“喜剧电影”能被切分为“喜剧”和“电影”。至于实体识别,jieba对于人名的识别精度尚可接受,但是电影名称的识别精度太低以至于完全不可用。因此,我们直接把数据库中的人名和电影名导出,作为外部词典;使用jieba的时候加载外部词典,这样就能解决实体识别的问题。


将自然语言转为以词为基础的基本单位后,我们使用REfO(Regular Expressions for Objects)来完成语义匹配。具体实现请参考OpenKG的demo或者本demo的代码(https://github.com/SimmerChan/KG-demo-for-movie)。


匹配成功后,得到其对应的我们预先编写的SPARQL模板,再向Fuseki服务器发送查询,最后将结果打印出来。


  二、服务部署说明  


之前项目是基于python2.7,现在更新到python3.6。另外,将终端交互方式,更新到目前的web页面交互,更清晰直观。


不少朋友反馈,在搭建KBQA demo的过程中会出现各种bug。所以我索性直接用docker来统一部署环境,也推荐用这种方式来启动服务。具体方式请参考代码README中的说明。


如果不想通过docker而是直接在宿主机上部署服务,README也提到了相关流程,稍微繁琐一点。需要自己修改一下配置文件、环境变量。


最后提一句,实践篇中d2rq版本是0.8.1,jena是3.5.0(已放在repo中)。其他的版本不保证能正常运行,需要自己改一下配置进行适配。



  三、总结  


我们通过使用正则表达式的方式来解析自然语言,并将解析的结果和我们预定义的模板进行匹配,最后实现一个简易的KBQA。方法没有大家想象的那么“高大上”,没有统计方法、没有机器学习也没有深度学习。正则的好处是,易学,从事相关行业的人基本都了解这个东西;其次,可控性强或者说可解释性强,如果某个问题解析错误,我们只要找到对应的匹配规则进行调试即可;最后,正则冷启动比较容易,在没有数据或者数据极少的情况下,我们可以利用正则规则马上上线一个类似上述demo的初级的问答系统。在现实情况中,由于上述优点,工业界也比较青睐用正则来做语义解析。正则方法的缺陷也是显而易见的,它并不能理解语义信息,而是基于符号的匹配。


换个角度说,用正则的方法,就需要规则的设计者能够尽可能考虑到所有情况,然而这是不可能的。暂且不考虑同义词、句子结构等问题,光是罗列所有可能的问题就需要花费很大的功夫。


尽管如此,在某些垂直领域,比如“音乐”,“电影”,由于问题集合的规模在一定程度上是可控的(我们基本能将用户的问题划定在某个范围内),正则表达式还是有很大的用武之地的。在冷启动一段时间,获得了一定用户使用数据之后,我们可以考虑引入其他的方法来改善系统的性能,然后逐渐减少正则规则在整个系统中的比重。


这里抛个问题给大家思考。在没有标注训练数据的情况下,怎么能正确、高效地抽取句子中的“属性”?比如,我们有一个属性是“出生日期”,用户的问题是“周杰伦是什么时候出生的?”。假设我们已经抽取出“周杰伦”这个实体。后续该如何处理?基于正则的方式在这里就不太合适,或者说会更复杂。具体来说,考虑到可能还有“出生地点”这种属性,仅仅靠“出生”这个词无法准确地判断属性。要写正则,就还得考虑“出生”和哪些词匹配或者说共现能表示“日期”,和哪些词匹配能表示“地点”。如果能比较优雅地解决这个问题,系统就向实用又迈进了一步。




  
  
    

说个正事哈



由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方"AINLP",进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心


欢迎加入知识图谱交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注知识图谱

推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
2

相关内容

“结巴”中文分词:做最好的 Python 中文分词组件
【知识图谱@EMNLP2020】Knowledge Graphs in NLP @ EMNLP 2020
专知会员服务
40+阅读 · 2020年11月22日
【2020干货书】Python3基础导论介绍,98页pdf
专知会员服务
99+阅读 · 2020年10月11日
【实用书】Python编程,140页pdf
专知会员服务
41+阅读 · 2020年8月20日
【阿里技术论文】AliMe KBQA:阿里小蜜中的结构化知识问答
专知会员服务
82+阅读 · 2019年12月14日
【阿里技术干货】知识结构化在阿里小蜜中的应用
专知会员服务
96+阅读 · 2019年12月14日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
论文浅尝 | 基于复杂查询图编码的知识库问答
开放知识图谱
17+阅读 · 2019年7月22日
看完这篇,你也可以实现一个360度全景插件
前端大全
6+阅读 · 2019年5月23日
揭开知识库问答KB-QA的面纱3·向量建模篇
PaperWeekly
8+阅读 · 2017年8月23日
揭开知识库问答KB-QA的面纱3·信息抽取篇
PaperWeekly
15+阅读 · 2017年8月14日
揭开知识库问答KB-QA的面纱1·简介篇
PaperWeekly
6+阅读 · 2017年8月3日
Neo4j 图数据库基础
数据库开发
6+阅读 · 2017年8月1日
KBQA: 基于开放域知识库上的QA系统 | 每周一起读
Arxiv
0+阅读 · 2020年12月3日
Arxiv
0+阅读 · 2020年12月2日
Arxiv
29+阅读 · 2020年3月16日
VIP会员
相关VIP内容
【知识图谱@EMNLP2020】Knowledge Graphs in NLP @ EMNLP 2020
专知会员服务
40+阅读 · 2020年11月22日
【2020干货书】Python3基础导论介绍,98页pdf
专知会员服务
99+阅读 · 2020年10月11日
【实用书】Python编程,140页pdf
专知会员服务
41+阅读 · 2020年8月20日
【阿里技术论文】AliMe KBQA:阿里小蜜中的结构化知识问答
专知会员服务
82+阅读 · 2019年12月14日
【阿里技术干货】知识结构化在阿里小蜜中的应用
专知会员服务
96+阅读 · 2019年12月14日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
相关资讯
论文浅尝 | 基于复杂查询图编码的知识库问答
开放知识图谱
17+阅读 · 2019年7月22日
看完这篇,你也可以实现一个360度全景插件
前端大全
6+阅读 · 2019年5月23日
揭开知识库问答KB-QA的面纱3·向量建模篇
PaperWeekly
8+阅读 · 2017年8月23日
揭开知识库问答KB-QA的面纱3·信息抽取篇
PaperWeekly
15+阅读 · 2017年8月14日
揭开知识库问答KB-QA的面纱1·简介篇
PaperWeekly
6+阅读 · 2017年8月3日
Neo4j 图数据库基础
数据库开发
6+阅读 · 2017年8月1日
KBQA: 基于开放域知识库上的QA系统 | 每周一起读
Top
微信扫码咨询专知VIP会员