6 搜索引擎是什么玩意儿
Google这家搜索引擎公司的巨大成功,才把文本处理技术推向了一个新的高度。
6.1 搜索引擎原理
假设Q为用户要查询的关键词;为所有网页集合中第i个网页;
表示给定一个Q,第i个网页满足了用户需求的概率,那么搜索引擎干的就是根据用户的输入Query(也包括一些隐性的信息,比如地域等),在所有的网页集合中计算
,并排序返回给用户。
如果按照之前的相关性方法把query和每一个网页的相关性计算出来,然后排个序。但是互联网的网页数量多的惊人,这样的方法计算量太大,因为大部分是和用户查询不相关的,不需要去计算,怎么过滤到不相关的?
没办法计算,那么计算等价方式,使用贝叶斯公式:
只与query自身有关,对于同一个query来说,它都是一样的,所以可以不计算了。但是对分析整个query来说还是有用的,对于热门query,
较大,必须使右边式子的分子更大才能满足用户需求,也就是说对排序要求越高;相反,对于冷门query,
较小,右边式子的分子不用太大都能满足用户需求,也就是说对排序要求较低。
比如用户搜“腾讯网”(热门query),如果哪个搜索引擎第一条不是腾讯网的首页链接,那么这个搜索引擎质量太差了,不能容忍。
比如用户从某处复制了一串很长的文字(冷门query),放到了搜索引擎中去搜,那么只要搜索引擎能返回包含该串的结果就行了,至于排到第一位还是第二位或是其他文职,只要不是很靠后,都可以接受。
第i个网页的重要程度,与用户查询无关,可以线下计算好,可以简单用网页的pagerank表示。
给定一个网页满足了用户的需求,那么用户的查询是q的概率。反映了一个网页满足不同需求之间的比较。但是没法穷举所有的query,怎么计算呢?假设query是由若干个词组成
,那么:
一种策略,如果我们认为之间相互独立,那么就有:
式子只与单个的词有关,从query级别转换成词级别就可以线下计算了,都可以线下计算好存起来,需要用的时候取出来就可以了,同一个词
会在若干个文档中出现,那么按某一种方式存储起来,就可以一次全部取出来
所在的所有文档,这就是索引。
一个Query由若干个词组成,上面的假设之间相互独立只是一种分解策略,根据具体的情况还会有不同的分解策略,比如某些词必须合并到一起,某些词可以替换成另外的词等,这些是query分析及页面分析要完成的事情。无论运用哪种或者多种分解策略,都可以分别将它们查到的结果(每个策略的结果叫一个队列),按它们满足各自查询的概率最终归并起来。
上述叫概率语言模型。计算语言模型要平滑。
如果直接,可以用点击的方法,现在的搜索引擎会记录用户在哪个query下点击了哪些网页,以及顺序,时间等,
是不可以用所有用户在该query下点击第i个文档的次数来表示,点的越多说明该文档越能满足用户需求,实际使用中是按照点击在已有相关性上调权,而不是直接用来排序。
6.2 搜索引擎架构
搜索引擎的工作流程是怎么样呢,如图分为线下计算和线上计算两大模块。
线下模块:
爬虫会从互联网上抓取所有网页,抓取下来做很多事情:网页解析,权重计算(包括计算pagerank值),然后对网页建立索引,一般网页是分库分机来建索引的。
线上模块:
输入一个query只会,首先会发到主控模块(MC,main control),该模块会把query输入给query 分析模块(QA,query analysis),然后获得query分析结果,之后把所有这些信息发给每一个搜索模块(SM,search model),搜索模块就会从每个索引库(index)中读相关的索引并筛选排序,将结果返回给主控模块,主控模块这时候经过一系列调权(其中包括点击调权,调用点击模型(CM,click),进行rerank),最后从摘要库(AD,abstract data)里把相应的摘要获取到一并将结果发给用户。
6.3 搜索引擎核心模块
爬虫
从互联网上爬取网页,要求抓的尽可能抓的全,尽可能快。整个网络是一个图,遍历就有两种,深度遍历和广度遍历。工作方式是给定一些初始链接种子,然后对这些链接进行深度或广度遍历获得更多的链接,注意,不要反复抓取已经抓取过的链接。
网页解析计算
包括网页解析,权重计算,索引生成。
网页解析:
解析,格式转换(不同的格式有html,doc,pdf等文件),去掉html等标签,解析出网页标题,正文,去掉网页上的广告等等。
权重计算:
特征提取,权重计算。特征提取就是从网页中取出特征,如title,meta等,还会计算出高级特征,如主题匹配等。
权重计算包括term级别的计算和网页级别的计算。 ,不同的位置,重要程度不一样,比如Title比正文重要,就算出现在正文中,不同的位置及不同的标签也对权重有影响。网页级别的计算就是计算网页的特征,比如:时间因子,页面是否丰富,网页主题,超载权重等,用于调权。
索引生成:
数量量太大,索引库要分库,分为:横向和纵向。不同的搜索引擎会有不同的分法,但是总的原则是分为高质量库和低质量库,就像金字塔,塔上面是高质量库且网页数量少,塔下面是低质量库且网页数量大。
纵向就是先在高质量库中检索,如果满足要求就返回,否则再去低质量库中检索。
不管是高质量库还是低质量库都有很大的数据量,不可能一台机器搞定,所以分为小库分别部署到不同的机器上,横向的就是检索高质量库或者低质量库的时候,回去同时检索每台机器的小库,然后汇总归并。
query 分析模块(QA):
对用户输入的query进行解析,供下游检索使用。
包括:
1. term级别分析
分词/专有名词,term重要性,term紧密程度。
分词/专有名词:
专有名词识别方法包括词表识别(影视名、音乐名等)和机器学习识别(人名、地名、机构名)
term重要性计算
一个query会包括多个term,那么就要给term计算一个权重,权重越高越重要。
tf*idf,tf是局部信息,idf 是全局信息。但是tf在query 一般是1.如果只用if*idf,只用了idf。效果不好,优化即对tf优化。作用为一是计算相关性,二是对不重要的词可以省略,扩大召回。
term紧密度
term紧密度是用来计算term之间的位置信息的。如query 是老大的幸福在线观看(老大/的/幸福/在线/观看),老大的幸福是最紧密的,因为是专有名词,以为这不能分开,要合并要一起。在线/观看,是其次紧密的,尽量合并,分开也可以接受。老大的幸福和在线观看是不紧密的。也是用来相关性排序的。
2.query级别分析
query需求识别:
query 是什么类型的,比如:视频需求,是百科需求,还是小说需求等。因为不同的类别对相应网页有不同的提权。一般query需求识别有:1.模板匹配 2.基于分类思想的识别方法 3.根据点击反馈来判断意图
query时效性判断:
时效性分为三种:泛时效性,周期时效性,突发时效性。
泛时效性是指有些query永远有时效性,比如减肥,永远是热门话题。
周期时效性具有周期性的事件,比如高考,世界杯等
突发时效性:突然发生的事件。比如宝强离婚,文章出轨等
前两个可以根据历史信息可以积累。后一种根据query log的分布变化检测出来。
3.query 变换
替换成另一个query而不改变原来的意思。主要包括:同义改写,纠错改写,省略变换等,还有些关联扩展等。
同义改写:
query中某些term替换成其他同义的term而不影响这个句子的意思。比如:招商银行官网-招行官网
纠错改写:
query是指query中有些是用户输错的,需要跟据用户的意图把它改写正确。如薛子谦-薛之谦
省略变换:
省略不影响整个意思,比如招行客服电话-招行电话
目的是termA替换成termB整个句子的意思没有变化,省略变换其实就是termA替换成空,一个特例。
一定是句子级别的替换,否则会出现重大的badcase。
例如南航网上值机如果替换成南京航空航天大学网上值机就是错误的。意思偏离了。
大多数搜索都不是句子级别的替换而是直接同义词替换去索引,然后对同义结果降权,其实是不好的。
句子级别应该是相当于一个新的query,就像对待原query 一样去检索,不同的query召回的结果放在不同的队列中,最后将权重归并起来。
给定query S,找到最佳替换T的模型是:
替换对的挖掘及概率计算,语言模型的参数估计,最优解的搜索算法等。
主控模块(MC)
职责包括调度和rerank
调度:
query发给QA,获得分析结果,然后把结果发给SM模块,获得结果,进行Rerank操作,然后从AD模块中获得摘要信息,返回给用户。
Rerank:
SM中返回的结果要进行调权,大概有这么多的因素:页面质量调权,Query需求调权,时效性调权,多样性调权,点击调权等。
点击调权是很重要的模块,线下对query的点击行为做很多的计算,它有好几种模型,如论文
《A Dynamic Bayesian NetworkClick Model for Web Search Ranking》 对DBN讲的很清楚。
还有对多个队列,单队列调权和多队列调权。也可以从AD中获取网页的正排信息,进行更精细的排序。
搜索模块(SM)
负责将结果从索引库中召回并按照相关性返回给MC模块。
细节如下:
首先获得最基本的结果,进行一次过滤,先索引归并,然后计算相关性:term权重*位置信息,一般搜索引擎只用到Proximity层面,当然也可以加入语义信息。当一次筛选后,还会进行二次过滤。二次过滤会根据页面属性进行筛选(比如页面质量,死链等)。前两次筛选其实是在单裤,多库结果汇总之后可能还要过滤。得到url表。
有不少参数,调参是一件头疼的事情,于是可以使用机器学习来解决这个问题。Learning to rank,排序。
pointwise方法:
将排序问题转化为多类分类问题或者回归问题,就是讲(query,di)结构作为一个类别(5个类别,Perfect=5,Excellent=4,Good=3,Fair=2,Bad=1)作为一个类别。只要(query,document)的相关度相同,比如都为perfect,就会被放在一个类别里,即属于同一类的实例,而无论query是什么。比较简单,但效果不是很好。实现方法有McRank。
pairwise 方法:
排序问题转化为二元分类问题。对于同一个query,在它的所有相关文档里,对任两个不同的Label的文档,都可以得到一个训练实例对,如(d1,d2)分别对应5和3,则赋予+1,以及-1。这样的方法不再是query独立的,但是缺点是不同query的训练集的数量会出现不均衡的问题,对相关文档集小的query所产生的训练实例区分不好。实现Pairwise方法有RankSVM,RankNet,FRank和rankBoost等。
Listwise方法:
直接对排序结果进行优化。给定一个query,以及其对应的document list,现在得到了一个标注好的分数列表z(每个文档的点击率等)。然后采用某个函数f给每个document打分,得到一个预测排序得分列表y,然后采用某种损失函数计算loss(listNet采用交叉熵,即将z和y带入交叉熵公式中作为损失函数学习参数)。实现方法有ListNet,RankCosine,SVM-MAP等。
索引
索引结构如图,把文档的正排信息(一个文档有若干个term组成。每个term有位置,权重等属性)建立索引(倒排信息,从term找到所对应的文档)。
一个索引结构其实可以简单看做key-value结构,termA在docid1和docid2中出现,且在docid1中分别出现在pos1和pos2的位置上,且属性(例如权重)分别是attr1和attr2,一般是按照文档号递增的来存储的,怎么排序取决于用什么算法归并。问题是如果来了这样的一个query,分词后有多个term,怎么找到包含这些term的文档呢?就是要怎么归并这些key-list。有两种方法:TAAT和DAAT。
Term-At-A-Time(TAAT):
TAAT查询时,每次只打开一个term对应的倒排表(list),然后对其进行完整的排序。每处理一个文档只能得到这个词对这篇文档的贡献,只有处理完所有term的倒排链后,才能获得文档的完整的得分。通常需要一个数组来保存文档的临时分数,这个数组的大小通常需要一个数组来保存文档的临时分数,大小与文档集规模相当,文档集很大时,额外的数组存储开销会变的非常大。
Document-At-A-Time(DAAT):
DAAT查询时,首先会打开各个term对应的倒排链。然后对这些倒排链进行遍历。每次对当前文档号最小的文档计算相关性得分。在处理下一篇文档之前,它会完整的计算出当前处理文档的最终相关性得分。只需使用较少空间来保存当前得分最高的文档及其得分,通常使用优先队列来存储。
数据量大的时候DAAT的方式进行查询归并,用的更多的是基于文档号递增排序的倒排索引结构。一般数据量大的时候,每个term对应的倒排链会很长,如果都遍历的话,性能不高,使用跳表解决。
跳表是简单而高效的数据结构,redis和leveldb都使用了跳表作为核心数据结构。是有序链,在原链表上设置了若干层的有序链表,每一层都比上一层的节点要少。如39,可通过红色路线查找到。比原链表路径要短,加快链表归并。
跳表论文:《Skip Lists: a Probabilistic Alternativeto Balanced Trees》
跳表优化只对AND有用,对OR不起作用。要满足OR查询可以用剪枝限界。
MaxScore和Weak-AND,通过计算每个term的贡献上限来估计文档的相关性上限,从而建立起一个阈值对倒排中的几个进行剪枝,提速。
知道一个term的相关性上界值,可以知道一个query和一个文档的相关性上限值,就是他们共同term的相关性上限值的和,然后和一个阈值(TOP-N的最小值)比较,小于则跳过。
细节参考论文《EfficientQuery Evaluation using a Two-Level Retrieval Process》
还有根据term的重要性,有时为了增加召回,可以去掉不重要的term。
索引的不同信息会被分在不同的库中,分布是词典库(term以及其在索引库的位置偏移,一般常驻内存),位置库(存放term的其他属性,根据数据规模决定存放磁盘还是内存),属性库(存放term的其他属性,词频,权重等等,也是根据数据规模决定存放磁盘还是内存),跳表库(存放跳表指针,一般常驻内存);
查库顺序:首先查词典库,根据位置偏移查找相关信息,对于磁盘的话,可能会用到别的数据结构(有序数组,B+树或者LSM树,为的是提高性能,因为磁盘I/O操作性能不高,减少I/O操作),一般的网页可能会分域,还需要很多的技术。
引擎评价指标
有NDCG、MAP、MRR、AB-testing
DCG:
基于两点假设
1.高相关性的文档比边缘相关的文档要有用的多。
2.一个相关文档的排序位置越靠后,对用户的价值越低。
作为衡量一篇文档的有用性或者增益,DCG方法的定义为:
是排序位置为i的文档的相关性等级(分为5等,非常差(1),差(2),一般(3),好(4),非常好(5))
便于平均不同查询的评价值,可以通过将每个排序位置上的DCG与该查询的最优排序的DCG值比较,得到一个归一化的值。
即为某一查询的理想的DCG值。
举例:一组6个文档的排序的相关性等级和理想等级分别为:
可以计算出它们对应的DCG值分别为:
那么
重要的步骤就是缓存cache,提高性能。
query log和点击数据进行各种挖掘工作,比如新词、扩展等,算是搜索引擎特有的优质资源。
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 for day):按天收费
CTR(click through rate):广告的点击率
CVR(click value rate):广告的转化率
RPM(revenue per mille):广告每千次展示的收入
广告一般分为:品牌广告和效果广告
品牌广告
是用来树立品牌形象,目的在于提升长期的离线转化率,不要求购买,希望当你需要该产品的时候可以想起这个品牌。
效果广告
分为:展示广告和搜索广告
展示广告
广告系统找到该网民与context上下文(网页等)满足相应投放设置的广告
做的最好的是实时竞价广告RTB(real-time bidding)
同一个广告位,不同的人看到不同的广告,更加精准
需要不同的参与方合作完成:
1.AD exchange(广告交易平台):服务的中心,相当于交易所的功能
2.DSP(demand side platform 需求方平台):供广告主使用的平台。广告主可以在这个平台设置受众目标,投放区域和标价等
3.SSP(sell side plateform 供应方平台):供应方使用的平台,供应方可以在SSP上提交他们的广告位
4.DMP(Date management platform,数据管理平台):面向各个平台的,主要用于数据管理、数据分析等
举例:
RTB的广告流程:
腾讯有个广告位进入到了某个SSP平台,而这个SSP平台把广告位的展示放在AD中,现有两个广告主,一个是卖体育用品的耐克,一个是卖汽车的宝马。耐克选择DSP1,
搜索广告
广告系统找到与用户输入的query(及网民)相关且满足投放设置的广告,设置如果某用户是体育爱好者,就出1块钱去竞拍这次的广告位,宝马选择DSP2平台,如果是汽车爱好者,出2块钱展示。用户浏览腾讯网是,AD告诉DSP1和DSP2.根据cookie,去DMP找这个cookie的数据,发现搜索过篮球,归为体育爱好者,然后DSP1告诉AD,有个耐克的客户,愿意出1块钱,DSP2去cookie中发现浏览过某个汽车网,归为汽车爱好者,告诉AD,有个宝马的客户,愿意出2块钱。
AD拿到DSP1和DSP2的出价数据后,发现DSP2出价高,竞拍成功。
广告交易平台(AD exchange模式),相比传统的广告网络,优点是更偏重于对用户的精准投放。
搜索广告整体框架
4大业务:
业务系统
广告主管理个人信息,管理广告,购买广告等操作,还要对用户的消费产生报表等
检索系统
完成整个广告的检索
计费统计系统
对用户的点击产生计费,记录一些其他的信息
反作弊系统
打击各种作弊行为,保护广告主的利益
搜索广告的检索系统
与搜索引擎类似
首先query解析,做些分词、query变换、意图分析等等
发给触发系统,帮助query找到最相关的广告,匹配有精确匹配,短语匹配,广泛匹配
精确匹配:一模一样
短语匹配:是query的一个子集
广泛匹配:短语匹配的进一步放松限制,在分词,倒序,同义替换,上下位替换上加了近义替换、相关词等操作。
排序模块:
对召回的广告排序,规则是,
就是拍卖词的出价,Q是广告质量。
pctr是预估的点击率。
找打用户越可能点击且出价高的广告
用的逻辑斯蒂回归。
ctr预估就是使用逻辑回归来计算的,一般用到3个特征:
query特征,用户特征和广告特征。每一维度特征都是很大的,ctr预估特征都是百亿甚至千亿级别的。
展示,触发计费系统。
扣钱采用广义的二阶价格(GSP),即:
6.5 推荐系统
推荐系统是给某个用户推荐了某件物品(在社交网络中物品也可以是人)。所以用户和物品就是推荐系统的两个关键。根据对这两个点的不同定位就会产生不同的算法。所有用户相同对待来处理(不考虑用户因素)?
还是按不同属性大致划分后再处理(将用户分类/聚类来处理)?
或是每个用户都不同对待来处理(完全的个性化)
对于物品也有类似这样的区分:不考虑物品的具体内容,对物品分类/聚类,完全区分物品
不像搜索系统有那么清晰的架构流程,
大致来说,分为:
基于协同过滤的推荐算法和基于内容的推荐算法,还有基于知识的推荐,就是根据用户的一些约束条等来匹配出待推荐的物品
基于协同过滤的推荐算法(Collaborative filtering,CF)
协同过滤是个典型的利用集体智慧的方法,思想很容易理解:如果某个用户和你的兴趣相似,那么他喜欢的物品很有可能是你喜欢的。
第一步就是要收集用户兴趣,然后根据用户兴趣计算相似用户或者物品,之后就可以推荐了。
产生两种协同过滤方法:基于用户的协同过滤(user-based CF)和基于物品的协同过滤(Item-based CF)
用户和物品的关系可以表示一个句子(表),每一行是用户对相应物品的打分。如何根据协同过滤计算出小明对Item5的打分,如果打分高,那么就可以把Item5推个小明了。
基于用户的协同过滤
根据用户记录,找到和目标用户相似的N个用户,然后根据这N个用户对目标物品的打分计算出目标用户对目标物品的预测打分,然后决定要不要推荐。
首先要计算用户之间的相似度,用户间的相似度用皮尔森相关系数效果好一点。计算完后,发现小明和其他四个用户的相似度了。小明与user1和user2最相似。接下来就是根据User1和User2对Item5 预测小明对Item5的打分,
是用户u对物品i的打分,
表示用户u和用户v的皮尔森相关系数,
表示用户v对物品i的打分,
表示用户的u的平均打分。
计算出小明对所有物品的打分预测值,然后把高的top-n推荐给小明就可以了。
基于物品的协同过滤
利用其它用户间物品相似度进而计算预测值。首先计算出与Item5最相近的物品,物品之间的相似度可以用余弦相似度表示,确定了相似度后,可以通过小明对所有Item5相似物品的加权评分综合来预测小明对Item5的预测值了,
两种方法的优缺点
基于用户的需要实时计算用户的相似度,计算量大且频繁,扩展性也不强。
基于物品的计算物品的相似度可以线下计算,减少线上的计算量,大型电子商务一般用这种方法。
当网站用户量和物品数量很多时,计算量还是很大的,为了降低计算量,提出slope One预测器
论文《Slope One Predictors for Online Rating-Based Collaborative Filtering》
协同过滤还有两个大问题:1.数据稀疏问题。用户一般只会评价少部分物品。所以居住就会非常稀疏,对精度有很大的影响。
2.冷启动问题,对于还未做过任何评分的用户或者从未被评分的物品就直接用协同过滤了
基于模型的协同过滤方法
使用奇异值分解对矩阵处理,同时可降维
参考论文《Application of Dimensionality Reduction in Recommender System -- A Case Study》
还有把预测某个用户对某个物品的评分看成分类问题(1-5),这样就可以使用贝叶斯等分类器来计算出该用户对某个物品的打分属于哪列。
关联规则,通过对用户记录学习出一组关联规则集合,然后就可以通过这些规则预测用户对物品打分了。
都是基于其他用户对某个用户的操作。没有考虑物品的基本内容是什么,而物品的内容有额很有信息量。
基于内容的推荐方法
淡化了用户,更多的从内容(物品特征属性的描述)的相似度决定是否推荐
分类/聚类方法
把推荐问题可以看出一个分类问题,根据用户对已有的内容的打分(一般用点击行为,也就是点击了是正例,否则是反例)训练了分类模型(lr),而聚类问题就是看和某物品聚到一起的其他问题的打分情况来决定对这个物品是否要推荐。
搜索方法
通过搜索要推荐的物品找出最相似的物品,然后推荐给用户。与搜索引擎的区别是搜索引擎提交的是query,而这儿提交的是物品,根据不同的场景(视频推荐,新闻推荐,APP推荐)会有不同的搜索条件和排序策略。搜索引擎的结果一定要精确,而这儿的推荐系统结果要发散一点,只要不是太差都可以接受。
参考论文google的一篇《Up Next: Retrieval Methods for Large Scale Related Video Suggestion》
总结
总的来说,就是先找出可能推荐的集合,然后排序推荐出来,还要注意多样性等一些策略,但是针对不同的场景(视频推荐,新闻推荐,APP推荐)设计不同的算法和策略
《App Recommendation: A Contest between Satisfaction and Temptation》
论文提出了APP推荐模型,比如手机上已经装了天气预测的APP,再推荐下载欲望非常低,但是对于电影问题就少一点,看了速度与激情1,给推荐速度与激情2,3,觉得还可以。
点击是重要的反馈指标,反映了用户的兴趣,推荐系统更多的是和场景相关,很难把一个场景的推荐算法完全照搬到别的场景上用。目的是能产生某种行为(点击、购买等),本质是预测能力。好的推荐系统就是最大化达到目的的预测器。