文档搜索梳理

文档搜索梳理
  1. 搜索引擎
一个基本的搜索系统大体可以分为离线挖掘和在线检索两部分,其中包含的重要模块主要有:Doc内容理解、Query理解、检索召回、排序模块等。整个检索系统的目标可以抽象为给定query,检索出最能满足用户需求的Doc
  • 1.1离线挖掘
在离线侧,需要做一些基础的离线挖掘工作,包括Doc内容的获取、清洗解析、Doc内容理解、用户画像构建、query离线策略挖掘、以及从搜索推荐日志中挖掘Doc之间的语义关联关系、构建排序模型样本及特征工程等。
进行Doc内容理解之后,对相应的结构化内容执行建库操作,分别构建正排和倒排索引库。其中,正排索引简单理解起来就是根据Doc_id能找到Doc的各个基本属性及term相关(term及其在Doc中出现的频次、位置等信息)的详细结构化数据。相反地,倒排索引就是能根据分词term来找到包含该term的Doc列表及term在对应item中词频、位置等信息。通常会对某个Doc的title、keyword、content等不同属性域分别构建倒排索引,同时一般会根据Doc资源的权威度、质量度等纵向构建分级索引库,首先从高质量库中进行检索优先保证优质资源能被检索出来,如果高质量检索结果不够再从低质量库中进行检索。为了兼顾索引更新时效性和检索效率,一般会对索引库进行横向分布式部署,且索引库的构建一般分为全量构建和增量更新。常见的能用于快速构建索引的工具框架有Lucene全文检索引擎以及基于Lucene的Solr、ES(Elastic Search)等。
倒排索构建可参考:https://tech.youzan.com/search-engine1
  • 1.2在线检索
线上执行检索时大体可以分为基础检索(BS)和高级检索(AS)两个过程,其中BS更注重term级别的文本相关性匹配及粗排,AS则更注重从整体上把控语义相关性及进行精排等处理。首先会去请求SearchQU服务(负责搜索query理解)获取对query理解后的结构化数据,然后将这些结构化数据传给基础召回模块BS,BS根据切词粒度由粗到细对底层索引库进行一次或多次检索,执行多个索引队列的求交求并拉链等操作返回结果。
同时BS还需要对文本、意图tag、语义召回等不同路召回队列根据各路召回特点采用多个相关性度量(如:BM25文本相似度、tag相似度、语义相关度、pagerank权威度、点击调权等)进行L0粗排截断以保证相关性,然后再将截断后的多路召回进行更精细的L1相关性融合排序,更复杂一些的搜索可能会有L0到LN多层排序,每层排序的侧重点有所不同,越高层次item数变得越少,相应的排序方法也会更复杂。
  1. 搜索框背后的Query理解和语义召回技术
  • 2.1大框架
1)用户输入的Query,先去查询下cache,看是否命中,命中就返回,否则继续(cache看实际情况,一般加cache是为了缓解线上服务的压力,但也有它的问题,比如:更新不及时,cache过期问题等)。
2)Query预处理,全半角转换,繁简体,无用字符去掉,过长query截断等简单处理。
3)中文分词,是query理解的基础模块,分词按照粒度可以分为基本粒度切分,词语切分和短语切分,基本粒度是最小的粒度切分,是为了保证数据召回的,一般索引采用基本粒度切分,检索一般按照分级检索召回策略,从最粗粒度:短语切分开始,如果召回不理想,再进行词语切分召回,最后才是基本粒度召回。
4)Query改写,包括query纠错,归一化和扩展功能,query纠错会对用户的输入错误,词语错误,同音词错误等进行纠错。query归一化会query进行统一处理,比如字符的大小写统一,同义词处理等等。
5)Query分析,基于中文分词,会对query切分成term的词性,词法结构,term重要性和紧密度进行分析,并可以把不重要的term忽略或者做query语法“或”处理。
Term紧密度
主要用于衡量query中任意两个term之间的紧密程度,如果两个term间紧密度比较高,则这两个term在召回item中出现的距离越近相对来说越相关。以相邻的两个term为例,由于分词工具本身存在准确率问题,某两个term可能不会被分词工具切分到一起,但它们之间的关系比较紧密,也即紧密度比较高,如果在召回时能将在item中同时出现有这两个term且出现位置挨在一起或比较靠近的item进行召回,相关性会更好。
有了query中的term紧密度,在召回构造查询索引的逻辑表达式中可以要求紧密度高的两个term需共同出现以及在proximity计算公式中融合考虑进去,从而保证query中紧密度高的两个term在item中出现距离更近更相关。
Term重要性
特征方面,则可以从词法、句法、语义、统计信息等多个方向进行构造,比如:term词性、长度信息、term数目、位置信息、句法依存tag、是否数字、是否英文、是否停用词、是否专名实体、是否重要行业词、embedding模长、删词差异度、前后词互信息、左右邻熵、独立检索占比(term单独作为query的qv/所有包含term的query的qv和)、iqf、文档idf、统计概率 以及短语生成树得到term权重等。
其中删词差异度的做法是先训练得到query的embedding表示,然后计算移除各个term之后的query与原query的embedding相似度差值用于衡量term的重要性,如果移除某个term之后相似度差异很大,代表这个term比较重要。
对于重要级别最低的term可以考虑直接丢词,或者在索引库进行召回构造查询逻辑表达式时将对应的term用“or”逻辑放宽出现限制
6)意图识别,分为精确意图和模糊意图,精确意图的query比较好处理,模糊意图需要的策略比较多,比如意图分类,聚类分析,位置分析等等。
 
  • 2.2多路召回
召回系统主要分为两部分:
 
❶ 基于词的传统的倒排索引召回;
❷ 基于向量索引的语义召回机制。

2.2.1基于词的传统的倒排索引召回

  • 布尔模型
  • BM25 模型
  • 词义局限:字面匹配无法处理同义词和多义词问题,如在美团业务场景下“宾馆”和“旅店”虽然字面上不匹配,但都是搜索“住宿服务”的同义词;而“COCO”是多义词,在不同业务场景下表示的语义不同,可能是奶茶店,也可能是理发店。
  • 结构局限:“蛋糕奶油”和“奶油蛋糕”虽词汇完全重合,但表达的语义完全不同。 当用户搜“蛋糕奶油”时,其意图往往是找“奶油”,而搜“奶油蛋糕”的需求基本上都是“蛋糕”。

2.2.2 基于向量的语义召回

语义召回就是把 query 和 doc 都表示为向量,然后在向量空间中做最近邻的搜索。
可参考ANN-ANNOY总结 了解ANN能够处理大规模数据的索引的原因。
在模型上需要训练深度语义模型,主要分为两种:
  • representation based model
先分别将 query 和 title 进行网络的处理,分别得到向量,再预测两者相似度的分数。
整个学习过程可以分为两步:
① 表示层:计算 query 和 doc 各自的 representation,包括DNN、CNN 或者 RNN,transformer
② 匹配层:根据上一步得到的 representation,计算 query-doc 的匹配分数
  • interaction based model
提前算出 query 里每个词和 titile 里每个词的相似性,得到相似性矩阵。之后直接用例如 CNN 图像卷积的方法处理该矩阵,计算相似度
  • 改进
Representation & Interaction Based Model 参考DUET模型架构
Bridging the Gap Between Relevance Matching and Semantic Matching for Short Text Similarity Modeling
细节可参考文档搜索初步总结
posted @ 2020-12-23 11:48  打了鸡血的女汉子  阅读(433)  评论(1编辑  收藏  举报