本文主要内容引自大话搜索Query理解
搜索场景下,Query理解(QU,Query Understanding)示意:
一、搜索
整个检索系统的目标可以抽象为给定query,检索出最能满足用户需求的item,也即检索出概率 最大的item。根据贝叶斯公式展开:
P(i)表示item的重要程度,对应item理解侧的权威度、质量度等挖掘。P(Q|i)表示item i 能满足用户搜索需求Q的程度。这部分概率对应到基于query理解和item理解的结果上进行query和item间相关性计算,同时涉及到点击调权等排序模块。
一个基本的搜索系统大体可以分为离线挖掘和在线检索两部分,其中包含的重要模块主要有:Item内容理解、Query理解、检索召回、排序模块等。
离线挖掘工作,包括item内容的获取、清洗解析、item内容理解(语义tag、权威度计算、时间因子、质量度等)、用户画像构建、query离线策略挖掘、以及从搜索推荐日志中挖掘item之间的语义关联关系、构建排序模型样本及特征工程等。进行item内容理解之后,对相应的结构化内容执行建库操作,分别构建正排和倒排索引库。其中,正排索引简单理解起来就是根据itemid能找到item的各个基本属性及term相关(term及其在item中出现的频次、位置等信息)的详细结构化数据。相反地,倒排索引就是能根据分词term来找到包含该term的item列表及term在对应item中词频、位置等信息。通常会对某个item的title、keyword、anchor、content等不同属性域分别构建倒排索引,同时一般会根据item资源的权威度、质量度等纵向构建分级索引库,首先从高质量库中进行检索优先保证优质资源能被检索出来,如果高质量检索结果不够再从低质量库中进行检索。为了兼顾索引更新时效性和检索效率,一般会对索引库进行横向分布式部署,且索引库的构建一般分为全量构建和增量更新。常见的能用于快速构建索引的工具框架有Lucene全文检索引擎以及基于Lucene的Solr、ES(Elastic Search)等。除了基本的文本匹配召回,还需要通过构建query意图tag召回或进行语义匹配召回等多路召回来提升搜索语义相关性以及保证召回的多样性。
线上执行检索时大体可以分为基础检索(BS)和高级检索(AS)两个过程,其中BS更注重term级别的文本相关性匹配及粗排,AS则更注重从整体上把控语义相关性及进行精排等处理。以下面这个框图为例,介绍下一个相对简单的在线检索过程。对于从client发起的线上搜索请求,会由接入层传入SearchObj(主要负责一些业务逻辑的处理),再由SearchObj传给SearchAS(负责协调调用qu、召回和排序等模块),SearchAS首先会去请求SearchQU服务(负责搜索query理解)获取对query理解后的结构化数据,然后将这些结构化数据传给基础召回模块BS,BS根据切词粒度由粗到细对底层索引库进行一次或多次检索,执行多个索引队列的求交求并拉链等操作返回结果。同时BS还需要对文本、意图tag、语义召回等不同路召回队列根据各路召回特点采用多个相关性度量(如:BM25文本相似度、tag相似度、语义相关度、pagerank权威度、点击调权等)进行L0粗排截断以保证相关性,然后再将截断后的多路召回进行更精细的L1相关性融合排序,更复杂一些的搜索可能会有L0到LN多层排序,每层排序的侧重点有所不同,越高层次item数变得越少,相应的排序方法也会更复杂。BS将经过相关性排序的结果返回给SearchAS,SearchAS接着调用SearchRank服务进行ctr/cvr预估以对BS返回的结果列表进行L2重排序,并从正排索引及摘要库等获取相应item详情信息进一步返回给SearchObj服务,与此同时SearchObj服务可以异步去请求广告服务拉取这个query对应的广告召回队列及竞价相关信息,然后就可以对广告或非广告item内容进行以效果(pctr、pcvr、pcpm)为导向的排序从而确定各个item内容的最终展示位置。最后在业务层一般还会支持干预逻辑以及一些规则策略来实现各种业务需求。在实际设计搜索实验系统时一般会对这些负责不同功能的模块进行分层管理,以上面介绍的简单检索流程为例主要包括索引召回层、L0排序截断层、L1相关性融合排序层、L2效果排序层、SearchAS层、业务层等,各层流量相互正交互不影响,可以方便在不同层进行独立的abtest实验。
当然,具体实现搜索系统远比上面介绍的流程更为复杂,涉及的模块及模块间的交互会更多,比如当用户搜索query没有符合需求的结果时需要做相关搜索query推荐以进行用户引导、检索无结果时可以根据用户的画像或搜索历史做无结果个性化推荐等,同时和推荐系统一样,搜索周边涉及的系统服务也比较庞杂,如涉及日志上报回流、实时计算能力、离/在线存储系统、abtest实验平台、报表分析平台、任务调度平台、机器学习平台、模型管理平台、业务管理后台等,只有这些平台能work起来,整个搜索系统才能正常运转起来。
二、Query理解
搜索三大模块的大致调用顺序是从query理解——检索召回——排序。
目前业界的搜索QU处理流程还是以pipeline的方式为主,也即拆分成多个模块分别负责相应的功能实现,pipeline的处理流程可控性比较强,但存在缺点就是其中一个模块不work或准确率不够会对全局理解有较大影响。为此,直接进行query-item端到端地理解如深度语义匹配模型等也是一个值得尝试的方向。
1、Pipeline流程
搜索Query理解包含的模块主要有:query预处理、query纠错、query扩展、query归一、联想词、query分词、意图识别、term重要性分析、敏感query识别、时效性识别等。以下图为例,这里简单介绍下query理解的pipeline处理流程:线上来一个请求query,为缓解后端压力首先会判断该query是否命中cache,若命中则直接返回对该query对应的结构化数据。若不命中cache,则首先会对query进行一些简单的预处理,接着由于query纠错可能会用到分词term信息进行错误检测等先进行query分词并移除一些噪音符号,然后进行query纠错处理,一些情况下局部纠错可能会影响到上下文搭配的全局合理性,为此还可能会需要进行二次纠错处理。对query纠错完后可以做query归一、扩展及联想词用于进行扩召回及帮助用户做搜索引导。接着再对query做分词及对分词后的term做重要性分析及紧密度分析,对无关紧要的词可以做丢词等处理,有了分词term及对应的权重、紧密度信息后可以用于进行精准和模糊意图的识别。除了这些基本模块,有些搜索场景还需要有对query进行敏感识别及时效性分析等其他处理模块。最后还需要能在cms端进行配置的人工干预模块,对前面各个模块处理的结果能进行干预以快速响应badcase处理。当然,这个pipeline不是通用的,不同的搜索业务可能需要结合自身情况做pipeline的调整定制,像百度这些搜索引擎会有更为复杂的query理解pipeline,各个模块间的依赖交互也更为复杂,所以整个qu服务最好能灵活支持各个模块的动态热插拔,像组装乐高积木一样进行所需模块的灵活配置,下面对各个模块做进一步详细的介绍。
2、 Query分词
2.1 分词技术
目前分词技术相对来说已经比较成熟,主要做法有基于词典进行前后向最大匹配、对所有成词情况构造DAG、hmm/crf序列标注模型以及深度学习模型+序列标注等。目前无论学术界还是工业界开放的分词工具或服务还是比较多的,如主要有百度LAC、Jieba分词、清华THULAC、北大pkuseg、中科院ICTCLAS 、哈工大PyLTP、复旦FNLP、Ansj、SnowNLP、FoolNLTK、HanLP、斯坦福CoreNLP、Jiagu、IKAnalyzer等。这些分词工具在功能和性能上会存在一定的差异,具体使用时要结合业务需求定制选择,需要考虑的点主要包括:切词准确性、粒度控制、切词速度、是否带有NER、NER识别速度、是否支持自定义词典等。
在搜索中的query切词一般会做粒度控制,分为细粒度和phrase粗粒度两个级别。在进行召回时可以优先用phrase粗粒度的切词结果进行召回,能得到更精准相关的结果同时减少多个term拉链合并的计算量。当phrase粗粒度分词进行召回结果不够时,可以采用拆分后的细粒度分词进行二次重查扩召回。
2.2 新词发现
一些切词工具自带有新词发现功能,比如Jieba采用HMM进行新词发现。HMM分词
此外可以采用基于统计的方法来进行新词发现,通过统计语料中的词语tfidf词频、凝聚度和自由度等指标来进行无监督新词挖掘。新词发现
再有,可以将新词发现转化为序列标注问题,训练BiLSTM-CRF、BERT-CRF等模型预测成词的起始、中间及结束位置,或者转化为ngram词在给定句子语境中是否成词或不成词二分类问题。
3、紧密度分析
衡量query中任意两个term之间的紧密程度。如果两个term间紧密度比较高,则这两个term在召回item中出现的距离越近相对来说越相关。
以相邻的两个term为例,由于分词工具本身存在准确率问题,某两个term可能不会被分词工具切分到一起,但它们之间的关系比较紧密,也即紧密度比较高,如果在召回时能将在item中同时出现有这两个term且出现位置挨在一起或比较靠近的item进行召回,相关性会更好。
以前面的搜索query“下载深海大作战”为例,经分词工具可能切分成“下载 深海 大 作战”,但其实“大”和“作战”的紧密度很高,从文本相关性角度来看,召回“喵星大作战”app要一定程度比“大人物作战”会更相关。当然,在query中并不是两个term的距离越近紧密度越高,可以通过统计搜索log里term之间的共现概率来衡量他们的紧密程度。
在进行召回时,传统的相关性打分公式如OkaTP、BM25TP、newTP、BM25TOP等在BM25基础上进一步考虑了proximity计算,但主要采用两个term在item中的距离度量,如:
有了query中的term紧密度,在召回构造查询索引的逻辑表达式中可以要求紧密度高的两个term需共同出现以及在proximity计算公式中融合考虑进去,从而保证query中紧密度高的两个term在item中出现距离更近更相关。
计算query中两个term的紧密度:统计log中两者的共现频率。
召回时如何结合亲密度指标:1、要求紧密度高的两个term共现;2、在相关性打分公式中加入proximity,即两个term在iterm中的距离。
4、Term重要性
召回计算相关性时需要同时考虑query及item侧的term重要性。Term重要性可以通过分等级或0.0~1.0的量化分值来衡量。如下图的case所示我们可以将term重要性分为4个级别,重要性由高到低分别是:核心词、限定词、可省略词、干扰词。
对于重要级别最低的term可以考虑直接丢词,或者在索引库进行召回构造查询逻辑表达式时将对应的term用“or”逻辑放宽出现限制,至于计算出的在query和item内容中的term重要性分值则可以用于召回时计算基础相关性,如简单地将BM25公式中term在item及query中的词频乘上各自的term权重。
iterm侧term重要性计算:
LDA主题模型、TextRank
query侧term重要性计算:
分类或回归,通过训练svm、gbdt等传统机器学习模型即可进行预测。
训练样本构建:除人工标注外,可以通过用户的搜索点击日志来自动构造。将某个query对应搜索结果的用户点击频次作为同时出现在query及搜索结果title中相应term的重要性体现,首先通过共同点击信息或二部图方法对query进行聚类,再将一个query对应有不同点击title以及同一term在簇内不同query中的点击title频次结果加权考虑起来,同时排除掉一些搜索qv比较不置信的query及title对应的结果,最后将累计频次进行归一化及分档得到样本对应label。
至于特征方面,则可以从词法、句法、语义、统计信息等多个方向进行构造,比如:term词性、长度信息、term数目、位置信息、句法依存tag、是否数字、是否英文、是否停用词、是否专名实体、是否重要行业词、embedding模长、删词差异度、前后词互信息、左右邻熵、独立检索占比(term单独作为query的qv/所有包含term的query的qv和)、iqf、文档idf、统计概率以及短语生成树得到term权重等。
假设在一定共现关系情况下越短的query越是整体意图的核心表达,所以和越下层结点连接越多的term重要性越大,仅和较上层或根结点有连接的term重要性相对较小,通过用iqf等初始化叶子结点,然后自底向上进行结点分值计算并进行多轮迭代使得term权重相对稳定。如下图所示query“好玩的5v5策略竞技游戏”构造的短语生成树示例。
利用深度学习模型来学习term重要性,比如通过训练基于BiLSTM+Attention的query意图分类模型或基于Seq2Seq/Transformer训练的query翻译改写模型得到的attention权重副产物再结合其他策略或作为上述分类回归模型的特征也可以用于衡量term的重要性。
5、搜索引导
搜索引导按功能的不同主要可以分为:搜索热词、搜索历史、query改写、搜索联想词,一些电商等垂搜可能还带有类目属性等搜索导航功能。
5.1 Query改写
按照改写功能的不同,query改写可以分为query纠错、query归一、query扩展三个方向。其中query纠错负责对存在错误的query进行识别纠错,query归一负责将偏门的query归一变换到更标准且同义的query表达,而query扩展则负责扩展出和源query内容或行为语义相关的query列表推荐给用户进行潜在需求挖掘发现。
5.1.1 Query纠错
根据query中是否有不在词典中本身就有错误的词语(Non-word),可以将query错误类型主要分为Non-word和Real-word两类错误。其中,Non-word错误一般出现在带英文单词或数字的query中,由于通过输入法进行输入,不会存在错误中文字的情况,所以中文query如果以字作为最小语义单元的话一般只会存在Real-word错误,而带英文数字的query则可能存在两类错误。下图对这两大类的常见错误类型进行归类及给出了相应的例子。
Query纠错可以用噪音信道模型来理解,假设用户本意是搜索Qreal ,但是query经过噪音信道后引进了一定的噪音,此时纠错过程相当于构建解码器将带有噪音干扰的query Qnoise,进行最大去噪还原成 Qdenoise ,使得 Qdenoise近似等于Qreal 。对应的公式为:
P(Qdenoise)表示语言模型概率,P(Qnoise|Qdenoise) 表示写错概率。
纠错任务包含错误检测和错误纠正。
错误检测:识别错误词语的位置。简单做法:切分query,检查各个词语是否在维护的自定义词表或挖掘积累的常见纠错pair中,若不在则根据字型、字音或输入码相近字进行替换构造候选并结合ngram语言模型概率来判断其是否存在错误,这个方法未充分考虑到上下文信息,可以适用于常见中文词组搭配、英文单词错误等的检测。进一步做法:通过训练序列标注模型的方法来识别错误的开始和结束位置。
错误纠正:主要包括纠错候选召回、候选排序选择两个步骤。在进行候选召回时,没有一种策略方法能覆盖所有的错误类型,所以一般通过采用多种策略方法进行多路候选召回,然后在多路召回的基础上通过排序模型来进行最终的候选排序。
英文单词错误、多漏字、前后颠倒——编辑距离
在query空间很大时,如何优化编辑距离度量:
1、启发式策略(只看与query长度差小的词)。
2、空间换时间。对query进行ngram等长粒度切分后构建倒排索引。
3、基于多叉树。编辑距离度量满足三角不等式d(x,y)+d(y,z)>=d(x,z)。建树:随机选取一个query作为根结点,自顶向下对所有query构建多叉树,树的边为编辑距离。查找编辑距离小于等于n的所有query:自顶向下与相应的结点query计算编辑距离d,接着只需递归考虑边值在d-n到d+n范围的子树即可。
等长的拼音字型错误类型——HMM模型
可观测状态:用户输入的错误query“
隐藏状态:对应的正确query“爱奇艺”
发射矩阵:人工梳理的同谐音、形近字混淆词表、通过编辑距离度量召回的相近英文单词以及挖掘好的纠错片段对得到。通过统计搜索点击日志中query-item及搜索session中query-query对齐后的混淆词表中字之间的错误发射概率。
转移概率:将搜索日志中query进行采样后作为样本利用hmmlearn、pomegranate等工具采用EM算法进行无监督训练,也可以简单地对搜索行为进行统计得到,如通过nltk、srilm、kenlm等工具统计搜索行为日志中ngram语言模型转移概率;
深度学习模型来充分挖掘搜索点击行为及搜索session进行纠错候选召回,如采用Seq2Seq、Transformer、Pointer-Generator Networks等模型进行端到端的生成改写,通过引入attention、copy等机制以及结合混淆词表进行受限翻译生成等优化。
Google在2019年提出的LaserTagger模型则是另辟蹊径将文本生成建模为序列标注任务,采用BERT预训练模型作为Encoder基础上预测各个序列位置的增删留标签,同样适用于query纠错这种纠错前后大部分文本重合的任务。
爱奇艺在同一年提出的适用于繁简体中文拼写检纠错的FASPell模型尝试在利用BERT等预训练语言模型生成纠错候选矩阵(DAE)的基础上结合生成候选的置信度及字符相似度对候选进行解码过滤(CSD)出候选纠错目标,在中文纠错任务上也取得了一定进展。
排序:多路召回的基础上,可以通过从词法、句法、语义及统计特征等多个方面构造特征训练GBDT、GBRank等排序模型将预测出最优的纠错候选。
5.1.2 Query扩展
挖掘搜索session序列和点击下载行为中query间的语义关系来做query扩展(通过统计互信息、关联规则挖掘等方法);训练word2vec、fasttext等模型将query向量化,进而可以计算得到query间的embedding相似度。
构建query-item的点击下载矩阵,然后采用协同过滤或SVD矩阵分解等方法计算query之间的相似度;
构建query和item之间的二部图(如下图示例),若某个query节点和item节点之间存在点击或下载行为则用边进行连接,以ctr、cvr或归一化的点击下载次数等作为连接边的权重,然后可以训练swing、simrank/wsimrank++等图算法迭代计算query间的相似度,也可以采用Graph Embedding的方法来训练得到query结点间的embedding相似度。
利用搜索点击下载行为构造弱监督样本训练基于CNN/LSTM/BERT等子网络的query-item语义匹配模型得到query和item的embedding表示,如此也可以计算query pair间的embedding相似度。对于将query进行embedding向量化的方法,可以先离线计算好已有存量query的embedding表示,然后用faiss等工具构建向量索引,当线上有新的query时通过模型inference得到对应的embedding表示即可进行高效的近邻向量检索以召回语义相似的query。
5.1.3 Query归一
如将“腾讯台球”归一到“腾讯桌球”,“华仔啥时候出生的?”、“刘德华出生年月”、“刘德华什么是出生的”这些query都可以归一到“刘德华出生日期”相对标准的query。
其中涉及到的技术主要有同义词挖掘及语义对齐替换。
同义词挖掘:WordNet、HowNet、哈工大的同义词词林、中文知识图谱(如:OpenKG、OwnThink等)、抓取百度/维基百科站点数据然后提取出其中的别名、简称等结构化信息直接获得,模板规则(如:“XX俗称XX”、“XX又名XX”等)来提取同义词。
构造平行语料基础上通过语义对齐的方式来挖掘同义词。word2vec、wordrank等词向量模型得到的相似度高的词语对不一定是同义词,有可能是同位词、上下位词甚至是反义词,此时需要通过引入监督信号或外部知识来优化词向量,如有方法提出通过构建multi-task任务在预测目标词的同时预测目标词在句子中表示的实体类型以加入实体的语义信息来提升词向量之间的语义相似性。进一步地,还可以利用前面介绍的二部图迭代、深度语义匹配、Seq2Seq翻译生成等query扩展方法从搜索点击弱监督行为中先挖掘出语义表达相近的query-query、item-item或query-item短语对,然后再将语义相近的query/item短语对进行语义对齐,对齐的话可以采用一些规则的方法,也可以采用传统的统计翻译模型如IBM-M2进行对齐,语义对齐后从中抽取出处于相同或相近上下文中的两个词语作为同义词对候选,然后结合一些统计特征、词语embedding相似度以及人工筛选等方式进行过滤筛选。考虑到同一个词语在不同的上下文中可能表达不同的语义,同义词语间的关系也是上下文相关的,此时如果通过对齐挖掘粗粒度的同义片段对能进一步消除歧义。线上对query进行归一时,则和离线同义词挖掘的过程相反,对query进行分词后读取线上存储的同义词表做同义词候选替换,对替换网格进行对齐生成候选query,最后通过结合语言模型概率及在当前上下文的替换概率或者构造特征训练GBDT等模型的方式对候选query进行排序得到最终的归一query。
5.2 搜索联想词
联想结果主要以文本匹配为主,文本匹配结果不足可以辅以语义召回结果提升充盈率。
用户在搜索框中输入每一个字时都会发起一起请求,联想词场景的请求pv是非常大的。为加速匹配效率,可以通过对历史搜索query按qv量这些筛选并预处理后分别构建前后缀trie树用于对用户线上输入的query进行前缀及中后缀匹配召回,然后对召回的结果进行排序,如果是仅简单按qv降序排序,可以在trie树结点中存放qv信息并用最小堆等结构进行topk召回。
离线召回:采用AC自动机同时进行高效的前中后缀匹配召回。AC自动机是基于trie数+KMP实现的多模匹配算法,可以在目标文本中查找多个模式串的出现次数以及位置。此时,离线召回大致的流程是:
(1)从历史搜索query中构造前缀sub-query,如query“酷我音乐”对应的sub-query有中文形式的“酷”、“酷我”、“酷我音”、“酷我音乐”及拼音字符串“ku”、“kuwo”等,同时可以加上一些专名实体或行业词,如应用垂搜中的“音乐”、“视频”等功能需求词;
(2)利用所有的sub-query构建AC自动机;
(3)利用构建的AC自动机对历史搜索query及其拼音形式分别进行多模匹配,从中匹配出所有的前中后缀sub-query,进而得到
(4)按照一定策略(一般在前缀基础上)进行候选粗排并写到线上存储。
(5)线上来一个请求sub-query,直接查询存储获取召回结果,然后再基于训练的pctr预估模型或pcpm商业化导向进行重排,此时可以通过引入用户侧、context侧等特征实现个性化排序。
6.意图识别
(1)用户输入query不规范
(2)歧义性&多样性
(3)个性化意图
根据用户意图明确程度的差别,细分为精准意图和模糊意图识别。
6.1 精准意图
垂直搜索:文本匹配和top后验转化筛选出候选item,然后通过从文本匹配、行为反馈、语义相似等方向构造样本特征训练GBDT等模型对
Google、百度等通用搜索:KBQA。将问题和知识库中候选答案映射成分布式向量进行匹配,以及利用CNN、LSTM、记忆网络等模型对应问题及候选答案向量建模优化等方法来进行KBQA。
6.2 模糊意图
不会具体到某个目标资源,而是代表一类或多类意图。基于模板规则、行为统计反馈、分类模型等方法,这里主要会从意图分类及槽位解析两个方向进行阐述。
6.2.1 意图分类
Fasttext、TextRNN、TextCNN、Char-CNN、BiLSTM+Self-Attention、RCNN、C-LSTM、HAN、EntNet、DMN
6.2.2 槽位解析
上下文省略和指代消歧问题
模板构成主要包括:槽位词、固定词、函数、通配符。