一、背景介绍
搜索是电商最重要的门面之一,大部分用户通过搜索来找到他们想要的商品,因此搜索是用户表达意图最直接的方式,也是转化率最高的流量来源之一。绝大部分的电商搜索是通过搜索框输入搜索词(Query)来完成,因此,搜索词的词义解析和意图理解成为了搜索中的重要一环。
主流的搜索词义解析和Query理解需要经过纠错、同义词替换、分词、词性标注、实体识别、意图识别、词重要度权重、丢词等步骤。以旅游场景下的搜索举例,如图1所示,当用户在搜索框输入“云南香各里拉”作为Query的时候,首先搜索引擎需要对该搜索词进行纠错,这是为了便于后续步骤正确解析出用户想要搜索的内容;如果有必要,还会进行同义词替换。然后,对搜索词进行分词和词性标注,识别出“云南”是省,“香格里拉”是城市或者酒店品牌,紧接着会做实体识别,召回“云南”和“香格里拉”在后台数据库里对应的实体id。
这个时候,出现了一个分歧,“香格里拉”既可能是城市,又可能是酒店品牌。在用户进行搜索的时候,是否能够预测出正确的类别和实体,对于搜索结果的精准展示和提升用户体验有重要的意义。因此,我们必须识别出用户真正想要搜的是什么类别,并找到对应的实体,否则可能在搜索列表页前排会给出用户不想要的结果。从人的先验知识来看,用户搜索“云南香格里拉”,很大可能性是想要搜城市。意图识别步骤,就是为了实现这个功能,识别出用户真正的搜索意图是代表城市的“香格里拉”。
后续就可以进入搜索的召回步骤,召回主要负责的是把和搜索词意图相关的商品或内容找出来。前面的步骤获取了“云南”和“香格里拉”的id,就可以很方便的召回和“云南”和“香格里拉”都相关的商品或内容。但是,有些时候,召回的结果为空或者过于稀少,这个时候给用户的体验不好,因此,在召回的结果为空或者过于稀少的情况下,往往还需要丢词和二次召回的操作。此外,有些词属于可省略词,或者对搜索产生干扰的词,也可以通过丢词来处理。
所谓丢词,就是把搜索词中相对不重要或者联系不紧密的词丢掉,再次召回。那么该如何衡量每个词的重要程度或者紧密程度?这里就需要引入了Term Weighting的模块,把每个词视为term,通过算法或规则计算每个term的weight,每个term的weight直接决定了term重要度和紧密度的顺序。例如,假设“云南”的term weight是0.2,“香格里拉”的term weight是0.8,那么如果需要丢词,就应该先丢“云南”,保留“香格里拉”。
图1 搜索词义解析和Query理解步骤
传统的搜索意图识别会采用词表匹配,类目概率统计,加上人为设定规则。传统的Term Weighting同样会采用词表匹配和统计方法,比如根据全量商品的标题和内容统计出词的TF-IDF、前后词互信息、左右邻熵等数据,直接存成词典和分值,提供给线上使用,再根据一些规则辅助判断,比如行业专有名词直接给出较高的term weight,助词直接给出较低的term weight。
但是,传统的搜索意图识别和Term Weighting算法无法达到很高的准确率和召回率,特别是无法处理一些较为罕见的搜索词,因此需要一些新的技术来提升这两个模块的准确率和召回率,以及提升对罕见搜索词的适应能力。此外,因为访问频率较高,搜索词义解析需要非常快的响应速度,在旅游搜索场景下,响应速度往往需要达到接近个位数的毫秒级,这对于算法来说是一个很大的挑战。
二、 问题分析
为了提高准确率和召回率,我们采用深度学习来改进搜索意图识别和Term Weighting算法。深度学习通过样本的学习,可以有效解决各种情况下的意图识别和Term Weighting。此外,针对自然语言处理的大规模预训练语言模型的引入,可以进一步强化深度学习模型的能力,减少样本的标注量,使得原本标注成本较高的深度学习在搜索上应用成为可能。
但是深度学习面临的问题是,由于模型的复杂度较高,神经网络层数较深,响应速度没法满足搜索的高要求。因此我们采用模型蒸馏和模型压缩来减少模型的复杂度,在略微降低准确率和召回率的情况下减少深度学习模型的耗时,以此保证较快的响应速度和较高的性能。
三、意图识别
类目识别是意图识别的主要组成部分。意图识别中的类目识别是搜索词query经过分词后,对分词结果打上所属类目并给出对应概率值的方法。解析用户的搜索词的意图有利于分析用户的直接搜索需求,从而辅助提升用户体验。例如用户在旅游页面搜索 “云南香格里拉”,获取到用户输入的“香格里拉”对应的类目是“城市”,而不是“酒店品牌”,引导后续检索策略偏向城市意图。
在旅游场景下,用户输入的类目存在歧义的搜索词占总量约11%,其中包含大量无分词的搜索词。“无分词”是指经过分词处理后无更细化的切分片段,“类目存在歧义”是指搜索词本身存在多种可能的类目。例如用户输入“香格里拉”,无更细化的切分片段,且对应类目数据中存在“城市”、“酒店品牌”等多个类目。
如果搜索词本身是多个词的组合,则可以通过搜索词自身上下文明确类目,优先会以搜索词本身作为识别目标。如果单从搜索词本身不能明确所属类目,我们会优先追加该用户不相同的最近历史搜索词,以及最近商品类目点击记录,若无上述信息则追加定位站,作为补充语料。原始搜索词经过处理获得待识别的Query R。
最近几年,预训练语言模型在很多自然语言处理任务中大放光彩。在类目识别中,我们利用预训练模型的训练网络参数,获取含上下文语义的字特征Outputbert;使用字词转换模块,字特征结合位置编码:
获取到分词对应的字符片段,如:
代表第i个分词对应的长度为li的字特征。基于字符片段Wi,字词转换模块聚合出每个词的特征Hwi。聚合手段可以是最大值池化max-pooling、最小值池化min-pooling、均值池化mean-pooling等方式,实验得到最大池化效果最佳。模块输出为搜索词R的词特征OutputR;通过并行分类器对搜索词的词特征OutputR中各个片段给出类目数据库中涵盖的匹配类目,并给出对应类目的匹配概率。
图2 类目识别整体结构示意图
类目识别模型是基于BERT-base 12层模型,由于模型过大,不满足线上运行的响应速度要求,我们对模型进行了知识蒸馏(Knowledge Distillation),将网络从大网络转化成一个小网络,保留接近于大网络的性能的同时满足线上运行的延迟要求。
原先训练好的类目识别模型作为teacher网络,将teacher网络的输出结果作为student网络的目标,训练student网络,使得student网络的结果p接近q ,因此,我们可以将损失函数写成:
这里CE是交叉熵(Cross Entropy),symmetricalKL是对称KL散度(Kullback–Leibler divergence),y是真实标签的one-hot编码,q是teacher网络的输出结果,p是student网络的输出结果。
图3 知识蒸馏示意图
经过知识蒸馏,类目识别最终仍然可以达到较高的准确率和召回率,同时可以做到整体响应时间的95线为5ms左右。
经过类目识别之后,还需要经过实体链接等步骤,完成最终的意图识别过程。具体内容可以参见《携程实体链接技术的探索及实践》一文,本文不再阐述。
四、 Term Weighting
对于用户输入的搜索词,不同的term对于用户的核心语义诉求有着不同的重要性。在搜索的二次召回排序中需要重点关注重要性高的term,同时在丢词的时候可以忽略重要性低的term。通过计算用户输入搜索词的各个term weight,来二次召回出最接近用户意图的产品,提升用户体验。
首先,我们需要寻找线上用户真实的反馈数据作为标注数据。用户在搜索框的输入和联想词点击情况一定程度上反映了用户对于搜索短语中词语的重视程度,因此我们选用联想词输入和点击数据,加以人工筛选和二次标注,作为Term Weighting模型的标注数据。
在数据预处理方面,我们所能获得的标注数据为短语及其对应的关键词,这里为了使权重的分配不过于极端,给定非关键词一定量小的权重,并将剩余权重分配给关键词的每个字上,如果某一短语在数据中出现了复数次,且对应的关键词不同,则会根据关键词的频率对这些关键词的权重进行分配,并进一步分配每个字的权重。
模型部分主要尝试BERT作为特征提取的方法,并进一步对每个term的权重进行拟合。对于给定的输入,将其转化为BERT所能接收的形式,将通过BERT后的张量再通过全连接层进行压缩,得到一维的向量后进行Softmax处理,并用该向量对结果的权重向量进行拟合,具体模型框架如下图所示:
图4 Term Weighting模型框架
由于中文BERT基于字符,因此需要将每个term中的所有字的权重进行求和,从而最终得到term的权重。
在整个模型框架中,除去一些训练的超参数,能调整的部分主要包含两个部分:一是通过BERT产生Embedding时,可以选择BERT最后一层,或者综合BERT的第一层和最后一层的方式产生Embedding;二是在损失函数的选择上,除去使用MSE损失衡量预测权重与实际权重之间差距之外,也尝试使用非重要词的预测权重的和作为损失进行计算,但这种损失更适合只有单个关键词的情况使用。
模型最终是以小数的形式输出每个term weight,例如[“上海”、“的”、“迪士尼”]的term weight结果为[0.3433,0.1218,0.5349]。
该模型是为搜索服务的,有严格的响应速度要求。由于BERT模型整体比较大,在推理部分很难达到响应速度要求,因此类似于类目识别模型,我们对训练好的BERT模型进行进一步的蒸馏处理,以达到符合线上的要求。在此项目中,通过少数几层transformer去拟合BERT-base 12层transformer的效果,最后以损失可以接受的一部分性能的情况下,使得模型整体的推理速度快了10倍左右。最终,Term Weighting线上服务整体的95线可以达到2ms左右。
五、 未来与展望
采用深度学习后,旅游搜索对于较为罕见的长尾搜索词,词义解析能力有了较大的提升。在目前的线上真实搜索场景,深度学习方法一般选择与传统的搜索词义解析方法相结合,这样既可以保证头部常见搜索词的性能稳定,又可以加强泛化能力。
未来,搜索词义解析致力于给用户带来更好的搜索体验,随着硬件技术和AI技术的更新换代,高性能计算和智能计算越来越成熟,搜索词义解析的意图识别和Term Weighting未来会往更高性能的目标发展。此外,更大规模的预训练模型和旅游领域的预训练模型有助于进一步提升模型的准确率和召回率,更多用户信息和知识的引入有助于提升意图识别的效果,线上用户的反馈和模型迭代有助于提升Term Weighting的效果。这些都是我们后续会尝试的方向。
除了意图识别和Term Weighting之外,搜索的其他功能,比如词性标注、纠错等,在满足响应速度要求的前提下未来也可以采用深度学习技术,来实现更强大的功能和更优秀的效果。