转载自:http://www.lwfbxd.com/article-9674.html
摘要:自动问答是计算机与人类以自然语言的形式进行交流的一种方式,是人工智能研究的一个分支。介绍了微信公众平台的特点及其开发接口,研究了Lucene全文检索工具包和IK Analyzer中文分词工具包,并最终实现了一个基于微信的自动问答系统,可为用户提供自动问答服务。测试结果表明,该系统具有一定的实用性。
关键词:自动问答;微信公众平台;Lucene;IK Analyzer
0引言
近年来,随着互联网的快速发展,网络上的信息量呈现出爆炸式增长的势头。用户在互联网上搜索问题时,传统搜索引擎暴露出两个问题:①用户常因关键字选择不准确而导致搜索失败;②搜索结果是一大堆网页链接,用户仍需逐个打开查看。于是,自动问答系统[1]成为了当下研究的热点。这是因为自动问答系统允许用户以一种自然语言的形式进行提问,并且直接给出答案。目前,国外已经有几个比较成熟的问答系统,如:Start、Webclopedia、AnswerBus等系统。但是相比之下,由于中文本身的语义、语法复杂性等多方面因素,中文问答系统的发展则相对逊色一点。本文主要讨论如何借助微信公众平台,利用Lucene和IK Analyzer两个开源工具,构建一个自动问答系统。
1微信公众平台
微信公众平台[2]是腾讯公司在微信基础上新增的功能模块,通过这个平台,个人和企业都能打造一个属于自己的微信公众账号,并且能够实现和特定群体之间文字、图片及语音的沟通和互动。
由于微信拥有其得天独厚的优势,它的用户基数早已突破六亿,所以,基于微信公众平台的开发也正如火如荼地发展起来。微信团队给开发者提供了一套标准的接口,为开发者的开发工作提供了很大的便利。我们从图1中可以知道,开发者要做的就是两件事:①如何正确使用微信开发的消息接口来收发消息;②服务器如何正确处理接收到的消息。其他的事情只要交给微信的服务器去做就行了。本系统正是利用微信公众平台开发的这些优势,只专注于自动问答系统的实现过程,大大减少了网络通信的工作量,选择它作为问答这一互动过程的交流渠道也是基于这些考量。
对于开发人员而言,首先要做的是了解微信公众平台的消息接口。如图2所示,虽然微信消息有很多种类,但其基础接口总体上可以分为两大类,按照微信公布的接口格式对其进行封装处理可以大大减少程序代码的编写量。
2 Lucene全文检索工具包
Lucene[3]是一套用于全文检索和搜索的开源工具包,由Apache软件基金会支持和提供。但Lucene不是一个完整的全文索引应用,而是一个用Java写的全文索引引擎工具包,它可以方便地嵌入到各种应用中以实现针对应用的全文检索功能。
Lucene最核心的两个功能就是索引和检索。它给开发人员提供了很多的API,其中IndexWriter类是创建索引的核心类,IndexSearcher类是搜索的核心类。本系统正是使用这两个类来对数据源建立索引和全文检索,以实现正确匹配用户问题的功能。
3 IK Analyzer中文分词工具包
IK Analyzer[4]是一个开源的,基于Java语言开发的轻量级的中文分词工具包,采用的是“正向迭代最细粒度切分算法”。在最初,它是以开源项目Lucene为应用主体,并且结合了词典分词和文法分析算法的中文分词组件。
IK Analyzer一共支持两种分词模式:智能切分和细粒度切分。这两种分词模式各有自己的优势。对于同样数量的文章,智能分词得到的关键词少,生成的索引文件小,用相同的关键词进行搜索检索得到的结果少、匹配度高;而细粒度分词因为切分得更细,所以得到的关键词多,生成的索引文件大,用相同的关键词进行搜索检索得到的结果更多。
4系统设计和实现
系统工作流程如图3所示。首先,系统按照微信开发的消息接口格式接收来自微信公众平台的消息。然后,系统会用IK Analyzer中文分词工具对用户的问题进行分词处理,再用Lucene工具在事先创建好的FAQ库索引上进行全文检索。接下来,在检索完之后的相关文档中,选出得分最高的文档去匹配该问题所对应的答案。最后,系统再按照微信开发的消息接口格式,将要回复给用户的消息封装成相对应的消息格式,并发送还微信的服务器,通过微信的服务器把用户问题的答案发送给用户。
4.1 FAQ库设计模块
FAQ(Frequently Asked Questions,常见疑问)库[5]是事先准备好的一些问题-答案对,回复给用户的答案都存在这个数据库中。而Lucene正是根据FAQ库的内容建立的索引文件,这也是系统能正常工作的前提条件。
⑴QA表存储的是问题-答案对,这是一个问题只对应一个答案的情况。
⑵QA_Sub表存储的也是问题-答案对,这是一个问题对应多个答案的情况。换句话说,当一个问题有多个答案时,系统将不再从QA表中获取答案,而是从QA_Sub表中随机地抽取一个该问题所对应的答案。其中,pid作为外键,就是指QA表中的问题-答案对的编号(id字段)。
⑶ChatHistory表存储的是用户与公众号之间的聊天记录。通过查看聊天记录,我们可以针对系统不能回答或者回答得不好的问题进行人工的补充和修改。通过定期地更新FAQ库中的内容,可以逐步地完善FAQ库,使系统能回答越来越多的问题,保证FAQ库的健壮性。
4.2问题分析模块
在这个模块中,系统借用的是开源的IK Analyzer中文分词工具包来实现。在智能切分模式下,IK Analyzer工具能对用户发来的问题进行很好的分词处理。除此之外,IK Analyzer不仅可以对专业词汇进行扩充,还可以针对某些特定的应用场景使用停用词典来提高分词的准确率。不过,由于系统主要是用于人们日常生活的交流,并不涉及到某些领域的专业词汇,所以系统仅仅是简单地采用智能切分来处理用户的问题,并没有对专业词汇进行扩充或使用停用词典。
4.3全文检索模块
在这个模块中,系统借用的是开源的Lucene开源检索工具包来实现。在对用户的问题进行分词处理之后,系统要用分词后的内容在基于FAQ库建立的索引文件之上使用开源的Lucene工具包进行全文检索。Lucene拥有强大的搜索功能,其中IndexSearcher就是其搜索的核心类,用于在指定的索引文件中进行搜索。而Search()方法能够帮助我们找到得分前n的相关文档集合。
4.4答案抽取模块
答案抽取模块是对全文检索出来的相关文档作进一步的筛选。简单地,我们可以直接选取得分Top1的文档来当做最匹配的问题,然后再根据该问题的id去FAQ库中选出答案返回给用户。但是,Lucene有着自己的一套评分机制,我们也可以通过干预Lucene的评分公式来影响它的排序结果,从而可以针对不同的场合选取更合适的答案。
5系统测试
本系统分别在装有5.2.1版本微信客户端的安卓和苹果手机上进行测试,测试显示运行效果良好,系统能正常地与用户进行日常交流。测试效果如图4所示。
6结束语
对自动问答系统的研究已经得到越来越多的重视,用户可以通过这些研究成果或方法快速得到自己想要的答案。本文对微信公众平台进行了简单的介绍,分析了系统的主要功能模块,并实现了一个简单的自动问答系统。测试结果表明,该系统达到了预期的效果。但是FAQ库的内容来源及其后期的维护和补充仍是一个庞大的工程,有大量的工作需要做。