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

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

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

现代的自动问答是将自然语言处理、统计机器学习深度学习相结合的产物。自从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.对于多个候选答案进行打分排序,提出一个打分策略并验证可行性。

论文地址:链接:https://pan.baidu.com/s/1gfKf4Lt 密码:allj

——Snake

snake

作者: snake

我们需要为这个社会做一点贡献,失去了才懂得去珍惜。

《Eric,基于多搜索引擎的自动问答机器人》有4个想法

    1. 闲聊这个功能就是比如说我发送“你好”,Eric会问候你,随机回复比如“你好,吃了吗”这样的句子,这个功能目前是基于AIML实现的,由于我没有收集到比较高质量的聊天预料,所以闲聊模块还不够好,后期可能会采用深度学习中Encoder-Decoder的Seq2Seq模型尝试解决这个问题,但是还是要先解决语料不足的问题

  1. 以上介紹並沒有看出 Eric 做了哪些創新性工作,感覺上去就是調用或者解析了對應頁面的返回值,並且返回給系統,而其中知識圖譜並沒有自己構建,如果多結果都存在返回值,那麽似乎也沒有進行壹個打分和判斷,或者是歸並操作。

    其次,目前看起來就是自己分了詞,篩掉停用詞,進行同義詞典匹配,請求接口,對數據進行格式化,實際上整個系統沒有自己的處理能力,在系統離線環境下就不能進行問答了?在系統實際應用時,由於問答系統的頻繁使用勢必帶來帶寬資源和連接數的瓶頸。

    請教一下大神是如何解決或者準備解決這些問題的。

    1. 第一个问题的回答:因为自己构建一个通用的知识图谱(特别是中文的,目前个人好像还没有做的特别好的,做的好的都是大厂)成本太大以至于无法完成。所以我的思路是,既然互联网上存在着各种非结构化、半结构化和结构化的文本,为什么不直接想办法利用起来呢?因此网页解析部分是Eric获取互联网数据的关键,对于不同的网页,需要做不同的策略(后期可能会考虑做通用的解析)。第二个问题的回答:由于我选择采用搜索引擎的返回结果作为语料,因此在线是不可避免的。连接数瓶颈的问题后期可能会考虑搜集用户发送的问句,然后做缓存。这样已经搜集的问句就不用重新查询了(在一定时间段中,因为互联网的时效性非长强)补充回答:感谢您的提问,这些问题都将在我之后的优化工作中尝试去解决,您说得创新性,我的理解是,做软件还是要在实用可靠的基础上尝试创新,目前我在解决的是同样语义的问题如何让搜索引擎返回相同的答案(尝试用CNN解决中),自动问答是我的硕士毕业研究方向,因此学术上的创新点是必须的,我也在努力寻找中,但提出理论并用实验验证,和真正的通用、实用、强壮,是两个话题了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注