一、引言
NLP技术在搜索领域有着广泛的应用,可以说,搜索是NLP技术最落地的场景之一。在搜索中,NLP技术涉及到非常多的方面,包含但不仅限于:
本系列将重点在以下四个维度:query理解、序列标注、情感分类、文本去重阐述一下之家的NLP技术在搜索业务中的应用,将分四篇进行介绍,本篇将重点介绍序列标注,后面按照query理解、情感分类、文本去重依次进行介绍。二、序列标注
分词和命名实体识别(后文简称实体识别)是序列标注的两个典型例子,在这里重点讲一下实体识别相关的技术和应用。汽车领域的实体识别相比较通用领域有一定的特殊性,其描述方式多样,结构复杂,但是对准确率的要求又比较高。汽车领域的实体识别存在两个比较明显的特征:(1)简写现象特别严重,比如一个H6,可能指的是车系“哈弗H6”,也可能指的是车系“北汽幻速H6”。(2)不同类型之间存在歧义,比如“北京”有可能是地名,也有可能是汽车品牌“北京”的品牌名。在汽车之家的垂直领域的实体识别类型主要包括以下几类:品牌、厂商、车系、车型、人名、地名等。2.1.技术发展
实体识别可以说是NLP领域应用的一个基础功能,伴随NLP的诞生至今。从其发展进程上来看,大致经历了以下三个阶段:1、模式匹配+规则;2、机器学习方法;3、深度学习方法。2.1.1. 模式匹配+规则
这种方法在封闭领域、速度要求较快的领域仍有使用。其质量的好坏取决于实体词表的精度和完备程度。消歧的工作主要通过专业人士总结出一些业务和通用规则来进行。这种方式在之家的某些领域仍然有应用。这种方法速度非常快,在短文本中有比较好的应用,尤其在query 的理解中。2.1.2. 机器学习方法
对于长文本的实体识别,开始采用的是机器学习的方法,后期又被深度学习代替。在之家的实际业务中,这两种方式都有不同程度的使用。机器学习方法在实体识别方面的典型模型是HMM模型和CRF(条件随机场)模型。从一般统计的效果来看,CRF的效果要好于HMM的实体识别效果,因此,基于CRF的传统机器学习模型相对更广泛一些。本文简单介绍一下CRF。 CRF(conditionalrandom field,条件随机场),是给定一组输入随机变量X的条件下另一组输出随机变量Y的马尔科夫随机场,也即条件概率分布。一般讨论线性链马尔可夫随机场: CRF的典型概念是特征函数的概念。条件随机场的参数化形式:' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
其中,tk是转移特征,是定义在边上的特征函数,类似HMM的转移特征,依赖于当前位置和上一个位置。而sl是状态特征,用以描述当前节点的状态信息,仅取决于当前位置。以上两类特征函数都是有节点位置依赖的,也就是说,对于所有的节点,都会不同的两类特征函数簇产生。
和
为权重。
基于CRF的实体识别,最重要的一点,就是要针对每个节点定义这样的两组特征函数,CRF的常用工具CRF++的模板文件(样式
)就是用来自动产生这两组特征函数,因此,模板文件的好坏直接关乎识别的效果好坏,一个模板良好设计的CRF模型,有时候可以媲美BiLSTM(双向LSTM)模型。
2.1.3. 深度学习方法
深度学习方法用来做实体识别常用的、经常拿来比较的是LSTM(或者BiLSTM)、BiLSTM+CRF、bert原生模型和bert+CRF这四类方法。因为LSTM和bert在做实体识别的时候,都是针对单个token进行独立分类的,因此有的开发者喜欢在这两类模型上层接上CRF层,用来对单独的token进行上下文约束,从而达到对句子级别的标签预测。至于接上CRF的效果如何,不能一概而论。BiLSTM+CRF的结构图如下所示:' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
从各方统计的效果来看,BiLSTM+CRF的方法好于CRF的方法(可能要高5-6个百分点,看具体业务),而bert+CRF的方法好于其他三种方法。但是从实际应用中的试验结果来看,bert+CRF的方法虽然比bert的方案要好一点,但是好的效果并没有那么惊艳(最多1-2个百分点),但是却带来了一定程度的性能损失。这个现象其实从bert的原理也可见一斑。因为bert本身就已经具备了提取上下文特征的能力,CRF的特征函数也具备提取上下文特征的能力,二者在这个角度上看,部分功能是重叠的。在bert上连接一层CRF,更重要的作用是为输出层添加了一层约束,其他维度的效果大打折扣。因此在实际应用中,应该根据自己的业务需求,合理选择使用bert还是bert+CRF。2.2.实体识别的应用
2.2.1. 车系识别
对于车系识别,有歧义的车系识别采用的是CRF+自动消歧的方式,通过大量语料中统计的词频来进行判定是否是歧义词,该模型的识别准确率在85%左右。Bert模型自测准确率在91%左右,大约提高了6个百分点。以上三种方式的实体识别方案都在之家的不同业务场景有应用,基于规则和匹配的方式主要应用在快速处理的场景,比如下篇的query理解。实际处理过程中,对于上面提到的汽车领域的实体识别两大问题,主要通过以下方式来解决。(1)简写现象可以通过“上下文的信息”来进行消歧,比如H6的上下文虽然没有出现“哈弗”,但是可能出现了车系上层的品牌“长城”信息,则可以明确该车系指的就是“哈弗H6”,而非”北汽幻速H6”。如果找不到上下文信息,可以通过H6指向的一些属性信息(比如车系热度)来确定多大程度属于哪个车系。(2)不同类型之间的歧义可以通过“上下文信息+类型权重”来部分解决。一般来说,地名的优先级要高于车系名,除非上下文中含有明确代指类型的信息。比如:北京车展指的是地点,而北京汽车更多指的是厂商“北京汽车”。而CRF 和bert方式提供了独立的服务,供各个业务方进行随时调用,同时
使用在部门内部的其他任务模块中。在之家的实际应用领域,会涉及到两类实体
识别的场景,一类是有歧义的车系识别,一类是通用的车系识别。具体取决于业
务等级定义的严格程度。对于宁缺毋滥的应用场景,宁肯没有识别结果,也不要
识别错误,这时就要考虑有歧义的车系识别模型。有歧义的车系实体识别采用的
是CRF+自动歧义消除的方法,将可能的歧义车系去掉,只保留完全无歧义的车系
结果。对于歧义要求没那么严格的场景,采用的是深度学习的方法,借助上下文
信息进行消歧识别。目前这两种方式都有实现和应用。
2.2.2. 车型识别
为了明确用户的搜索意图,不仅仅是车系识别,车型识别也是query理解的一个重点功能。车型的名字更像是一系列指标维度的罗列和综合,顺序不定。车型识别的重点在于,精准地识别每个维度的值。一个典型的车型名字,比如雅阁车系的一个车型名称:“2007款 2.0L 自动标准精典版”,在这个车型中,包含了5个维度的信息,分别是“年代--2007”,“排量--2.0L”,“变速箱类型—自动”,“配置级别—标准”,“车型特有词—精典版”。这种类似的维度信息大约有几十维,因此,前期的数据收集、整理和分类是一个非常重要的工作。一旦这些维度的值确定了,剩下的识别问题就变成了一个典型的序列标注问题。维度确定后,会将这些维度和信息进行泛化,以增强识别的鲁棒性。这些常见的维度包括但不仅限于:年代、排量、变速箱类型、配置级别、颜色、材质、结构、配置有无、发动机参数、零部件配置、辅助配置等。车型识别主要用来做查询匹配,精准定位到用户想要查询的车型,并进行展示。在query理解中有一个专门的类别就是“车型”。另外,车型识别也用来提供独立的服务,供业务方在此基础上进行二次开发。由于车系、车型等数据存在随时增加的可能性,因此以上各类实体的识别都存在数据实时动态更新问题,因此要设计单独的数据更新模块来进行数据的同步工作,以达到实时访问的要求。2.2.3. 地理位置和机构识别
地理位置识别主要应用在文章地域化打标签,其文章来源包括车家号、原创、论坛和游记等。在大陆的城市(31个省、361个市)中,每个城市都有很多别称,比如北京市(北京市、北京)、内蒙古自治区(内蒙、内蒙古、内蒙古省、内蒙古自治区),所以需要识别的词要远超过392(31+361)个城市。为提高识别效率,先挑选出可能的候选。我们先使用快速AC自动机扫描出句子中的城市,这些城市可能包含很大的歧义,比如红河谷->红河(红河市)、三明治->三明(三明市)、一定安全->定安(定安市)。AC自动机只能保证数据的最大程度召回,并不能保证准确。然后进一步利用模型来解决准确率的问题。' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
我们使用44W句人民日报的标注语料来进行训练,该标注类别包括location、person_name、time、org_name、product_name、job_title、company_name 8个类别,其中locaiton和org_name对我们业务上是符合的。最终选择42W作为训练集,1W开发集、1W测试集。地理位置和机构识别的baseline模型选择业内常用的BiLSTM+CRF,整体的准确率和召回率分别为94.8%和94.1%,其中location的准确率和召回率为95.9%和94.3%、org_name的准确率和召回率为88.8%和90%。为了进一步优化提升准确率我们使用bert+CRF进行建模,整体准确率和召回率分别为94.9%和95.9%、location的准确率和召回率为96.7%和96.3%、org_name准确率和召回率为93.1%和94.5%。根据上述对比,org_name的bert+CRF模型和BiLSTM+CRF模型召回有一定差异,但是二者整体准确率几乎一样,召回率bert+CRF会高1个百分点。在整体逻辑上,我们还添加了两层的业务规则分别进行筛选和补充召回。在使用AC自动机将有可能存在地区的候选句子扫出来之后,首先利用业务常识规则进行筛选(比如桂林人->不应该识别出桂林),将明显不是地名的句子进行剔除,然后使用上面的实体识别模型将location和org_name进行识别并与AC获得结果进行合并,最后一步使用其他的业务规则召回将一些没有识别的地区以扩充召回(比如城市+车展->召回;城市+4S店->召回)。最终按照文档对该模型进行业务评估,准确率为94.5%、召回率为95.5%。速度方面,对于城市比较少的文章车家号和原创 80ms/paragraph,城市很多的文章游记140ms/paragraph。三、完结语
本文从序列标注的角度阐述了这项技术在之家搜索中的应用,包括车系(有歧义和无歧义)、车型、地理位置识别等。当然,相对于NLP的众多应用来说,这是冰山一角。在此也只能做到抛砖引玉地概化阐述,在实际应用中肯定还有很多实际问题要面对。同时随着业务的深入,我们对数据和算法的理解将逐步深刻,有些问题也逐步改进,寻找更适合的解决之法。在此非常欢迎大家就领域问题进行积极探讨,同时,就我们的不足之处提出宝贵改进意见。也希望大家继续关注阅读我们的“NLP在搜索中的应用”下一篇:“query理解在搜索中的应用”。参考文献:
[1]Jacob Devlin, Ming-Wei Chang, Kenton Lee, and KristinaToutanova. 2018. BERT: Pre-training of deep bidirectional transformers forlanguage understanding. arXiv:1810.04805.[2] Zhilin Yang, Zihang Dai,Yiming Yang, Jaime Carbonell, Ruslan Salakhutdinov, and Quoc V. Le. 2019.XLNet: Generalized Autoregressive Pretraining for Language Understanding.arXiv:1906.08237.[3] Ashish Vaswani, Noam Shazeer,Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, andIllia Polosukhin. 2017. Attention is all you need. CoRR, abs/1706.03762.[4] Zhiheng Huang, Wei Xu, andKai Yu. 2015. Bidirectional lstm-crf models for sequence tagging. arXivpreprint arXiv:1508.01991.[5] 李航.统计学习方法[M].北京:清华大学出版社,2012' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)