Eric,基于多搜索引擎的自动问答机器人

简介:

ERIC(https://github.com/SnakeHacker/QA-Snake)是一个采用Python编写的基于多搜索引擎和AIML技术的问答机器人,英文名的意思是多才多艺的(这也是我想赋予他的)。目前支持的功能有:闲聊,通用问答等。本文主要讲述我在写Eric的过程中对于问答系统的一些思考与想法,在文末会介绍Eric的使用和展示。

最初接到导师给的研究题目(自动问答)是在2017年4月上旬,然后就在看大牛们写论文(文末给地址),找相关资料以及研究市场上各种现有的商业自动问答产品(中国版的聊天机器人地图 Chatbots Landscape - 知乎专栏)中度过了一个月,这个过程中少不了狂和机器人聊天,测试不同产品对同类问题的反应。

现代的自动问答是将自然语言处理、统计机器学习深度学习相结合的产物。自从1950年代图灵测试而诞生至今,自动问答系统的发展已经有几十年的历 史。但真正在产业界得到大家的广泛关注,则得益于2011年Siri和Watson的成功。这一方面归功于机器学习与自然语言处理技术的快速进步,另一方 面得益于维基百科等大规模知识库以及海量网络信息,也就是大数据的飞速发展。

然而,现有的自动问答系统还不够完美,部分还是基于关键字模版匹配(包括一些商业产品),无法真正做到语义理解的程度。在通用领域实现一个不被大多数人喷的问答系统更是难上加难。事实上,无论是业界应用还是学术研究,问句的真实意图分析、问句与答案之间的匹配关系判别仍然是制约自动问答系统性能的两个关键难题。

几乎所有的问答系统的流程可以归结为以下几部分:


目前的研究工作大多集中于上图的两个虚线框中的内容,有用传统的规则搞的,也有用统计方法搞的,也有用深度学习方法搞的。中文的问答系统,还需要进行分词 等工作。问答系统又不同于聊天机器人(小冰等),它是要解决实际问题的。比如客服问答机器人,阿里和京东的都做得非常不错,这不仅是基于他们强大的研发团 队,足够的数据支撑模型训练也是重要的因素之一。

然而,我就想做个简单的问答机器人,然后顺利毕业啊。没有那么多公开的中文数据,怎么破?学术界的大多方法还不能很好地运用到工业界。看完论文和大 多商业产品后,我开始思考Eric的定位,由于目前中文的问答训练集非常少,并且没有通用的问答训练集,这对于一开始想采用统计机器学习、深度学习训练一 个问答模型的我造成了非常大的困难,这个问题足足困扰了我一周。在不断查找资料的过程中我发现了AIML,非常棒的人工智能标记语言。Alice是一个基于AIML实现关键词匹配和简单的推理的聊天机器人,它的语料库非常之大,不过是英语的((╯﹏╰))。

但不管怎么样这是一种实现问答机器人的方式,于是我先跑通了基于AIML的问答机器人。但是他仅仅是基于关键词匹配和简单的推理,缺少语义理解的能力,虽然它的可扩展性非常强,但是如果只做到这步的话,我想我是没办法顺利毕业了。

在研究AIML的过程中,我发现了互联网上有许多半结构化数据。比如维基百科,百度百科等。我尝试使用AIML把问句转换成一种结构化的 Query,然后再百度百科中找到对应属性的属性值。比如“王思聪的父亲是谁?”这个问题,AIML根据规则会抽取出“王思聪”,“父亲”。抽取出来的实 体和属性是很容易在百度百科中搜索到的。但问题又来了,如果问“王思聪的老爹是?”这类问题,Eric就找不到答案了。为了解决这个问题,我引入了哈工大的同义词词林进行关键词扩展。

做到这步,基本上百度百科上有的答案我都能搜出来了。这还远远不够,对于百度百科没有的答案怎么办呢?有些问题的答案其实已经在搜索引擎的前几十条答案中有,人很容易找出这些答案,但机器怎么找答案呢?

知识图谱是我原本想模仿百度百科做的一个本地知识库,后来发现,要构建这样的通用知识库太麻烦了,工作量非常之大。那么既然百度有了知识图谱,我为 何不去尝试用它,而要重复造轮子呢?同样的道理,本地其实不需要太多的知识,所有的知识搜索引擎几乎都能找到,为何还要耗时费力的去构建本地的知识库呢, 我的知识库就是整个互联网啊。百度没有搜到的东西,Bing有吧,Google有吧?

做到这步Eric的定位就比较清晰了,自动问答的问题也就变成了根据问句从互联网中抽取答案。我还想做闲聊,但是也没训练集。我尝试让两个产品的机器人互聊,借此收集语料,结果他们聊死了。最后在网上找到一个质量一般的聊天对话语料库,暂时凑合着先用。后面有时间再来聊优化闲聊的部分。

我采用BeautifulSoup对百度知道、百度百科、百度搜索、Bing搜索这四个信息源进行了规则解析。这里要提一下百度知道(包括类似的问答社区),在线搜索解析的成本真的比写爬虫把数据抓取并存储成结构化知识要省力得多,现成的知识库要灵活运用起来。

下面是Eric的问句效果,我拿杨尚川老师的“测试人机问答系统智能性的3760个问题”以及自己收集的问题进行了测试,结果还凑合。下面是结果,用Django写了个站进行展示:






Github上放出来的代码提供了支持命令行的问答模块以及基于Socket通信的server端,代码很乱,后续会做进一步改进。

总结:

目前的Eric还很稚嫩,还存在包括但不仅限以下问题:

1.多轮对话能力为零
2.没有情感
3.对于搜索引擎都找不到的答案,没有自己的“思维”抽象能力。
4.问答的结果如何评估?目前都是人在看,对于中文的问答有没有比较好的评估标准和方式?
5.语义相同问法不同的问句返回的答案会不一致,还是没做到语义理解。
后期我将做以下工作:

1. 将CNN问句分类用于Eric,为后续对不同类别的问句做针对性回答策略做铺垫。(目前遇到的问题还是训练集不够,模型用Tensorflow已经搭好了。)
2. 尝试解决语义理解。
3. 问句收集模块的设计与实现。
4. 对于多个候选答案进行打分排序,提出一个打分策略并验证可行性。



原文发布时间为:2017-06-07
本文作者:Snake
本文来自云栖社区合作伙伴“ Python中文社区”,了解相关信息可以关注“ Python中文社区”微信公众号
相关文章
|
11月前
|
SQL 安全 算法
网络安全与信息安全的全面解析:应对漏洞、加密技术及提升安全意识的策略
本文深入探讨了网络安全和信息安全的重要性,详细分析了常见的网络安全漏洞以及其利用方式,介绍了当前流行的加密技术及其应用,并强调了培养良好安全意识的必要性。通过综合运用这些策略,可以有效提升个人和企业的网络安全防护水平。
|
运维 监控 安全
阿里巴巴DevOps实践指南(十五)| 应用环境能力
应用环境解决方案并不仅仅是将应用的开发环境、基础环境搭建起来即可,还涉及到环境的稳定性如何保证,基于环境如何规范变更的流程,基于环境如何提升开发效率等等。环境治理需要站在更高的角度,综合看待上述问题,否则就会陷入环境问题年年治理、年年被吐槽的怪圈。
阿里巴巴DevOps实践指南(十五)| 应用环境能力
电脑上扫码支付功能用法
  PC扫码支付的方式,支持前置模式和跳转模式。  前置模式是将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以 iframe 方式请求支付宝页面。具体分为以下几种:  0:订单码-简约前置模式,对应 iframe 宽度不能小于600px,高度不能小于300px; qr_pay...
3083 12
|
10月前
|
传感器 容器
如何选择适合自己应用场景的水传感器
选择适合应用场景的水传感器需考虑因素包括:水质、测量范围、精度要求、安装环境及成本预算。不同场景如饮用水、工业废水、地下水等需选用不同类型传感器。
414 55
|
NoSQL 测试技术 Go
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
|
10月前
|
负载均衡 网络虚拟化 网络架构
Trunk的概念与设置
Trunk的概念与设置
1746 4
|
11月前
|
安全 调度 虚拟化
探索现代操作系统的架构与优化
本文将深入探讨现代操作系统的核心架构和优化技术。从操作系统的基本定义入手,逐步解析其内核结构、进程管理、内存管理和I/O系统。同时,还将讨论现代操作系统在多核处理器支持、虚拟化技术和安全性方面的创新与优化措施。通过这些内容,读者可以全面了解操作系统的工作原理及其在实际应用中的表现与改进。
|
API 开发者 Python
API接口:原理、实现及应用
本文详细介绍了API接口在现代软件开发中的重要性及其工作原理。API接口作为应用程序间通信的桥梁,通过预定义的方法和协议实现数据和服务的共享。文章首先解释了API接口的概念,接着通过Python Flask框架示例展示了API的设计与实现过程,并强调了安全性的重要性。最后,本文还讨论了API接口在Web服务和移动应用程序等领域的广泛应用场景。
|
监控 安全 Linux
在Linux中,SELinux和AppArmor安全模块作用是什么?
在Linux中,SELinux和AppArmor安全模块作用是什么?