如何让你的客服问答系统从“人工智障”到“人工智能”( 二 )


【如何让你的客服问答系统从“人工智障”到“人工智能”】具体实施的时候,我自豪地面向开源项目编程,直接用了 HanLP 中的文本分类器和命名实体识别做意图分类和槽识别,一步到位不要太爽 。
HanLP 是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用 。HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;提供词法分析(中文分词、词性标注、命名实体识别)、句法分析、文本分类和情感分析等功能 。被广泛用于 、Solr、、、、Resin 等平台,有大量开源作者开发各种插件与拓展,并且被包装或移植到 、C#、R、 等语言上去 。项目详见:
所谓文本分类器,就是给定一段文本,HanLP 自动判断类别 。怎么个判断法呢?HanLP 怎么知道你要判断医院的“问路”“查询”“预约”还是新闻网站的“经济”“财经”“教育”呢?这时候就需要用户提供一些例子给 HanLP 学习,这些例子在自然语言处理里面叫语料 。不是随便什么爬虫爬下来的文本都是语料,必须得有具体业务所需要的答案才行 。
比如,在医院的人工客服系统中,累积了很多用户的查询问句,以及客服小姐姐给查询语句打的标签(问路、查询还是预约) 。这些问句+标签就是文本分类的语料,可以直接丢给 HanLP 让它学习 。
学习得到一个文件,储存着如何把问句分类为“问路型”“查询型”“预约型”等等类别的知识,这个文件叫做模型 。存起来丢给线上的 HanLP 分类器加载一下就可以执行分类了 。这里比较推荐基于 SVM 的文本分类器,据说速度和准确率都是最高的 。

如何让你的客服问答系统从“人工智障”到“人工智能”

文章插图
所谓命名实体识别,就是识别人名、地名、机构名之类专有名词的工具 。我这个医疗客服系统里面主要就是医生的姓名了 。听说 HanLP 的感知机分词器是在一亿字的语料库上训练出来的,准确率的确不知道比其他同类工具高到哪里去了 。
HanLP 分词结果中,人名的词性标签是 nr,根据这个就拿到了医生姓名 。至于科室名,HanLP 虽然能分出来但是词性标签就是名词 n 。我的做法是把老胡正则表达式中的科室做成词典,指定词性为 ndep 交给 HanLP 挂载就行了 。反正科室是一个很死板的东西,不会经常变化,一本用户词典管十年基本没毛病 。
新系统 2.0 上线后调查数据显示,用户满意度果然提高了不少 。搞搜索引擎的小伙伴听说了也把他们 ES 的 IK 分词器也换成了 HanLP 分词器,效果拨群 。这样 bug④ 也解决啦 。
后来领导看我这么快就把新系统上线了,马上给我发了奖金,马上给我派了新活儿——让我把院长上次提的多轮询问实现一下 。这说明交差不能太快,闷声才能发大财啊 。
如何让你的客服问答系统从“人工智障”到“人工智能”

文章插图

如何让你的客服问答系统从“人工智障”到“人工智能”

文章插图
根据资料,多轮对话的管理必须有一个对话管理器,负责综合对话历史和当前对话决定回复什么 。在这个项目中,其实就是一个缓冲区的作用 。当一句话里面的槽不全的时候,应该把这句话的意图和槽缓存起来,然后向用户询问更多有关缺失槽的信息 。这样问答系统才更有意思,不仅负责回答问题,还能够向用户提问,帮助他们提出更准确的问题 。
对话管理器的流程如下:
如何让你的客服问答系统从“人工智障”到“人工智能”

文章插图
当然实际的对话管理器比这个复杂,有些问题涉及到好多槽,有时候对话的话题又会变化,总之还是需要消耗一些头发的 。