类似搜索引擎(算法)的实践

注:转自有赞

在上一篇文章(工程篇)中,我们介绍了like搜索引擎的基本框架。搜索引擎主要由三部分组成。一是利用hadoop集群生成大规模搜索和实时索引;第二,ElasticSearch集群提供分布式搜索方案;第三,高级搜索集群用于提供商业搜索的特殊功能。

由于商业电子商务搜索的特殊性,独立的弹性搜索集群无法满足多样化的算法需求。我们在搜索的各个部分都有相应的算法插件,来构建商业电商搜索引擎的算法体系。

创建索引的过程就是从原始数据创建倒排索引的过程。在这个过程中,我们分析产品(doc),计算产品的静态评分,计算产品的相似度。产品的静态评分对搜索引擎质量的提升起着至关重要的作用,相当于网页搜索的pagerank。试想一下,如果没有pagerank算法。网络搜索的质量会有多差。在电子商务搜索中,最常见的问题就是相似商品太多,需要在建立索引的过程中预先计算商品之间的相似度,以便在检索过程中有效地消除重复。

创建索引的过程如下。

步骤1。计算每个文档的静态得分。

第二步。计算每个文档的相似度。

第三步。根据相似性和其他信息对数据进行分类。

第四步。建立ES指数。

检索过程是搜索引擎接收用户的查询,对其进行处理并返回相关结果的过程。商业搜索引擎在检索过程中需要考虑两个因素:1)相关性2)重要性。

相关性是指返回的结果与输入的查询是否相关,这是搜索引擎的基本问题之一。目前常用的算法有BM25和空间矢量模型。这两种算法都有ElasticSearch支持,一般的商业搜索引擎都使用BM25算法。BM25算法会计算每个文档和查询的相关度得分,我们用Dscore来表示。

重要性是指商品被信任的程度。我们应该把最信任的商品还给消费者,而不是让消费者自己去鉴别。尤其是在商品充分竞争的电商搜索中,必须给商品一个合理的重要性分数,以保证搜索结果的质量。重要性分数也称为静态分数,用Tscore表示。

搜索引擎的最终排名依据是:

得分= Dscore * Tscore

也就是综合考虑静态和动态点,才能给用户相关和重要的商品。

检索的过程大致抽象为以下步骤。

步骤1。分析原始查询。

第二步。按照as中的查询分析结果重写查询。

第三步。使用重写的查询来检索。

第四步。根据es查询过程中的静态点和动态点进行综合排序。

第五步。将es返回的结果重新排序为。

第六步。返回结果。

以下章节描述了几项关键技术。

在电子商务搜索引擎中,商品的静态点与网页搜索中的pagerank具有同等的价值和重要性。都是与查询无关的doc固有值度量。pagerank通过doc之间的投票关系来运作。相对来说,商品的静态评分会有更多的因素。和pagerank一样,商品的静态计算过程需要解决以下两个问题:1。稳定。pagerank可以保证一个网站不会因为简单的链接堆叠而线性提升排名。同样,商品静态评分的计算也不能让商品通过增加单个指标(比如刷单个页面对搜索引擎质量的影响)来线性增加评分。

2.歧视程度。商品静态分类在保证稳定性的基础上,要有足够的区分度,保证在相同搜索条件下,排名第一的商品质量高于排名后面的商品。

我们假设商品的静态有三个决定因素,即1。下一个奇数,2。好评率和3。交货速度。

对于静态点,我们使用Tsocre,Tscore可以写成:

Tscore = a * f(下单数)+b * g(好评率)+c * h(发货速度)

a、B、C是平衡各指标影响程度的权重参数。f、G、H、G和H是将原始指标转换成合理度量的代表性函数。

首先,我们需要找到一个合理的代表函数。

z分数标准化方法

这种方法很不稳定。假设一个奇点是第二大值的1000倍,那么大部分值都会集中在0~0.01,这也就失去了归一化的目的。

(图3: log-zscore标准化)

最后选择合适的权重,用log-zscore归一化后,基本解释了f,G,h,G,h的代表函数,Tscore = a f(下奇数)+b g(好评率)+c*h(发货速度),接下来就是确定a,B,c B,c的参数,一般有两种方法:

a)专家法。根据我们的日常经验动态调整权重参数;

b)实验方法。先在专家的帮助下,赋一个初始值,然后改变单变量的方法,根据abtest的结果动态调整参数。

产品标题的去重在电子商务搜索中起着重要的作用。数据显示,通过搜索页面购买的商品,80%是用户选择搜索的前四页。产品标题重复会导致重要页面没有含金量,大大降低搜索的购买率。

例如:

Title1:好吃/香蕉/包邮/广东/高州/香蕉//无/催熟剂/

Title2:好吃/香蕉/广东/高州/香蕉//非/香蕉/包邮/

首先,进行特征矢量化。

这里使用了“词袋”技术,将词汇作为空间向量的维数,将标题中每个$ term的词频作为该特征的值。在这个例子中,这个词汇的维度是美味(0)、香蕉(1)、邮费(2)、广东(3)、高州(4)、香蕉(5)。

Title1: 1,2,1,1,1,1,1,1,0

标题2: 1,2,1,1,1,0,0,1,1

每个标题由一个固定长度的向量表示。

第三,计算成对相似度。

在不失一般性的情况下,相似性通常通过计算两个向量之间的距离来实现。这里我们用1-余弦(x,y)来表示两个向量之间的距离。这是一个“全对相似”问题,即需要两两比较,复杂度为O (n 2)。当货物数量巨大时,很难用单台机器处理。我们给出了两种实现方法。

方法一:火花的矩阵运算。

方法二:map-reduce线性法。这种方法参考了论文“用Mapreduce实现大集合中的成对文档相似性”。它可以达到几乎线性的时间复杂度。与矩阵运算相比,规模较大(超过6543.8亿)。配对相似运算具有上述优点。这个方法简单描述如下:首先根据倒排索引的计算方法,计算每个$ term到doc的映射。例如,三个文档:

转换为反向格式,这需要减少映射器。

然后,对于只有一个值元素的过滤器,对于值大于2个文档的成对组合:

最后汇总输出,value是两个doc乘积的重复次数和根号的比值。

对于两个标题1,标题2,如果X (title1,标题2)>;0.7认为title1和title2差不多。对于两张相似的单据,静态划分的定义是主单据,静态划分的定义是辅助单据。主文档和辅助文档分别建立数据库。

不同于web搜索(web搜索直接删除辅助文档),我们分别建立主文档和辅助文档。对于每次搜索,我们按比例搜索主文档和辅助文档,并将结果融合回来。这样可以保证结果的多样性。

商店重复删除与产品标题重复删除略有不同。因为特定电商场景的需要,我们不希望搜索结果是唯一的,这会导致很强的马太效应。不能通过上述方法进行存储去重,因为上述方法的主要基础是文本相似,并且在结果都相关的前提下做出适当的选择。但是消除存储重复不是这样的特征。

想象一下,如果我们把同一家店的商品按照店铺是否相同分为主仓和从仓,如下图所示。

a和B代表不同的商店。

在搜索香蕉的时候,确实可以控制A店的结果数量,但是在搜索“梨”的时候,B店的梨排在第一是错误的(假设A:梨的静态得分高于B:梨)。

在搜索的过程中,25%的搜索任务在每个桶中平均分担,结果按照静态合并到一个页面中,保证了结果的相对顺序相同,达到了消除商店中重复的目的。

如上图所示,虽然搜索“香蕉”时有10个符合需求的结果,但搜索醉酒时每页只能显示5个结果。

以上介绍了标引过程中的几种技术,检索过程中有很多关键技术。最著名的是查询分析技术。我们使用的查询分析技术主要有核心词识别、同义词扩展、品牌词识别等。大多数查询分析技术都在NLP的研究范围之内。很多理论知识本文就不细说了。我们将重点讨论同义词扩展技术。这种技术一般需要根据自己的产品和用户日志进行具体的训练,并不能像分词技术和品牌词识别一样应用在一个标准的库中。

同义词扩展一般是通过分析用户的会话日志获得的。如果用户输入“苹果手机”没有得到想要的结果,他接着输入“iphone”,我们就在“苹果手机”和“iphone”之间创建了一个转移关系。基于统计,我们可以为用户查询创建一个相互关联的权重图。

用户输入查询“苹果手机”。根据查询分析,“苹果手机”有“iPhone”0.8和“iPhone 6”0.5两个同义词。0.8和0.5分别表示同义词的程度。我们想同时输入“苹果手机”、“iPhone”和“iPhone 6”三个查询。并根据同义词的程度对不同的查询赋予不同的权重。ElasticSearch提供的Boosting查询可以支持这种需求。参考:)。