作者简介
毛毛,携程高级数据挖掘工程师,热爱自然语言处理和推荐系统。
一、背景介绍
携程一直注重用户的服务效率与服务体验,在售前、售中、售后全过程中给用户提供高效的客服支持。
用户访问客服页面后,会首先与智能客服进行对话,当智能客服给出的回答无法解决用户问题时便会接入人工客服,再由人工客服给出专业的解答。对话完成后,系统根据人工客服会话内容,应用NLP相关技术给出会话类别。这一结果将直接指导客服的管理与决策。本文将主要介绍携程机票在人工客服会话分类时使用的相关NLP技术和优化方案。
图1-1 智能客服会话与客服会话
二、问题分析
人工客服会话分类时主要使用的数据是客服与用户的文本对话内容,本质上是NLP(自然语言处理)领域中文本分类的问题。文本分类的应用领域如文档主题分类、情感分类、垃圾邮件分类等。现阶段经典的文本分类方法包括:基于统计数据特征构建文本分类模型、基于词向量和深度学习网络构建文本分类模型、基于预训练语言模型构建文本分类模型。
传统的文本分类方法通常是基于统计数据构建文本特征,然后采用线性模型、SVM支持向量机模型等进行文本分类。传统文本分类方法中的文本表示方式包括布尔模型、向量空间模型、概率模型、潜语义模型等,如图2-1所示。
图2-1 文本表示方式
随着深度学习的发展与应用,文本表示方式也发生了变化,可以直接将文本中的字或词作为输入,在如CNN (convolutional neuralnetworks,卷积神经网络) 或LSTM (recurrent neuralnetworks based on long short-term memory,长短期记忆人工神经网络) 等网络结构中加入embedding层 (嵌入层) ,而后自动获取文本的特征表达。embedding层是将高维向量映射到低维空间的过程,经典的embedding方法如word2vec是将词转化成可计算的结构化向量。Word2vec包含两种训练模式CBOW (ContinuousBag-of-Words Model) 和Skip-gram (Continuous Skip-gram Model) (如图2-2所示)。CBOW是通过上下文来预测当前词,Skip-gram是以当前词作为特征来预测上下文。由于 Word2vec 会考虑上下文,相较于传统的文本表示方法效果更好。
图2-2 Word2vec的两种训练模式
2018年左右,注意力机制 (Attention) 被广泛地应用到自然语言处理任务中。Attention是模仿人脑中的信号处理机制,即人类视觉在观察图像时,会在一些局部区域上投入注意力,重点关注。Attention的本质可以被描述为一个查询 (query) 到一系列 (键key-值value) 对的映射,如图2-3所示。在文本分类任务中,可以通过引入self-attention机制的方式识别长文本中不同词语在不同类别的重要性。self-attention机制即自己注意自己,简单地说在self-attention中Query=Key=value,每个词会与同一句话中另外的词做计算,这样更能够把握句子中词与词的句法特征、语义特征。
图2-3 Attention 键值对映射
近年来,随着Transformer架构的提出,一大批预训练语言模型刷新众多NLP任务,如Bert、XLNet等。这些模型首先使用大规模文本语料库进行预训练,并对特定任务的小数据集微调,降低单个NLP 任务的难度。
其中,经典的预训练语言模型BERT (Bidirectional Encoder Representations from Transformers) 诞生于2018年10月,不久便占据GLUE各大任务的榜首,其中涉及情感分析、自然语言推断、文本含义分析与分类等。BERT由谷歌推出并已开源,成为近几年NLP领域具有非凡意义的里程碑,大力推动了NLP项目在工业界的落地。
如图2-4所示,BERT基于Transformer架构,是一个由Transformer-Encoder部分组成的双向语言模型,包括输入嵌入层 (Embedding Layers) 、编码层 (Encoder Layers) 和输出预测层 (PredictionLayers) 三大组件。其中嵌入层包含对输入词句的TokenEmbedding,PositionEmbedding和SegmentEmbedding三种表征操作。
图2-4 BERT结构简示图
三、数据处理
在建模之前,我们首先对人工会话数据进行预处理。如图3-1所示,现有的人工会话数据中包括了中文、特殊字符如标点符号、数字、表情符号等,我们首先处理中文、特殊字符。其次,由于文本长度不一致,仍需做文本等长处理。
3.1 中文处理
中文处理包括固定话术、繁体简体转换、同义词替换、分词。
(1)固定话术
用户与客服对话的过程中,会有一定的固定话术,如“管家_游游为您服务,请问有什么可以帮助您的?”这些固定话术存在于每个文本中,对分类没有特别大的帮助,因此在数据处理过程中,我们就会使用正则匹配的方式去除固定话术。
图3-1 数据处理
(2)繁体简体转换
数据处理时,我们将会话中的繁体转为简体。
(3)分词
中文分词是指把一句话切割成不同的词,我们推荐使用jieba或HanLP作为分词工具。这些工具在分词时都会使用自带的词典,也提供了自定义词典的添加功能。我们分析会话数据后,定义了机票行业特有的词典并加入分词工具中,以提高分词的准确率。
(4)同义词替换
不同用户在咨询同一事件时的表述往往不同,如在咨询“金牌服务包”增值产品时,用户会表达为“服务包”、“金牌包”、“金牌服务”。因此,在数据处理过程中,我们定义了机票行业特有的同义词替换表,并将会话中的词语进行同义词替换,便于后续建模。
3.2 特殊字符处理
特殊字符主要包括标点符号、数字、表情符号等,这类字符都是需要过滤掉的。句子中的标点符号如逗号、句号等有分割句子的作用,因此在分词前保留,分词后再去除。
3.3 文本等长处理
在将文本投入模型之前,需要把分词后的句子转化为相同长度的向量,这就意味着我们需要对过长的文本进行截取,对过短的文本进行补充。在文本截取与补充的过程中,主要看文本长度分布,将95分位数的文本长度作为最大长度。
四、建模与优化
人工客服会话分类的建模过程中,我们主要尝试了词向量 深度神经网络的分类模型、词向量 深度神经网络 注意力机制的分类模型、预训练语言模型。词向量 深度神经网络的分类模型选用的是Bi-GRU,词向量 深度神经网络 注意力机制的分类模型分别尝试了Bi-GRU self-Attention、HAN,预训练语言模型选用的是经典的Bert。
我们将Bi-GRU模型作为后续优化的参照(baseline模型),通过对误差数据的分析,尝试多种优化方案,最终采用改进的Bi-GRU self-Attention模型,实现人工客服会话在12个类别上的分类准确率提升6.2%。
4.1 参照模型
数据处理完成后,使用Bi-GRU进行建模,并将模型效果作为后续优化的参照。Bi-GRU (BidirectionalGate Recurrent Unit) 是双向循环神经网络的一种。由于循环神经网络很难处理长距离的依赖,容易出现梯度消失和梯度爆炸的问题,因此SeppHochreiter 、 JürgenSchmidhuber提出长短时记忆网络 (Long-ShortTerm Memory,LSTM) ,LSTM是由遗忘门 (forget gate) 、输入门 (input gate) 、输出门 (output gate) 组成的循环神经网络。GRU (GatedRecurrent Unit) 是LSTM的变体,它对LSTM做了很多简化,同时保持着和LSTM相同的效果。GRU对LSTM做了两个大改动:
(1)将输入门、遗忘门、输出门变为两个门:更新门 (UpdateGate) 和重置门 (ResetGate) 。
(2)将单元状态与输出合并为一个状态。
GRU单元内部计算逻辑如图4-1所示。
图4-1GRU单元内部计算逻辑
4.2 Badcase分析
通过Bi-GRU模型我们获得了12类各类别准确率及整体准确率78.12%。其中分类正确率低于60%的类别为“预订”、“支付”、“X产品”,分类正确率低于70%且会话量大的类别为“订单查询修改”。我们着重分析这几类的错误原因。
(1)缺乏对词语重要性的表示
如图4-2所示,预订类别的会话通常会被误判为订单查询修改(占比63%)、增值服务(占比19%)、X产品(10%)。如下两个会话:
图4-2 ‘预订’标签误判数据中各类别占比
S1: 你好,我从上海回新加坡这趟行程需要托运古筝,长165cm左右的超长行李,重量不会超过20kg,请问东航可以运送吗?......。(订单查询修改)
S2: 您好,我要买一个票,然后乘客的名字太长了,然后说这边人工帮我订,从新加坡到上海,需要行李托运。(预订)
对于上述两个会话,都包含了如“上海”、“新加坡”、“托运”、“行李”等词语,但会话S1“上海回新加坡这趟行程”表明了已经有机票,是在咨询特定机票的政策等信息,其业务类别标签是订单查询修改。会话S2的业务类别是预订,在该会话中“买一个票”充分表明了用户要买票的意图。
因此,我们认为相同的词语在不同的标签下其重要性是不同的,比如“上海”和“新加坡”都出现两个会话中,但由于出现的位置、前后关联的词语不一致,其对分类的重要性也就不同,在模型的优化过程中可以考虑加入注意力监听机制。
(2)未能正确识别行业词汇
对于“支付”和“X产品”这两个类别,会话在分词时准确率就有一定的损失。如下会话:
S3:金牌服务包是什么?金牌服务包是包含40元接送机券,8元免一次同舱改签手续费。
其在分词时被分为:['金牌','服务','包是','什么','?','金牌','服务','包是','包含','40','元','接送','机券',',','8','元免','一次','同舱','改签','手续费','。']
但其实“金牌服务包”是携程机票推出的一个服务产品,在分词时不应当被拆分,因此一方面,我们总结出这些行业词汇,并将其加入到jieba的自定义词典中。另一方面,分词的准确率直接影响了后续文本分类模型的准确率,我们尝试通过Bert等预训练语言模型降低分词准确率的影响。
(3)上下文特征未能充分表达
上下文特征通常是指用户会话时所处的场景特征,在模型中引入上下文场景特征有利于业务经验的表达,如下会话:
S4:超重行李怎么购买?##请您稍等哦~ 我查看下订单哦##好的呦##帮您核实您订单没有免费托运行李的,您需要购买多少KG呢?...(增值服务)
S4中的用户是一个无行李额出行的用户。因此,可考虑将用户咨询时的上下文场景信息如用户本身的信息提取出作为特征加入到模型中。
4.3 优化过程
依据上述badcase的分析,我们进行如下优化。
(1)针对错误原因1:缺乏对词语重要性的表示。
在优化过程中首先考虑将Self-Attention与循环神经网络进行组合。尝试的模型包括Bi-GRU Self-Attention、HAN。
- Bi-GRU Self-Attention
Bi-GRU Self-Attention模型结构如下图4-4所示,在Bi-GRU的输出层后加入Self-Attention,用于监听每个词的重要性。
图4-4 Bi-GRU Self-Attention模型结构
- HAN
HAN (HierarchicalAttention Network for Document Classification) 是由ZichaoYang,DiyiYang等针对文档级别的分类任务提出的分级注意力模型。如图4-5所示,该模型有两个层次的attention机制,分别应用于单次级别和句子级别。attention机制让模型基于不同的单词和句子给予不同的注意力权重,让最后的文档表示更精确、有效。
图4-5 HAN模型结构
(2)针对错误原因2:未能正确识别行业词汇。
除了在数据处理过程中添加行业词汇,我们还尝试了近年来比较火的预训练语言模型如 Bert进行了建模。其好处在于在处理中文相关任务时,可直接基于单字学习字向量,避免了印欧语系的分词误差,而且字向量远少于词向量,有效避免场景OOV (Out of Vocabulary) ,并且大幅缩减模型体积和复杂度。Bert建模过程中使用预训练的词向量作为特征,并在已有的数据集中进行微调。
(3)针对错误原因3:上下文特征未能充分表达
采用改进的Bi-GRU Self-Attention。如图4-6所示,我们在Bi-GRU Self-Attention的基础上加入上下文场景特征,将这些特征处理成类别型变量,输入到模型中,最终该模型实现人工客服会话在12个类别上的分类准确率提升6.2%。
图4-6 改进的Bi-GRU Self-Attention
各模型的训练效果如表4-1所示。从训练效果来看,相对于Bi-GRU Self-Attention(80.13%)、HAN(80.97%),Bert取得的准确率为82.84%,提升非常明显。引入强规则特征后改进的Bi-GRU Self-Attention效果达到了84.47%。
表4-1 各模型训练效果 | |
---|---|
模型 | 准确率 |
Bi-GRU | 78.12% |
Bi-GRU Self-Attention | 80.13% |
HAN | 80.97% |
Bert | 82.84% |
改进的Bi-GRU Self-Attention | 84.47% |
五、总结
文章首先介绍了人工客服会话分类的背景,并从问题分析、数据处理、建模与优化三个部分介绍NLP技术在携程机票人工客服会话分类中的应用。
在问题分析部分,我们讨论了文本分类的几种经典的方法,包括基于统计学特征构建分类模型、采用词向量 深度神经网络构建分类模型、采用预训练语言模型进行分类。数据处理部分,介绍了人工会话数据的预处理方式。建模与优化部分,对badcase进行分析并总结三类错误原因,针对这三类错误原因给出可行的优化方案。
我们尝试了多种文本分类模型,并在分类效果上取得不断地提升,后续可以将预训练语言模型和上下文特征进行组合,进一步提升模型分类的准确率。
团队招聘信息
我们是携程机票研发团队,负责携程APP/PC端机票业务开发及创新。机票研发在搜索引擎、数据库、深度学习、高并发等方向持续不断地深入探索,持续优化用户体验,提高效率。
在机票研发,你可以和众多技术顶尖大牛一起,真实的让亿万用户享受你的产品和代码,提升全球旅行者的出行体验和幸福指数。
如果你热爱技术,并渴望不断成长,携程机票研发团队期待与你一起腾飞。目前我们前端/后台/数据/测试开发等领域均有开放职位。
简历投递邮箱:tech@trip.com,邮件标题:【姓名】-【携程机票】-【投递职位】。