《文本上的算法——深入浅出自然语言处理》读书笔记:第6章 搜索引擎是什么玩意儿

目录

第6章 搜索引擎是什么玩意儿

6.1 搜索引擎原理

6.2 搜索引擎架构

6.3 搜索引擎核心模块

6.4 搜索广告


第6章 搜索引擎是什么玩意儿

6.1 搜索引擎原理

假设Q为用户要查询的关键词(Query);为所有网页集合中第i个网页,就表示给定一个Q,第i个网页满足了用户需求的概率,那么搜索引擎干的事就是根据用户的输入Query,在所有的网页集合中计算,并排序返回给用户。

使用贝叶斯公式

由于右边式子中的不好计算,所以对它进行了变形,例如

这个式子是有前提的,就是认为之间相互独立,这是个假设。换句话说,右边式子要想能计算必须在某个假设下,假设意味着和实际是有区别的,所以得有个方法来修正不在假设范围内的情况。因此如果直接计算,哪怕方法很简单都会有很大的帮助,如果不知道所有的Query,解决一部分Query也可以。现在搜索引擎都会记录用户在哪个Query下点击了哪些网页,以及顺序、时间、停留时长等。点积调权在排序列表均是同类数据的情况下是很有效果的,但是对于排序列表是由不同类数据组成的情况,就会有问题——某些类数据就会因为点得越多而拍得越高,排得越高进而点得越多,其他类数据就会吃亏。这其实就是开发和探索问题,开发在于充分利用好已有信息,探索在于给新信息一些机会,如何平衡二者是要解决的问题,通常来说,业务稳定了会侧重开发,业务发展中会侧重于探索。

6.2 搜索引擎架构

搜索引擎主要分为线下计算和线上计算两大模块。

线下模块

爬虫会从互联网上抓取所有网页,抓取下来之后就要做很多事情:网页解析、权重计算,然后要对网页建立索引,一般网页是要分库分机来建索引的。

线上模块

当用户输入一个Query之后,它首先会发到主控模块(MC,Main Control),该模块接着会把Query输入给Query分析模块(QA,Query Analysis),然后获得Query分析结果,之后把所有这些信息发给每一个基础搜索模块(BS,Basic Search)。搜索模块就会从每个索引库中读相关的索引并且归并完成初步筛选,并且在BS中通过基础相关性计算来完成二次筛选,将结果返回给主控模块,主控模块这时候还要经过高端排序(AR,Advance Rank,主要是不同维度的子排序模型)进行rerank,最后从摘要库(AD,Abstract Data)里把相应的摘要获取到一并将结果返回给用户。这就是整个搜索的流程。

6.3 搜索引擎核心模块

爬虫

爬虫的主要职责就是从互联网上抓取网页。整个网页因为链接构成了一个图,既然是一个图,遍历图的方法就有两种:深度遍历和广度遍历。所以爬虫一般的工作方式就是,首先给定一些初始链接种子,然后对这些链接进行深度或者广度遍历来获得更多的链接,直到把整个网络都爬取下来。

网页解析计算

这个过程包括:网页解析、权重计算、索引生成。

网页解析。抓取下网页之后,得到的其实是原始网页内容,那么就需要对它解析,目的是去掉无用的信息,得到真实内容。这个过程包括格式转换(网络上会有不同格式例如html、doc、pdf等的文件)、去掉html以及广告等标签,最终解析出网页标题、正文等等。

权重计算。权重计算主要包括这么几个步骤:term权重计算和文档综合。term权重计算相当于计算term和该网页之间的相关度。不同的词出现在不同的位置,它的重要程度就不一样,比如在title中就比在正文中出现更重要;就算都出现在正文中,由于词在不同位置或者有不同的标签,也会对它的权重计算有影响。总之,计算term权重考虑的特征就是页面特征,如title、正文和各种html标签等。文本特征包括tf、idf、位置等等。语义特征包括实体词、词关系、上下文信息、topic和embedding向量等。文档综合计算就是计算该网页文档的一些不同维度的得分,如时间因子、文档质量、网页主题、超链权重等,这些信息会进一步用在子排序模型。

索引生成。要索引进库的不光是文档的原始term,还可以进行索引扩充,对term的同义词、相关词、bigram等(不同的搜索引擎有不同的扩充策略)也要进行索引,最终生成索引库。因为数据量太大,索引库一般是要分库的。分库分为两个维度:横向和纵向。不同的搜索引擎会有不同等级的分库法,但是总的原则就是分为高质量库和低质量库,其实就像个金字塔,塔上面是高质量库且网页数量少,塔下面是低质量库且网页数量大。纵向就是指先在高质量库中检索,如果满足需求就返回,否则再去低质量库中检索。不管是高质量还是低质量库都有很大的数据量,不可能一台机器搞定,所以要把它们分成小库分别部署到不同的机器上。所谓横向就是去检索高质量库或者低质量库的时候,会去同时检索每台机器的小库(高质量库或低质量库均分别拆分成若干小库),然后汇总归并。

Query分析模块(QA)

Query分析在搜索引擎中是很重要的一个模块。它的主要职责就是对用户输入的Query进行各种分析计算供下游检索使用,它主要包括如下几个模块。

1.term级别分析

term级别主要包括这么几个任务:分词/专名识别、term重要性、term紧密度。

分词/专名识别。对中文的处理,分词肯定是少不了的。专名识别方法包括表识别和机器学习识别。专名识别的主要用处其实还是在term紧密度上。

term重要性计算。一个Query会包含多个term,那么就要给每个term计算一个权重,权重越高越重要。

termj紧密度。term紧密度是用来计算term之间的位置信息的。term紧密度也是用来相关性排序的,检索出来的文档中相应term的紧邻关系也要尽可能和Query中的保持一致,越一致的自然更好。

2.Query级别分析

Query级别分析最主要包括这么几个任务:Query意图识别、Query时效性判断,当然还有地域信息、属性归一等。

Query意图识别。Query意图识别说白了就是看该Query是什么类别的,因为不同的类别对相应的网页有不同的提权。一般Query意图识别的方法有这么几种:(1)模板匹配;(2)基于分类思想的识别方法;(3)根据点击反馈的判别方法。

Query时效性判断。时效性一般分为三种:泛时效性、周期时效性、突发时效性。泛时效性是指有些Query永远具有时效性特性;周期时效性是指具有周期性的事件;突发时效性是指突然发生的事件。前两个时效性根据历史信息是可以积累挖掘的;突发时效性可以根据Query log的分布变化或者一些社交平台的爆发或者文档主体变化等渠道检测出来。

3.Query变换

Query变换也是属于Query级别的分析,但是它比较重要。Query变换说简单点就是一个Query可以替换成另一个Query而不改变原来的意思,主要包括:同义改写、纠错改写、省略变换等。

同义改写。同义改写其实是指Query中某些term可以替换成其他同义的term而不影响这个句子的意思。

纠错改写。纠错改写是指Query中有些是用户输错的,需要根据用哪个华的意图把它改写正确。

省略变换。省略变换是指Query中有些词省略之后不影响整个意思。

在Query变换中一定是句子级别的替换,否则会出现严重的badcase。大多数搜索引擎的替换其实都不是句子级别的替换,有的直接替换成同义词然后去读索引,然后对同义结果降权,这其实是不好的处理方法,因为会引入一些噪声给排序增加了困难。既然Query变换是句子级别的,那就相当于是一个新的Query,既然是新的Query,那就像对待原Query一样去检索,不同的Query召回的结果放到不同的队列中,最后根据权重归并起来。

主控模块(MC)

主控模块主要的职责就是调度。它把接收到的用户Query,发给QA,获得Query分析结果,然后把结果发给BS模块,获得结果,然后进行高端排序,然后从AD模块中获得摘要信息,返回给用户。

高端排序(AR)

在MC模块中,已经拿到了各个BS模块返回的结果。这时就可以对BS返回的候选集合进行高维度排序,主要是在BS返回得分的基础上进行一些不同维度的子排序模型,因为在这个模块可以拿到更多的信息,而且大多分加大参考Query分析的信息。

基础检索模块(BS)

基础检索模块也是非常重要的模块,它负责把结果从索引库中召回并按照相关性返回给MC模块。

BS模块首先从索引库中读取索引,并且归并,获得初步的候选集,然后就会进行一次过滤。一次过滤其实就是使用很简单的模型进行粗排,因为计算量大,所以方法不能太复杂,这时获得TopN的结果进入到二次过滤。二次过滤是计算更完善的相关性模型进行精排,主要这几个特征:(1)term权重*位置信息,term权重其实就是Query分析时计算的权重和线下计算term权重的平均;(2)语义信息,如主题的匹配程度、核心词的匹配程度等;(3)文档质量,如文档页面质量、文档时间因子等;前两次筛选是在单库内进行,这样BS模块就得到了最终的URL列表。

总结一下,就是BS模块会进行召回、粗排和精排三个操作,越到后面返回的候选集越少,计算模型也越复杂,到了AR模块就是rerank,包括不同维度的子排序模型调权和业务规则调权。

精排的时候一种方法就是Learning to Rank,用排序学习的方法来处理。

它的模型主要有3种:Pointwise、Pairwise和Listwise。

(1)Pointwise方法的主要思想是将排序问题转化为多分类问题或者回归问题,也就是将(Query,di)的标注结果作为一个类别。

(2)Pairwise方法的主要思想是将排序问题转化为二元分类问题。对于同一个Query,在它的所有相关文档集里,对任何两个不同label的文档,都可以得到一个训练实例对,例如(d1,d2)分别对应label为5和3,那么对于这个训练实例对,给它赋予类别+1(5>3),反之赋予类别-1。于是,按照这种方式,我们就得到了二元分类器训练所需的样本了。

(3)Listwise方法的主要思想是直接对排序指标进行优化,也就是把某个Query及其整个排序结果作为一个样本。

LambdaMART模型由LamdbdaRank衍化而来,而LambdaRank又是由RankNet优化来的。

有了模型,特征主要有这么几类:(1)Query信息,包括Query分析的东西、Query频次、点击次数等等;(2)文档信息,包括文档的基础得分,文档的类别、长度、主题、时间等等;(3)匹配信息,主要是Query和doc的匹配信息;(4)语义信息,包括从语义层面Query和doc的相关性;(5)用户行为,包括各种维度的点击行为、阅读时长、Session内上下文等等。

训练语料的获取一般是两种情况:一是请标注人员来专门标注;二是从日志中来抽取,如果在某个Query下,某个文档被点击过,而另一个文档没有被点击,那么就可以认为更相关。训练语料对最终效果有很大影响,所以抽取出更高质量的语料也是一项非常重要的工作。

索引结构简单说如下图所示,建索引的过程就是把文档的正排信息(一个文档有若干个term组成,每个term有位置、权重等属性)建立索引(倒排信息,从term找到所对应的文档)。

 一个索引结构可以简单地看作就是key-list结构。通常一个term后面的list中文档是要按某种方式排序的,一般是按照文档号递增来存储的,怎么排序取决于用什么算法来归并。现在设计好了索引结构,对所有文档建立了这样一个倒排索引库,那么剩下的问题就是有一个Query,它分词之后有可能有多个term,那么怎么找到都包含这些term的文档呢?也就是要怎么归并这些key-list。索引归并主要有两种方法:TAAT和DAAT。

Term-At-A-Time(TAAT):在TAAT的查询处理过程中,它每次只打开一个term对应的倒排链,然后对其进行完整的遍历,所以它每处理一个文档只能得到这个词对这篇文档的贡献,只有处理完所有term的倒排链后,才能获得文档的完整得分。因此,TAAT查询处理方法通常需要一个数组来保存文档的临时分数,这个数组的大小通常与文档集规模相当,所以当文档集规模很大时,这个额外数组存储开销会变得非常大。

Document-At-A-Time(DAAT):在DAAT的查询处理过程中,它首先会打开各个term对应的倒排链,然后同时对这些倒排链进行遍历。每次对当前文档号最小的文档计算相关性得分。在处理下一篇文档之前,它会完整地计算出当前处理文档的最终相关性得分。因此,DAAT的查询处理过程中,它只需使用较少存储空间来保存当前得分最高的文档及其得分,通常这些数据使用优先队列来存储。

当数据量较大的时候,通常采用DAAT的方式进行查询归并,用的更多的是基于文档号递增排序的倒排索引结构。假设使用DAAT方式来归并的话,还是有问题,一般数据量大的话,每个term对应的倒排链会很长,如果list中每个文档都遍历的话,性能不高,通过调表可以跳过不可能出现在结果中的文档。

跳表示一种简单且高效的数据结构,它是一个有序链表,在原链表上设置了若干层的有序链表,每一层都比上一层的节点要少,比在原链表撒花姑娘查找路径要短(跳过了很多元素),这也就是它的优势,所以使用跳表可以加快链表归并。

对于搜索一般有三个常用的查询表达式:AND、OR和NOT。

跳表的优化只对AND查询有用,对OR查询不起作用,所以要同时满足OR查询,就要想办法优化,优化的思路就是剪枝限界。有两个经典的动态索引剪枝算法:MaxScore和Weak-AND(WAND,是AND查询和OR查询的扩展)。它们都是通过计算每个term的贡献上限来估计文档的相关性上限,从而建立一个阈值对排中的结果进行剪枝,最终达到提速的效果。

搜索引擎评价

常用的搜索引擎评价指标有:MAP、NDCG、MRR等,当然还可以AB-testing来对比两个系统的指标。

MAP是一种很简单的评价方法,计算公式如下。

DCG这种方法基于两点假设:(1)高相关性的文档比边缘相关的文档要有用得多;(2)一个相关文档的排序位置越靠后,对于用户的价值就越低。这种方法为相关性设定了等级。DCG方法的定义如下: 

MRR主要考察第一个正确答案排名的准确率,所以更多地用在导航类或者问答类的评价上,它的定义如下:

一个完整的搜索引擎还有很多相关模块,包括:

输入提示

相关搜索

反作弊/反垃圾

网页去重

在工程上,还有一个很重要的功能就是缓存(Cache)。Cache就是把经常用到的数据缓存起来,如果要再使用的话,不用发送到下游,直接读取就可以了。所以Cache的最大作用就是提高性能,在好多模块都可以使用Cache来提高性能。总体来说,网页搜索引擎还是有门槛的,数据量大,计算要求也高,但是垂直搜索引擎就简单不少,一般垂直搜索引擎都是自己的数据,很多模块都不需要了,而且数据量小,计算要求也低。

搜索引擎还有很重要的一些技术点,就是根据Query log、Session数据和点击数据进行各种挖掘工作,而这几类数据也是搜索引擎特有的优质资源。Query log就是所有用户搜索的Query的集合,Session数据是用户搜索行为的时间序列,如某用户首先搜索了QueryA,然后1分钟后又搜了QueryB,再过了半小时又搜了QueryC,那么QueryA和QueryB一般来说就会有很大关联。如果海量用户都有这种行为的话,QueryB就可以作为QueryA的相关搜索词推荐出来;点击数据记录的是用户搜索了某个Query,然后点击了哪些doc。如下图所示,

这是一个二部图,左边是Query,右边是doc,有点击的话,就会形成一条边。从这个图就可以挖掘好多信息,Query和Query的关系、doc和doc的关系、Query和doc的关系。由于Query和doc都是由term组成,所以还可以进一步探索term和term之间的关系。

6.4 搜索广告

搜索引擎靠广告盈利,要想了解广告,要知道几个常用术语。

CPC(Cost Per Click):每次点击的费用,即按照广告被点击的次数收费。

CPM(Cost Per Mille/Cost Per Thousand Click-Through):每千次印象费用,即广告每展示1000次的费用。

CPA(Cost Per Action):每次行动的费用,按照用户对广告所采取的行动(完成一次交易、产生一个注册用户等)收费。

CPS(Cost Per Sales):以每次实际销售产品数量来收费。

CPL(Cost Per Leads):根据每次广告产生的引导付费。

CPD(Cost Per Day):按天计费。

CTR(Click Through Rate):广告的点击率。

CVR(Click Value Rate):广告的转化率。

RPM(Revenue Per Mille):广告每千次展示的收入。

广告大致分为品牌广告和效果广告。品牌广告一般是用来树立品牌形象的,目的在于提升长期的离线转化率,它不要求你当时就产生购买动作,但希望你需要该产品的时候能够想到这个品牌。效果广告有大致分为展示广告和搜索广告。展示广告是指广告系统找到该网民与Context上下文(网页等)满足相应投放设置的广告。搜索广告是指广告系统找到与用户输入的Query(及网民)相关且满足投放设置的广告。

广告本质上就是达到广告主(买广告的企业/人)、用户和广告公司的共赢,而广告公司要做的事就是给广告主找到最合适的用户,也可以说是想办法让广告(广告的一系列特征)与用户(u用户特征)和展示广告的页面(页面特征)最符合。这样,展示广告和搜索广告就有区别了。展示广告就是展示与页面和用户最符合的广告,而搜索广告则不同,它是展示与用户输入的Query(也会包括用户特征)最符合的广告。

目前展示广告效果最好的就是RTB(Real Time Bidding,实时竞价)广告。相比传统的广告,RTB最大的优点是卖“人”而不再是卖广告位,也就是说同一个广告位,不同人(兴趣不同)会看到不同的广告,所以更加精准。

广告交易平台(Ad Exchange)模式相比传统的广告网络(Ad Network)模式最大优点之一就是,Ad Exchange更偏重于对用户的精准投放,而Ad Network更偏重于对展示广告的页面和广告的匹配。

一个搜索广告系统主要分成4大部分:业务系统、检索系统、计费统计系统、反作弊系统。这几个模块并不是单独存在的,都是要互相通信的。

业务系统主要是用来给广告主管理个人信息、管理广告、购买广告等操作,还要对用户的消费产生报表等。计费统计系统用来对用户的点击进行计费,并修改广告主的余额等,还要记录一些其他点击信息等。反作弊系统就是要打击各种作弊行为,保护广告主的利益。检索系统就是要完成广告的整个检索过程。

搜索广告的检索系统和搜索引擎的系统很相似。

首先,用户输入Query之后,先是进行Query分析,和前面搜索引擎的Query分析差不多,做些分词、Query变换、意图分析等等。

然后,把Query分析结果发送给出触发系统。触发系统的作用是根据Query找出最相关的一些广告,首先它去拍卖次索引库中匹配出相关的拍卖次。匹配模式有三种形式:精确匹配、短语匹配、广泛匹配。

排序模块就是对召回的所有广告排序,广告排序规则是Q*Bid,Bid就是拍卖词的出价,Q是广告质量,通常都是使用pCTR来表示。pCTR就是预估的点击率,也就是用户越可能点击且出价高的越要排在前面,这也就是前面说的最合适的广告。

最后,就是对排好序的top-N广告展示。当用户点击之后,就会触发计费统计系统,也就是说如果是正常的点积(反作弊系统),那么就要扣掉广告主的钱,扣钱准则就是使用的广义二阶价格(GSP)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值