第七届中软杯(智能问答系统)
非常感谢杨大帅比和张小可爱为项目所付出的所有心血,最后一次虽有遗憾却不后悔的中软杯
QAQ团队,和我们的logo
bilibili视频地址:视频网址
视频里可以讲解的比较仔细,可以看看。实际上整个项目完成度还很欠缺,较多地方因时间原因未完成,或者只是仓促完成,导致有些部分逻辑很简单,所以效果也不是很好,各位也就当看个思路就好。
题目要求:中软杯赛题网址
简略概述要求:
- 构建一个完整的QA系统
- 整个系统由三部分构成:前端,后台,知识库
- 前端:请设计一个程序,实现QA对话界面,该界面可以基于用户提问,自动连接后台、并从知识库寻找答案,并呈现给用户
- 后台:请设计一个程序从文档中提取尽可能多且质量高的问答对(QA对)
- 知识库:QA对存储管理的类似于数据库的东西
分为用户端和管理员端
- 用户端:用户端为用户使用的页面。用户端提供了用户提问回答,热点问题,智能推荐,闲聊对话等功能。同时页面简洁美观,响应良好,为用户提供了良好的使用体验
- 管理员端:管理员在后台管理系统的页面。管理员端提供了文档上传,运行网页解析算法和生成QA算法,可视化图表查看数据库内容和热点问题,用户提问情况等图表
分为前端,后台,算法,知识库存储
- 前端:使用Bootstrap前端框架加上各种前端模块,搭建了具有风格清新,简单朴实的页面,为用户提供了良好的观看体验
- 后台:使用Django框架,Django作为一款性能优异,轻量级的Python的web框架,能很好的用于本系统的功能支持。作为本系统的后台,为整个系统对外提供流畅服务做到了保障。
- 算法:算法部分分为网页解析算法和QA对生成算法
- 知识库:知识库目前使用Elasticsearch搜索引擎的存储模块
- 前端:大体上是使用的现成的网页进行了修改(毕竟UI设计不太行,感谢前端大佬),主要使用了Bootstarp,还有一些很多的前端插件,就不一一列举了。
- 后台:后台主框架是基于Python的Django框架;里面的一些功能模块:比如用户聊天,使用的是图灵的聊天机器人API,可以将这个替换成seq2seq的对话生成(不过需要自己搭模型和训练);用户意图判断和情感判断使用LUIS(判断是聊天还是提问);问答系统中的自动补全,准确提问,相似问题是使用Elasticsearch进行查询后返回的;后台数据图表展示使用的是Elasticsearch配套的Kibana;后台的上传模块;后台的APScheduler定时管理模块(用于更新Elasticsearch)。
- 算法:算法部分因为是设计的基于逻辑的QA对生成,所以没有用到Tensorflow,scikit-learn等深度学习、机器学习的工具,用到了Stanford的语言模块、哈工大的语言工具LTP,主要是使用的LTP了,里面的基于语义的分析,基于成分的分析效果还是挺好的,这个算法主要也是使用了LTP进行分析,然后就是使用很简单逻辑进行拼接生成QA,所以很制杖,效果一般。针对本赛题的数据集华为云帮助手册的效果还可以,但是使用其他数据集的话会大打折扣,主要是因为一是LTP对于简单的短句,逻辑较为简单句子分析的很清晰,但是长难句就不行了;另外也是设计的逻辑代码也很简单,考虑不全面,生成句子的逻辑不够好。
- 知识库:知识库就是使用的Elasticsearch,使用K-V来保存QA,搜索速度较快。
图例(图中有部分没有介绍)
整个项目主要分成两个模块:
- 用户段的问答系统:问答对话,兴趣推荐,热点问题,闲聊对话
- 后台管理员端:文档录入,QA对生成,知识库管理,数据可视化
详细功能介绍见视频
这个QA对生成是本项目的核心算法,本项目采用的是简单的基于模板的传统方案(没有使用深度学习技术),目前的做法是通过一段陈述句,转换成疑问句。提问,总得有一段被提问的语句(通常都是陈述句),对这段、这句陈述句提问,就可以生成问句。
有两种方式的问句生成:
- 段落的问句生成,本项目对标题进行构造问句
- 对段落中的每一个单句进行划分,对单句进行问句生成(没有集成到项目中,因为问句生成的太多,需要筛选)
疑问句的分类(根据论文中的设定)
问句种类 | 问句案例 |
---|---|
人物类 | 谁可以操作云硬盘备份? |
地点类 | 在哪里可以登录华为云服务器? |
时间类 | 华为云服务器需要多久时间准备? |
原因类 | 为什么使用密钥文件无法正常登录Linux弹性云服务器? |
数量类 | 弹性云服务器有几种计费方式? |
方式类 | 忘记密码如何处理? |
定义类 | 什么是命名空间? |
描述类 | 区块链服务通道为节点提供了什么? |
列表类 | 备份裸金属服务器的操作步骤是哪些? |
是否类 | 是否可以进一步提升图像去雾和低光照处理效果? |
参考自论文:
问句泛化也称为问句复述,主要也是采用哈工大的关于问句复述的论文中(《中文复述问句生成技术研究》2017,曹雨)提到的方式:
-
句式精简
-
构建问句模板(复述模板)
-
使用精简的问句模板去生成其他问句(匹配生成)
-
然后进行候选问句评价, 选出好的句子
-
将问句保存起来
但是本项目最后因为效果的原因(构建模板需要花费大量的时间与精力),没有将泛化模块加入整体的架构中,而是采用了最简单的疑问词替换的形式来对问句进行泛化。
- 管理员上传文档,网页(两种文件格式,目前本系统主要是解析以华为云帮助手册的网页,其他网页需要更改网页解析程序),上传这些文件到服务器端
- 选择需要生成QA对的文件,调用QA对生成算法,生成QA对存入知识库中
- 管理员可以前往知识库管理页面,查看所有的QA对,并可以进行增删改查的操作
- 管理员也可以查看用户的各项信息
- 用户可以在用户界面进行提问,以获取答案
整个项目是一个Django的web项目,主要的各种逻辑部分与后台的view.py相连,通过后台调用的逻辑模块。运行的话,直接部署Django,然后使用Django运行整个项目,在浏览器里面输入localhost:xxxx/index.html(好像是这个,记不清了),然后就行了。
需要配置的模块:
- Django
- Elasticsearch(需要安装,并配置,初始化数据表)
- Kibana(需要安装并配置)
- APScheduler
- LUIS(需要把配置写在view.py里面)
- 图灵机器人(需要把配置写在view.py里面)
- MySQL(需要初始化数据表)
关于数据库文件的说明
数据库分为两个部分:MySQL与Elasticsearch
- MYSQL的部分用于保存User,QuestionCount,UserMining这三个数据文件,这三个文件可以通过QASystem\models.py 文件生成,这个是Django自动生成的。
- User表(提问记录表):
- userquestion 用户提问的问题
- question_time 用户提问的时间
- QuestionCount表(热点问题统计表):
- userquestion 统计的问题
- questioncount 问题被提问的次数
- UserMining表(用户统计表,用于后台的数据展示):
- userip 用户ip
- userquestion 用户问题
- usersub 用户问题主题
- userattention 用户倾向(闲聊还是提问)
- userlike 用户是否喜欢这个回答以及喜欢程度
- times 用户提问时间
- User表(提问记录表):
- Elasticsearch的存储模块用于保存问答对,在安装与配置完Elasticsearch之后,可以使用QASystem\elas.py来创建存储表,表中的字段有:
- question 问句
- accuratequestion 准确的答案
- questionfh1 生成的相似问句1(问句泛化)
- questionfh2 生成的相似问句2
- answer 答案,这个与上面的accuratequestion 相同
- link 问句生成的链接网页
- subject 主题
因为当时比赛的时间紧迫,目前这个代码中有些部分还存在一定的问题,例如问句泛化模块并没有集成到整体的流程中(因为问句泛化效果不佳且费时,目前使用的是一种简单的疑问词替换的方式),按句子生成的问句的方式也没有集成进去,因为这样生成的问句太多,需要进行筛选。
感谢张小可爱为项目制作了非常精美的宣传册,介绍了本项目
这边顺便也介绍一下问答系统(因为了解时间不长,可能有误,请谅解),这些也是经过查阅网上资料总结而得的。
问答系统大概分为这几种:
- 基于结构化数据的问答系统
- 基于自由文本的问答系统
- 基于问题答案对的问答系统
其中的结构化数据的问答,应该类似于数据库的匹配查询
基于自由文本,我觉得这个应该就是机器阅读理解,而且这个也是目前比较火的一个方向,这也是我目前比较了解的一个。机器阅读理解有经典的SQUAD数据集,中文的Dureader数据集,基于这些数据集设计的深度学习框架目前效果也不错,可以使用这些模型来搭建问答系统。因为这种基于自由文本的问答,不需要构建问句,直接将问句去文章中匹配即可。难点在于如何将问句匹配文章中的答案,这也是深度学习模型需要处理的问题,而且不需要过多的操作文档,这样减少了文档的信息丢失。机器阅读理解主要有三大难点:表示问题、搜索匹配问题,答案输出问题(这边就不展开了)。
基于QA对,主要是这个知识库,知识库可以是QA对,也可以是目前研究很多的知识图谱。基于QA对的,难点在于Q与A的生成,自然语言生成现在还是一个较难的点,研究的效果也不是很好。基于知识图谱的,难点在于如何构建知识图谱,如何抽取句子中的关系。