龙空技术网

案例 | 基于NLP及微服务架构的投诉工单智能分类的实现

金融电子化 604

前言:

现在看官们对“数据结构霍夫曼树算法”大约比较关切,同学们都需要剖析一些“数据结构霍夫曼树算法”的相关知识。那么小编也在网络上汇集了一些关于“数据结构霍夫曼树算法””的相关资讯,希望朋友们能喜欢,姐妹们快快来学习一下吧!

文 / 华夏银行信息科技部 关杏元 李大伟 古伟

NLP是人工智能异常活跃且非常重要的一个领域。文本分类作为NLP(自然语言处理)的一个重要分支,应用非常广泛,比如:语义理解、新闻分类、商品评论信息的情感分类等等。它的核心方法是首先提取数据的特征,然后建立并训练得到模型,再利用模型选择最优的匹配,从而实现分类。本文介绍了采用NLP有关算法实现投诉工单智能分类的思路和具体过程,同时介绍了采用微服务架构部署服务的实现方法,供大家作为NLP应用(特别是文本分类)的实践参考。

一、问题背景

根据人民银行及银保监会对金融消费者投诉分类标准的有关要求,商业银行需要详细记录客服投诉工单内容,并按照业务办理渠道、投诉业务类别、投诉原因等几个维度分别、准确分类,定期报送。

长期以来,华夏银行座席代表在填写投诉工单时,均通过手工选择投诉业务办理渠道、投诉业务类别、投诉原因三个子项的细分项目。由于细分项目涉及较多(多达70多项),占用了坐席代表过多时长,影响接听效率。若多个代表同时记录投诉工单,会影响客服中心整体服务水平。

为了解决上述问题,我们考虑借助AI的NLP有关技术建立分类模型,依靠模型对众多的细分项目进行实时智能分类,能够根据最新的投诉工单数据再次训练,不断更新迭代生成新的模型。同时考虑进一步提升客服体验,尽可能减少不必要的技术环节和人工干预,实现模型的自动学习迭代、自动上线部署,让客服操作简单方便、直观。

二、系统逻辑架构设计

根据实际需求,设计了逻辑架构,如下图所示:

图1:系统逻辑架构

逻辑架构共分四层:

(一)基础层

为保证训练模型的效果,必须积累足够多的高质量的数据资源,采用hadoop分布式计算存储数据。为缩短模型训练时间,同时提高实时预测的速度,我们安装了GPU。

(二)平台层

平台层的主要功能是支持服务部署。我们采用docker将应用程序(又称服务)及其依赖打包成一个可移植的镜像,然后将镜像发布到任何安装docker引擎的linux服务器上,利用k8s完成应用的部署,并获得隔离、一致的运行效果。

(三)技术层

技术层主要涉及开发过程所采用的具体技术栈。NLP通用技术如停用词过滤、词干提取、词袋模型、TF-IDF、Word2Vec、分词技术等。开发语言选用当前热门的python语言。在算法上,考虑分别采用经典的TextCNN和新近的fasttext以及BERT进行建模,并对模型效果进行比较分析,最后选择适合的算法。基于人工智能的应用开发,通常会选择使用主流的框架,比如TensorFlow、caffe、keras、pytorch等。也可以考虑不使用这些主流框架,而采用python、java开发,采用flask框架进行部署。

(四)应用层

在应用层,需要考虑为了支撑该文本分类的需求所应开发实现的具体功能,通过需求分析,确定具体功能大致分三类:一是投诉工单智能分类实时预测,二是投诉工单智能分类模型更新迭代,三是有关的查询功能。

三、算法实验

为了选择适合的算法,我们尝试了以下三种,下面分别介绍。

(一)TextCNN算法建模过程

首先去除停用词,然后进行中文分词,中文分词的工具非常多,本次实验使用Python版的jieba分词工具包来执行分词操作。如图2所示,第一个红框内的内容是分词前的一条记录,第二个红框内的内容是分词后的记录。

图2:分词效果

(1) 文本向量化

为了让计算机能够理解词汇和便于进行深度学习,需要将词汇信息映射到一个数值化的语义空间中,这个语义空间我们可以称之为词向量空间(词向量模型)。文本向量化的方式有很多种,例如:TF-IDF、BOW、One-Hot、分布式的表示方式(word2vec、Glove)等。

(2) 建立训练网络

使用tensorflow框架建立训练网络,设置网络的重要参数,如训练轮数、每一批次训练数据的数量、存储模型有关设置、句子最大长度、嵌入的维度、词汇表的大小、卷积核的尺寸、卷积核的个数,定义卷积过程和池化过程等等。还要定义损失函数和计算准确率的方法。

(3) 训练

设置训练迭代200轮,大约经过70分钟时间完成训练,生成了基于tensorflow的模型。该模型在训练集上的准确率达到了96%,但是在验证集上的准确率仅达到了75%,如下图所示。

图3:模型在训练集和验证集上的准确率

(二)Fasttext建模过程

使用fasttext训练建模的过程与TextCNN相比,有很多相似,比如它也要经过去停用词(还包括去数字、去空格)、分词、添加标签、合并文件、打乱数据顺序等,他们主要的不同在于训练网络结构的差异,TextCNN采用词向量生成(Embedding)、卷积(Convolution)、池化(MaxPolling)、全连接和Softmax,而fasttext采用了类CBOW架构、层次softmax和N-gram字词特征,后面会比较详细介绍其工作原理。

使用fasttext算法,训练轮数设置为1000,wordNgram设置为3,使用10000条训练数据,大约经过2分钟的训练生成模型,该模型在测试集上的准确率和召回率均超过98%。

(三)BERT建模过程

采用BERT训练建模,即在BERT的中文预训练模型的基础上,再使用自己的数据进行训练,即便使用GPU,训练时间也可达到了数个小时之久,对硬件资源要求较高。

使用10000条投诉工单数据,设置训练轮数为200,每一批次训练数据的数量为64,大约经过12个小时的训练生成了模型,该模型在测试集上的准确率达到77%。

四、算法选择

(一) 实验数据介绍

本文采用的数据是我行2019年部分投诉工单,共10000条,其中训练集8000条,验证集1 000条,测试集1 000条。按投诉业务办理渠道的不同,该数据分为11类。

(二) 模型评价

使用上面三种算法分别进行建模试验,并就有关指标进行比较,如下表所示:

注:表中准确率、召回率、和F1值均通过每个标签(共11个)分别计算后,再取不加权平均计算所得。

不难看出,fasttext在准确率、召回率、F1值都明显高于TextCNN和BERT,而训练时间又大大缩短(仅2分钟),fasttext在预测速度方面也占优势,据我们的实践经验,fasttext可以在30ms内返回预测结果,并且它无论训练还是实时预测对硬件要求都一般,不必使用GPU。

下面是fasttext训练过程中模型在测试集上的准确率与训练轮数的关系曲线:

图4:训练过程

不难发现fasttext更加适合投诉工单智能分类的实际需求。

五、算法原理

通过以上三种算法的建模实验和指标对比,不难看出fasttext表现最佳。为什么使用fasttext算法训练的模型效果如此突出呢?下面我们简要介绍其原理。

(一)fasttext模型架构

如下图所示,其中X1,X2,…,XN-1,XN表示一个文本中的N个字符级别的n-gram特征向量,fasttext就是用全部的n-gram去预测指定类别。

图5:fasttext模型架构

(二)层次softmax

在标准的softmax中,计算一个类别的softmax概率时,需要对所有类别概率做归一化,在这类别很大情况下非常耗时,因此提出了分层softmax(Hierarchical Softmax),思想是根据类别的频率构造霍夫曼树来代替标准softmax,通过分层softmax可以将复杂度从N降低到logN,下图给出分层softmax示例:

图6:分层softmax示例

(三)N-gram特征

N-gram是基于语言模型的算法,它的基本思想是将文本内容按照子节顺序进行大小为N的窗口滑动操作,最终形成窗口为N的字节片段序列。

每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

简而言之,fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。

六、服务部署

为保证服务效率,我们使用了轻量级的flask作为web框架,将模型训练、评价、测试、上线、预估等服务通过RESTful进行发布。为减小容器镜像,根据算法框架的不同,打包进入执行环境的代码库也不一样,基于BERT的模型服务采用了tensorflow serving进行装载部署,因该版本还不支持直接对输入数据进行特征工程,在调用服务前对数据进行了预处理。对于Fasttext和TextCNN训练的模型则封装成独立模块,载入内存后由flask框架直接调用。

在模型服务的高可用和安全性上,我们直接利用了k8s的容器自动编排和安全隔离功能,实现服务的分布式部署、滚动更新和授权访问。

在模型和数据共享方面,我们采用hadoop集群存储各版本的模型和数据,保证自学习模型迭代更新、效果评估和安全回退。

七、实践体会

通过本项目实践,积累了些许经验和体会,一并分享给大家。

(一)尝试更多算法如XLNET等

本项目并未尝试某些传统算法比如贝叶斯、SVM、KNN、随机森林、决策树等,也没有尝试比较新的算法比如,XLNET等。从算法选择的角度来说,应该使用不同的数据集采用更多算法进行建模,记录其在各项指标上的效果,从而更加全面的了解各种算法的特点,选择出更加适合的算法。

(二)参数调优

就fasttext算法而言,wordNgram(默认为1)设置为2以上可以明显提高准确率。损失函数选用hs(hierarchical softmax)要比ns(negative sampling)训练速度要快很多倍,并且准确率也更高。epoch(训练轮数)值设置适当大一些,对准确率的提升效果明显。lr(学习率)适当调整对模型效果也有一定影响。同时要注意避免欠拟合及过拟合。

特别要提到的是,Facebook于2019年8月份给fasttext增加了自动调参功能,使得fasttext可以根据用户的数据集自动选择最好的超参数,用于构建高效的文本分类器。未来将尝试使用该自动调参功能训练分类模型。

(三)借助微服务架构提高上线部署效率

人工智能应用最后一个重要环节是上线部署。这个环节需要考虑的是如何使待部署的服务获得更高的敏捷性、灵活性、以及可扩展性。传统的虚拟化模式、容器化模式等都不能满足要求。微服务架构因其应用部署简单、硬件资源利用率高、健康检查和自修复、自动扩容缩容、服务发现和负载均衡、独立开发、独立部署、故障隔离、混合技术堆栈、粒度缩放等成为人工智能应用服务部署的最佳选择。

八、总结

本文简要介绍了我行投诉工单智能分类的实践过程,旨在为大家提供NLP和微服务架构应用的一种参考思路。本项目投产至今,运行平稳,因其分类准确率高,预测速度快,较大程度上减轻了业务人员的工作负担,获得一致好评。

标签: #数据结构霍夫曼树算法