导读:搜索引擎已经广泛应用于电商网站,我们为什么需要搜索引擎?搜索引擎又是如何工作的呢?电商网站中存在着上亿的商品,想象一下,当我们想要买一 件T恤的时候,可能会在页面上搜索“圆领 T 恤”,最直观的想法是遍历所有商品,查找满足需求的商品,这样的做法效率低下,可以采取与数据库相似的处理方法,可以通过构建索引的方式来加速对商品的检索。这里需要引入倒排索引的概念。对每个商品需要被检索的子单元创建一个索引,在搜索中可以直接通过子单元快速找到商品,而不需要遍历所有商品,这个索引就是搜索引擎中的倒排索引。利用倒排索引对商品进行初筛的过程,我们称之为召回阶段。在这个阶段,不会进行复杂的计算,主要根据当前的搜索条件进行商品候选集的快速圈定。在此之后,再进行粗排和精排,计算的复杂程度逐渐提高,计算的商品集合逐渐减小,最终完成整体的计算。
搜索引擎工作流程
上图所示框架为搜索引擎工作的主要流程。在引擎的构建过程中,首先进行分列,在每个分列中单独完成召回、粗排和精排的过程,最终从每列中选出分数最高的 N 个商品,并在顶层进行聚合,选出全局分数最高的 N 个商品,即可完成整体的排序过程。
01
词召回在构建引擎索引的过程中,首先要解决的是分词问题。我们仍以“圆领 T 恤”为例,目前存在一个标题为“春季新款简约圆领打底衬衫长袖 T 恤女”的商品 a,存在一个标题为“春季新款简约打底衬衫长袖 T 恤女”的商品 b,我们首先选择合适的分词粒度来对这两款商品进行分词,并将分词项构建为倒排索引的词典。需要指出的是,分词粒度并不是越小越好,如“简约”,如果拆分为“简”“约”两个单元,则无法真实传达词语的含义。我们按照小粒度分词的结果建立索引,对于搜索词“圆领 T 恤”,同样先进行分词,分词结果为:
建立的倒排索引可以表示为:
这里我们可以先将搜索词改写为“圆领”AND“T恤”的查询语法树。在进行召回时,通过“圆领”可以召回商品 a,通过“T 恤”可以召回商品 a 和 b,取交集,则可以召回到合适的商品 a。以这种倒排索引为基础,我们不仅可以对商品的标题进行分词并构建索引,也可以对商品的类目、价格、是否包邮等内容建立相应的索引,只需要构造正确的查询语法树,即可快速召回符合多种组合条件的商品。即使允许召回更多的商品,仍旧有召回数量的限制,所以我们需要给每个商品一个可以用于召回的分数,进行召回部分的截断。召回的最终目标是召回在精排阶段分数尽可能高的商品集合。由于这个分数将被用来构建倒排索引,每天进行一次,每个商品只有一个分数,所以这个分数无法与用户和搜索词进行关联,所以我们主要考虑商品质量和发布时间。最简单的方式是直接使用精排的重要分数进行拟合,也可以依据线上的情况进行召回分数的学习,学习的目标是使 TopN 的集合与精排产生的集合重合度更高。加入商品的召回分数之后,仍然会存在相关性及类目倾斜的情况。举个简单的例子,当我们搜索“手机”的时候,同时可以命中非常多的手机配件。手机配件的商品量远远多于手机,它们价格更低,重复采购的周期更短,在召回分数上,很容易超过手机产品,极端情况下,可能出现手机产品召回较少甚至无法召回的情况。为了缓解这类问题,搜索引擎也支持按照字段限制召回数量的功能,我们可以结合类目预测的结果,对每个搜索词计算每个类目下最合适的召回数量,从侧面保证搜索结果的类目相关性与多样性。
02
向量召回
前面介绍了词召回的相关内容,而在搜索引擎和搜索广告中,还有一种很重要的问题是召回的时候保持语义相似度,这里主要体现在两个方面:召回和排序。在召回时,传统的文本相似性算法如 TF-IDF、simhash、BM25 等,很难召回具有语义相似性的 Query-Doc 结果对,如“儿童用品”与“玩具”的相似性、“数码产品”与“耳机”的相似性、“微软 Surface”与“平板电脑”的相似性。与传统的文本类似,基于词的召回也会存在无法自动扩展词的语义信息的问题。例如,当用户搜索一个数码产品的时候,如果商家的产品词没有加上“数码产品” 这个词,那么他的产品就无法被倒排索引正确召回。为了解决这个问题,一方面,可以利用近义词对用户查询词进行扩展之后再进行召回,增加被正确召回的商品数量;另一方面,还可以通过深度学习召回模型解决这个问题。首先,我们介绍召回问题的数学定义。召回问题可以定义成分类问题,输入样本集为 xi 、 yi ,其中 xi 为样本,yi 为召回的类别,那么在这个定义中,损失函数为交叉熵损失函数(Cross Entropy Loss):
其中y是one-hot编码,只有对应的类别标签才为1,yˆ 是每个类别输出的概率。召回问题也可以定义成:输入一个查询样本 xq ,从数据库中召回与查询样本相似的样本xp ,形成样本对 ( xq , xp ) ,根据召回结果是否相似,可以得到多个正负样本对。在这种样本对的定义下,有两个损失函数定义方式:样本对的损失 ( Pairwise Ranking Loss ) 和三元组的损失 ( Triplet Loss )。样本对的损失如下 ( Positive Pair 和 Negative Pair 分别表示正样本对和负样本对 ):d(xq , xp )if positive pair max(0,m − d(xq , xp ))if negative pair在这个定义下,总体的损失函数如下:
② 查询词与商品文案,标题信息召回对于 1688 网站,智能运营算法团队会为所有的商品生成关键文案,文案会突出商品的一些特征,例如商品的纹理、材质、颜色、营销信息等。结合商品的标题,我们基于 DSSM 结构实现了基于查询词与商品标题、商品文案信息的召回方案。我们统计了用户的 Query 词的数量及 title 关键词的数量分布,发现 Query 词的长度偏短,而 title 关键词的数量比较多。绝大部分查询词集中在 1~4 之间,因此我们采用 meanpooling 方式表达 Query 词。但是对于 title 关键词,我们使用 self-Attention 的方式对商品的 title 及文案信息进行建模,让模型学习出 title 及文案信息之间的组合方式。通过多路召回的方案丰富了商品的数量,对基于文字匹配召回不足的查询词起到了很好的补充作用。