得物技术浅谈搜索引擎技术简介

导读

搜索引擎是一种结合天然语言处理,信息检索,网页架构,分布式数据处理为一体的帮助用户准确解释信息获取信息的一种技术。算法

目前业界在网页端与手机端的主流门户搜索份额基本被各种巨头(图1.1)(SEO, 2020)所分割。固然,随着时代的发展,搜索愈来愈向以细分业务为主导的精细化门户搜索的方向发展。好比你会选择在知乎搜索专栏知识,在得物搜索潮流爆品,在美团点评搜索吃喝玩乐等等。网络

THE NO.1数据结构

信息检索

搜索引擎

咱们要聊搜索引擎,那必然离不开信息检索(information retrieval)。架构

首先咱们对何为信息检索须要有一个明确的定义:经过在一个大的数据集合中找到知足信息需求(information needs)的非结构化天然形式(一般指文本语料库)的材料(通常指代文章)(Manning, 2008)。分布式

在检索信息时,有两个指标是在讨论搜索性能时无可避免。一个是召回率(recall),另外一个是准确率(percision)。有趣的是,这两个指标就像一对孪生兄弟,老是此长彼消,此消彼长,所以,如何作好其中的制衡是各个搜索算法面临的问题。布局

本文做为搜索引擎技术的启蒙文章,主要针对文章结构、倒排索引、操做符与查找算法这四个维度来说解一下搜索引擎的基本工做流程。性能

THE NO.2优化

文章结构

文档

首先咱们来谈一谈搜索引擎都是如何理解它的那些文档的。在聊这个话题以前,咱们要先明确一个定义,搜索引擎分为两种,网页级搜索引擎和公司级搜索引擎搜索引擎

不管是那种搜索引擎,它们第一件须要解决的问题就是理解语料库,以后要作的就是存储语料库。url

那么如何理解呢?如今让咱们来看一下基本的文档的脉络机构。

不少时候人们通常认为文档就能够看做一个独立的词袋。但其实否则,每一个文档实际上是由不一样的组成部分构成的。

好比通常网页的构建逻辑基本会是XML形式构成的,在大类上咱们把它们分红三层,第一层是metadata,里面通常会有_url、关键字、做者、日期_等等,第二层是body,里面通常包含的就是像_标题、主体内容_这些信息。第三层是外部信息,主要有一些_外部连接与内部连接_跳转。

分区能够帮助咱们对各个区块的信息量进行一个区分,缘由在于每一个区块的信息熵是不同的。

简而言之,包含的信息量不同,好比文章标题含有关键词的信息量就相对而言要大于段落中包含这个关键词全部的信息量。

得物搜索

在咱们得物平台,主要有两个搜索主要发力点:商品和社区。那也能够进行这样的分层,虽然具体的信息分层方式有所变化,可是具体的设计逻辑依然不变。

根据香农定理里面的信息论,这些文档它们提供的信息价值是不一样的,信息熵也是不一样的,若是把他们混为一谈的话,咱们搜索的准确度必然会有必定程度的下降。

通常而言,文档标题包含的信息量要略高于文档主体的信息量,经过将内部结构分层的操做,咱们在后期进行算法干预的时候就能够人为的对其中的内容的权重进行调整,从而提升咱们所召回内容与用户输入query符合度的准确程度,更好的知足用户的搜索指望。

THE NO.3

倒排索引

存储

讲完了文档的结构,咱们就要讨论下如何对这些文档结构用数据结构进行存储。相信你们都知道,咱们在搜索引擎存储信息通常采用倒排索引,而倒排索引主要分为两种索引结构。

第一种办法咱们针对的是平铺的页面布局,也就是我前面所提到的将全部页面的各个区块独立对待的方法。说白了萝卜是萝卜,坑就是坑,各个信息块之间各自独立,没有交互。

而第二种结构咱们采用的是垂直结构,也就是说,咱们令页面中的各个布局存在层级关系。

我拿主体部分举个例子,主体部分 -> 区块 -> 段落 -> 句子。

平铺的页面布局

首先咱们来说下第一种归并倒排索引,咱们看下构建模式。

咱们在推荐和博文这两个field里面都有一个词典,那咱们在这儿要作的就是把各自的词典和它所对应的field合并起来。

在这里咱们须要注意的是,一个term将会有多个倒排索引,好比说bush这个词,在推荐这儿咱们为它构建了一个倒排,在博文这儿咱们也为它构建了一个倒排。

在这种状况下,咱们不会把不一样field的信息杂糅在一块儿。不少次和bush同样都具备歧义性,经过创建各自独立的倒排索引,能够有效的保证信息的独立性。

垂直结构

有的时候咱们搜索信息时,并不须要搜索到所有的信息,可能咱们只想要搜索到特定位置的特定信息。

若是咱们想要搜索句子里面的癌症,在归并结构下,咱们的搜索进程就会变得非常复杂,咱们要先从文章再到章节再到句子,很显然,若是采用这样的结构,咱们的搜索速度很受到必定的影响。

所以,咱们须要的采用一种比较精巧的独立倒排索引结构,这种结构通常面向的是那种相对比较复杂的文章结构。

咱们接下来看一下这个树形结构,在这种结构下,咱们会记录下文档各个词所在的位置以及它们的上下级父子关系。

若是咱们要搜索位于位置6和位置27的信息,咱们就会先溯源到搜索脉络中所处的位置,以后用一种相对快速的方式快速检索到信息(log级别的速度)。

若是要搜在章节位置的信息,那么它就会丢弃loc为6的信息,由于loc为6的信息在树结构中属于做者这个区块。

这样的方式能够大大提高咱们的搜索效率,而咱们须要付出的只是惟不足道的一些内存而已,在这个云存储的时代,这样的操做很是具备性价比。

彻底倒排

除此以外,咱们也能够用彻底倒排的方法来构建倒排索引-即独立倒排形式。

咱们能够把field的边界阈值存放在倒排索引里面,另外构建一个term的倒排索引,经过把这两个进行归并,便可构建独立倒排。

好比说在这儿咱们假设这是一个句子的倒排索引,开始和起始为止标注在那儿了,extentFreq表示这是第几个field。

当咱们确立好loc的具体值时,咱们只须要到旁边的[begin,end]判断是否在区域范围内,就能够快速肯定这个loc包含的信息是不是咱们须要的信息。

另外右侧的部分是tfidf的含义解读:

tfidf主要用来描绘出词汇在文章中的信息量;tf表示文章中包含该词的个数;df表示含有这个词的文章的个数;idf表示倒排文章频率,用来描绘文本稀缺度N表示总库存的文章数。

经过tfidf,咱们能够对文章的信息度进行一个相对粗略的判断,能够说tfidf是信息检索的鼻祖算法,以后的一系列其余的算法都是对tfidf的补充及优化。

THE NO.4

Query操做符

操做符分类

操做符通常来讲能够分为三类,一类用来构建新的倒排索引,其中有_#SYN,#NEAR,#WINDOW_;一类用来生成分数列表,它的操做符是_#SCORE_;一类用来合并生成好的分数列表,其中有_#AND,#OR,#WSUM_。

Callan, 2020*

分场景应用

这些操做符能够用来帮助咱们在不一样的情境下构建一些复杂的query。

NEAR或者WINDOW操做符

咱们以前已经讲完了倒排索引,咱们天然能够构建Nike ,AJ,阿迪等等的倒排索引,可是光这些基础结构很难知足咱们的需求。所以,咱们还须要一些其余结构的倒排索引,好比说布莱克奥巴马和AJ1。

这样的query实际上是由两个或者多个词合并而出的短语,为了保证其中的次序性可以被正确识别,咱们在这个时候就须要使用NEAR或者WINDOW操做符来进行词汇连接。

syn操做符

syn操做符能够用来构建一些概念性质的倒排,好比各种颜色的集合。

Score操做符

Score操做符比较容易理解,咱们经过咱们构建的一些记分算法来说一个倒排索引构建成一份分数列表。

AND和#OR

#AND和#OR这些操做符则是用来合并已经构建好的分数列表。

THE NO.5

搜索算法

讲完了文章结构与操做符,搜索引擎的冰山一角已经被咱们剖析了出来。

若是把搜索引擎比作修炼,那咱们基础已经打完了,接下来咱们进入硬核部分 - 搜索算法,了解完了搜索算法,那你基本能够开始尝试构建本身的小型搜索引擎了。

首先,咱们讨论一下从倒排索引到分数列表过程当中可能会使用到的一些粗排算法。

搜索引擎查找信息的过程实际上是咱们在用各类各样的方法来解释咱们的信息,经过算法一步一步的压缩召回池的数量,最后经过排序来得到咱们想要的信息(即排序好的文章)。

粗排

最简单的粗排算法就是UnRankedBoolean和RankedBoolean两种,它们都是精确查找的过程。在过去人们认为文档就是一个词袋的集合,那么只要进行精确查找就好了。

Unrankbooolean

Unrankbooolean顾名思义获得的信息是无序的。这种方法简单直接,得分匹配就是1,不匹配就是0。

在90年代前一直都是主宰级的办法,可是如今已经基本被淘汰了,由于人们开始逐渐发现人们很难确保query自己是准确的。

RankedBoolean

RankedBoolean就是给予文章得分,办法也很简单,单纯依据tf得分。

那咱们讲完了基本被淘汰的exact match,咱们来聊一聊best match,best match有如下几种:

  1. ​Vector space retrieval model (VSM)
  2. ​Probabilistic retrieval model (BM25)
  3. ​Statistical Language Model (query likelihood)
  4. ​Inference networks (Indri)

因为vector space已经基本被业界弃用了,因此咱们这边不对它进行展开。

BM25

咱们先主要聊一聊BM25。

BM25的展开公式以下图所示。

BM25算法由Steve Robertson建立。M25刚开始叫BM10,BM15,随着一系列的实验和调参最后成了如今这样。

第一部分叫RSJ weight,叫这个是由于Roberson开发了这个算法,Karen Spark Jones是他的mentor,辅助他开发了这个算法,因此联合命名为RSJ weight。

它其实很像idf,主要在idf上作了进一步的优化。

这边的tf weight主要是对文本的长度作了一个标准化(normalization)。由于一个词汇在若是在一篇20字的文本中出现了一次和在一篇2000字的文章中出现了一次,所表明的置信度应该是不同的,经过标准化处理,咱们能够在必定程度上消除长文章的不正当竞争优点。

另外一块是user weight,主要用来调节用户的权重,这一部分咱们能够相对忽略,业务在实际调参中,user weight的值通常为1。

在这三个可调节参数中,K1调节的是这个调节幅度的强度,B用来调节的是文本长度normalization的程度,K3用来调节的是用户权重的程度。

BM25到这儿基本结束,接下来咱们讲下Two-Stage Smoothing算法。

Two-Stage Smoothing算法

要估计一个词汇在文档中出现的估计,不少人首相想到的多是最大似然估计(Maximum Likelihood Estimation)。

可是在搜索中他是有缺陷的,好比说咱们要搜镭射粉AJ夏款,那么可能镭射粉AJ是有的,可是夏款没有。

那么夏款这个词的MLE score就是0,而咱们最后是要把镭射粉AJ的分数和夏款的分数相乘的,那么最后结果就是无结果,什么都搜索不到。

这个时候smoothing function就派上用场了,首先咱们须要处理一些不多见的term,其次咱们要平滑一些很短的文章。

首先咱们先介绍下这个jelinek-mercer smoothing function,也叫混合模型。这个模型下咱们会有两个最大似然估计,一个是query term基于文档的,一个是query term基于库的。

Lambda用来控制平滑的程度,通常来讲当lambda趋向于0的时候,平滑程度趋向于0。那么如何选取lambda呢,咱们的实验建议是小的lambda适用于短的query,是大的lambda适用于长的query。

另外一个平滑方法是狄利克雷特先验平滑算法,这个算法它的目的是为了调节稀有词和高频词在词库中的出现频次。通常来讲mu的值在1000到10000中为比较合适的范畴。

上述各个平滑算法及MLE算法的公式以下所示:

Indri

讲完了BM25和平滑算法,咱们来说一下Indri。

Indri是用统计语言模型和贝叶斯干扰网络构成的。

听起来可能很吓人,可是仔细总结一下,他的关键在于如下几点:

  1. 它是一个几率型检索模型
  2. query是结构化的
  3. 文档由多样的形式进行表现

这个看起来很复杂,但其实并不复杂,具体表现形式以下:

Callan, 2020*

首先咱们有一个网页,每一个网页有着它所属的网络结构,好比说标题、主题、URL等等。那么很天然,咱们能够将文章拆解为不一样的区块。

与此同时,咱们在前文提到过平滑模型,咱们经过将平滑模型中的两个参数与文章结构相结合咱们就能够获得一个文本语言模型,即在这个区块中的贝叶斯几率值。

另外,每个文档区块均可以拆分红不一样的子节点表现形式,好比单字、短语等等,它们也有着各自所对应的贝叶斯几率。这样的话,在文档层面咱们就完成了语言模型到贝叶斯几率的转变。

而后咱们往下看,I表示某我的的信息需求,这个信息需求通常由一个query来表示,而这个query又由许多子query来构建,咱们如今能够思考一下and/or/Near等操做符。

对于每个query,咱们均可以先用nlp拆词拆分红小的单字,再经过操做符进行组合构建,这样每个query概念就也包含了各自的贝叶斯几率。这就构建了一个query网络。

以后,咱们就能够将query网络和咱们的文档网络创建链接。经过对query网络和文章网络对似然度进行匹配,咱们就能够尽量准确的找到准确度较高的文章,这就是咱们整个Indri网络的体系流程。

引文说明

SEO, 2020. SEO Search Engine - SEO Rank Services. [online] SEO Rank Services. Available at: https://seorankservices.com/search-engines-optimize-site/seo-search-engine/ [Accessed 3 February 2020].

Manning, C., 2008. Introduction To Information Retrieval. 1st ed.

Callan, J., 2020. Search Engine 11642 - Carnegie Mellon University.

文|Ray

关注得物技术

相关文章
相关标签/搜索