在上篇“序列标注在搜索中的应用”中,我们简单介绍了实体识别技术在之家各个场景中的应用。Query理解作为搜索的首要重要模块,广泛应用到了各类NLP技术,比如纠错、分词、句法分析、分类,当然也包括实体识别技术。在这篇文章中,我们将重点讲述一下之家搜索的query理解是什么,以及怎么做的。
Query理解也叫作query分析,有时候简写成qp。Query的理解是关乎搜索用户体验的最直接因素,其作用正如其字面含义,就是对query进行分析和理解,分析和猜测用户意图,探知用户想要搜什么,再把用户想要的结果直观形象地展现出来。
之家的搜索query意图主要有两种形式,一种形式是要回答用户的一个明确问题,另一种形式要要输出一类数据的聚合结果。举两个简单的例子。比如用户输入“宝马是哪国车”。这个是在问“宝马的国别信息”,结果是一个唯一的值。之家搜索主页给出的结果:
再比如,用户输入“30w到50w左右的国产车”,这个的意图是“选车”,希望引擎给出一些符合条件的候选集合。将在之家的搜索引擎中得到如下的结果:
在搜索引擎中,有些用户提问的答案是深度加工过的数据,而有些用户提问是通过匹配获得。因此,搜索结果通常有两部分组成(除去广告部分),前面一部分是对业务领域的针对性处理,比如会投放一些magic-box或者高度聚合的数据,为用户提供入口,以期最大化展现用户意图下的各类综合信息。比如上述两个例子的结果都是深度加工的结果。这部分结果中,如果能够准确命中用户的意图,其包含的数据内容往往远超越用户通过自然搜索得到的内容。后面一部分用来放站内或者全站内容自然搜索的结果。参见上图给出的选车例子。
前面蓝色框中的,就是magic-box的结果,这部分结果直接准确命中用户的选车意图。而后面红色部分则是全站自然搜索的结果。可以看出,自然结果中,对该query的意图几乎没有命中。而一个好的搜索引擎,应该最大化第一个阶段的结果,再使用第二阶段的自然结果的形式进行补充。
Query理解最直观的输出就是语义结构化和意图输出。语义化指的是,将一个输入query,分解成一系列的语义块组合。比如“维修速腾的发动机多少钱”,我们需要知道这个用户的意图是要询问一个价格,具体来说,指的是”发动机”的“维修价格”,而这个发动机关联的车系是“速腾”。通过query分析,可以知道,“速腾”是一个车系的名字。可以通过以下直观形式进行展示。
上图中,每一层都可以看做一个语义块。这个query形成的语义块包括:速腾+发动机,发动机+维修,维修+价格。从上图也可以看出,不同的语义块之间,存在包含关系,而这个query的最终意图就是“维修价格”。Query理解的主要目的,就是要将每个query按照一定的方法,逐步分解成有明确含义的语句块,从而分析得到该query的用户意图,外部其他应用可以根据这个意图进行相应的业务处理,比如展示相应的magic-box,或者给出一个明确的答案。
Query分析的这些语义块有什么作用呢?语义块的重要性可以从上面两个阶段的结果维度分别进行阐述。
第一,前期magic结果阶段,用来做实体的过滤和精准匹配(Query理解是以实体识别为基础的)。比如,第二个例子“宝马是哪国的车”中,我们可以知道,query的意图是要问“品牌的国别”,这个具体的品牌具体就是指的“宝马”。Query分析的结果会形成一个叫做“品牌”的语句块,里面包含该品牌的详细信息,比如“品牌id”,“品牌的标准名称”。接下来,根据query分析得到的结果,将去对应的存储介质查找对应的国别数据,进行展示。当然,该数据是预先加工过的数据,即:我们会提前将各个品牌的国别信息加工到某种存储媒介中,外部根据查询条件直接进行查询,查询语句通过query分析的结果进行构造。该存储媒介可以是一个知识图谱,也可以是一个简单的database。
第二,在搜索排序阶段,用来精准化查询匹配的词,可用来做核心词的匹配,扩展同义词,过滤不重要的词汇,扩大召回,提高匹配的精准度。在第一个例子“维修速腾的发动机多少钱”中,核心重点的词是“发动机”、“维修”和“价格”。对于车系词“速腾”,其作用相对会弱化,如果找不到“速腾”的相关文章,那给出大众的其他车系的“发动机维修价格”的文档,也是一个非常不错的选择。Query分析的层次化结构展示中,词的所在的level就间接表明了词的重要性。另外,query分析中给出的词都是标准化之后的词,比如“多少钱”,“价格多少”,最终都会标准化描述成“价格”,描述价格的文档都会被筛选出来,相当于变相扩展了同义词,扩大了召回。
通过对之家的query进行深入的分析,我们共总结出70类大意图,200+类小意图。一些常见的意图包括:
车属性,包括速度、轴距、离地间隙、价格等几十种;
通用属性,包括:国别、厂商、级别,排放标准等;
口碑类,8大口碑,包括,油耗、动力、空间、舒适性、操控性、性价比等;
选车类,包括:人群选车、功能选车、价格选车、配置选车等;
提车、订车、买车类;
维修、保养、美容装饰等类;
百科类;
改装类;
销量类;
金融、保险类;
使用类……
一般的意图识别流程可以分成会经历两个阶段,业务规则处理+模型识别。之家的搜索query意图也是沿用这样的模式。只是,在第一个阶段,业务规则处理部分,我们做了更深入的工作,定义了一种新的、更灵活的、自推导识别模式。
业务处理部分,通过对搜索的全部query的测试分析,在常见的几类意图上(top-query),该方案识别准确率在90%以上,召回在92%左右。在全部意图类别上,在某时间段全部100w query的随机抽样(500条)测试结果中,召回率达到至少93%,准确率在72%以上(全部类别)。
我们将重点介绍第一个业务模式部分,模型部分采用常见的文本分类即可。之家的搜索qp 主要步骤如下。
从基本原理上来看,该方案借鉴了句法分析的结构,通过定义一系列的元素和模式,将qp的意图识别分解成一系列的模式运算集合,每一个模式叫做一个rule。从运算形式上来看,运算方式有些像早些年的专家推理系统,但是更封闭,基本不存在歧义性。一个rule的本意是要定义一个推理动作(推理即归约),这个推理动作的元素是在各个阶段定义的词的类型,包括实体词、谓词和基础词。这三类词分别放在对应的实体、谓词和基础词词典中。一个rule的识别过程被称为一次归约。Qp的意图推导过程可以理解成:建立一种机制,充分利用实体、谓词、基础词和领域知识(rule集合),将query凝聚成唯一的一个值,这个值就是所谓的意图类型。
具体来说,实体词的主要作用,用来做实体的识别参考和输出的查询关键字,比如“X5”就是一个实体词,对应的标准词是“宝马X5”。谓词主要来定义一些意图,比如:维修、价格、改装、选车等。而基础词的功能,主要用来定义一些常见的、不太重要的同义词,比如“怎样”、怎么样”、“咋样”就是一个同义基础词;“为什么”、“为嘛”、“为啥”也是一组同义基础词。这些基础词可以参与运算,保证正常的推理能够逐步进行,但是其本身只是一些配合的作用,并没有明确的含义,最好也不用做输出。每个实体词定义完成之后,都会形成自己的实体类别,谓词和基础词也会有自己的谓词类别和基础词类别。
基于这三个词表,该方案定义了一些常识的和业务的rule,用来进行迭代推理。上文说过,Rule的操作对象就是实体词典、谓词词典和基础词词典定义的词类型集合。一个rule的本意是要定义一个推理动作,这个动作可以是一个终结动作,也可以作为一个中间动作,把输出结果作为下一个推理动作的输入。每经历一步推导,内容将更加凝聚。一个典型的rule集合形式如下:
在rule文件中,为了简化rule的书写方式,本身也定义了一些简单的运算形式,比如“+”和“|”,一个表示“连接”,一个表示“或”。使用者可以通过合理利用这些特性,简化rule的书写过程。
这些rule本身可以有优先级,比如说,希望某些基础rule的优先被识别(比如价格类:30w,长度类:4.2m长),则可以给这些rule比较高的优先级。比如上述rule集合中,A和Brule是带有优先级的,越小的优先级会优先被识别。如果不指定,rule会带有一个默认优先级100。
从流程图也可以看出,该方案将qp意图识别分成了三个部分,分别是(1)、分词+实体识别,(2)、rule知识推理,(3)、后处理。在前面讲到的车型、车系等实体识别都应用在了qp中。
Qp的实体识别利用的就是上面所说的实体识别技术。需要注意的是,因为在实体中会有同一个名称的实体分属于不同实体类型的现象,比如“mini”既是一个品牌,又是一个厂商,又是一个车系。在这种情况下,通过实体识别将得到三个类型的结果(多类型),这三个结果都将保留。实体识别完成之后,会将一个query化成一个实体词+无法识别词(用“-1”表示未知词)的路径,多类型实体识别的结果将会形成多条路径。对于出现在实体词典、谓词词典和基础词词典中的词,都会得到其相应的类别。对于不在这三类其中,将化成-1类型。比如“X5性价比到底怎么样”,将得到一条
“CarSeries+Cost_Performance+(-1)+How_Words”
的路径。其中,CarSeries代表X5,是一个实体词, Cost_Performance 为一个谓词,“到底”无法识别,因此类型为-1,而“怎么样”是一个基础词。
多类型实体识别的路径举例如下(下例将得到4条识别路径,以序号代表词的类型,每一列代表一个实体的识别结果,其中2和3是一个多类型实体,4和5是一个多类型实体):
上述这一组rule代表了什么意思呢?从字面意思看,这四条rule的含义分别是:
A:当出现一个“车系+零部件”的语义块时,将规约得到一个零部件类,比如“速腾+发动机”将得到一个“发动机”。并且该rule优先级较高,将会其他三个rule之前被执行。
B:当出现一个“维修+零部件”的语义块时,将得到一个维修类,比如“维修+发动机”,将得到一个“维修”。因为一个rule的输出可以作为另一个rule的输入,因此,“维修速腾发动机”也可以产生一个维修类。
C:当出现一个“维修+价格”的语义块时,将得到一个价格类,比如“维修多少钱”,将得到一个“价格”。同理,“维修速腾发动机多少钱”也会产生一个价格类。
当出现一个“车系+维修”的时候,也会得到一个“维修类”。比如“速腾维修”,将得到一个“维修”。结合上面的三条rule,“速腾维修多少钱”也将得到一个“价格”。
由此可见,rule识别的主要功能就是利用各类词典中定义的词类型和rule集合,通过不停的迭代归约,不断尝试将query化成一个唯一的类型,这个唯一的类型就是这个query的意图。比如上面例子中“价格”。如果最终能够归约到一个唯一的节点,则称该query被完全归约。
目前的qp系统设计了5000条的rule,基本涵盖了汽车领域的绝大部分意图。
Rule识别针对的是单条的路径,最终结果是得到一个唯一的类型节点。这是比较理想的情况,在实际应用中,实体识别可能会形成多条路径,而rule识别也未必会归约到一个唯一的节点。因此,对于rule识别之后没有归约到一个唯一节点的情况,需要进行复杂的后处理过程,选出一个不怎么全面的意图类型。一般通过排序、筛选、丢弃的策略进行。经过谨慎的后处理后获得的意图,大部分能够代表的真实意图。
后处理主要包括三个部分:1、最优路径的选择;2:最优节点的选择;3、意图的输出再处理。
最优路径的选择,主要用来在各个路径中排除效果比较差的路径,比如,-1节点比较多的路径。经过这一轮筛选之后,将得到一组小数据量的路径,比如2条。最优路径的选择需要关注两个方面:一个是筛选维度,另外一个是路径裁剪方式。路径筛选的维度有很多,从宏观来筛选就是一个路径的排序过程,从中选择最好的若干条输出,因此使用者可根据业务的实际情况自定义排序规则。在路径的选择过程中,也会进行路径的裁剪,将一些不重要的识别结果丢掉,如果丢掉之后的路径可以再归约到一个唯一的节点(完全归约),则识别完成。
最优节点的选择,面向的是在最优路径选择中仍然没有被完全归约的情况。这种情况下,需要在剩余的路径(大部分是一条)中找到一个最能代表用户意图的片段。最优片段的选择也是业务相关的,用户可以自定义筛选的维度和方式,也可以设定一些默认的筛选规则,比如“最长的归约片段”等。
Query理解是一个综合的应用,起着承上启下的作用。它是一个大容器,将各类基础技术进行组合加工,得到一定的结构化数据和结果。这个结果,首先,可以应用在magic-box的输入,为之家的深层业务提供指导,比如,决定该展示哪些magic-box。另一方面,也可以为搜索排序提供更丰富的特征信息。
在实际处理过程中,qp的处理也要考虑实体的实时更新,以及用户的自定义配置。目前该项目已经成功应用到之家的搜索主页和搜车主页。时效性也足以满足线上的实时要求。
本文从query理解的角度概化阐述了这项技术在之家搜索中的应用,虽竭尽全力,仍不能描述详尽十之一二。之家的搜索致力于不断为用户提供更智能化的搜索方式。像上篇说的那样,虽然技术在逐渐进步,但是随着业务场景的逐步丰富,我们仍然面临着很多的问题。积极探索未知领域是我们之家搜索的精神宗旨,不断学习也是我们持之以恒的工作方式,在此非常欢迎大家就领域问题进行积极探讨,同时,就我们的不足之处提出宝贵改进意见。也希望大家继续关注阅读我们的“NLP在搜索中的应用”下一篇:“情感分析在搜索中的应用”。
[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
[6] 哈工大. 语言技术平台(LTP).http://www.ltp-cloud.com