热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于微信的自动问答系统研究

转载自:http:www.lwfbxd.comarticle-9674.html摘要:自动问答是计算机与人类以自然语言的形式进行交流的一种方式ÿ
转载自: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库的内容来源及其后期的维护和补充仍是一个庞大的工程,有大量的工作需要做。


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • camel_使用Camel在来自不同来源的Solr中索引数据
    camelApacheSolr是建立在Lucene之上的“流行的,快速的开源企业搜索平台”。为了进行搜索(并查找结果),通常需要从不同的源(例如内容管理 ... [详细]
  • 一:什么是solrSolr是apache下的一个开源项目,使用Java基于lucene开发的全文搜索服务器;Lucene是一个开放源代 ... [详细]
  • Nexus3.0.0+Maven的使用(一)
    1、Nexus介绍Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问和部署在你所维护仓 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • 深入浅出解读奇异值分解,助你轻松掌握核心概念 ... [详细]
  • 问题一:在我们进行数据库操作时会发现,数据库中表的编码用的是utf-8,但是在进行dos命令是要使用setnamesgbk(一)Mysql ... [详细]
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • 开发笔记:使用JavaScript解决网页图片拉伸问题
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用JavaScript解决网页图片拉伸问题相关的知识,希望对你有一定的参考价值。 ... [详细]
  • mysql+全文检索设计,基于sphinx+mysql全文检索架构设计.doc
    基于sphinxmysql全文检索架构设计.doc还剩2页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧& ... [详细]
author-avatar
个信2502875605
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有