四、搜索结果排序
至此,我们通过爬虫实现了信息获取、通过倒排索引实现了信息处理,接下来就是如何把这些信息展示给用户,其中最关键的是如何排序。
对电商而言,用户可以选择按照销量、信用、价格甚至综合排序,当然, 排序中也会穿插一些推广。
对通用的搜索引擎而言,比如:百度,没有销量、评分这些选项,主要根据网页与搜索关键词的相关性、网页质量等排序。
TF-IDF模型
如何确定网页与关键词的到底有多大的相关性?
如果一个网页中关键词的出现很多次的话,我们通常会认为这个网页与搜索的关键词更匹配,搜索结果应该更靠前。
我们用词频(Term Frequency, TF)表示关键词在一篇文章中出现的频率,代表网页和关键词的匹配程度。
比如:我们在百度等搜索引擎上搜索“产品经理的工作”,关键词为“产品经理”,“工作”,“的”作为停用词,不出现在关键词中。
在某一个网页上,总共有1000个词,其中“产品经理”出现了5次,“工作”出现了10次,“产品经理”的词频就是0.005,“工作”的词频就是0.01,两者相加,0.015就是这个网页和“产品经理的工作”的词频。
这里有一个问题,相较“产品经理”,“工作” 这个词用的更多,在所有的网页中出现的概率也很高。搜索者可能希望查找产品经理相关的信息,按照TF排序,一些出现很多次“工作”这个关键字的网站,就可能排在前面,比如:《程序员的工作》、《老板的工作》等等,逆文本频率 (Inverse Document Frequency,IDF)应运而生。
文件频率(Document Frequency)可以理解为关键词在所有网页中出现的频率,如果一个关键词在很多网页中都出现过,那么它的文件频率就很高。反之亦然,比如:“工作”的DF就高于“产品经理”。
文件频率越高,这个词就越通用,有效的信息就越少,重要性应该更低。于是,我们把文件频率取个倒数,就形成了逆文本频率。
二八定律在这里同样适用,20%的常用词占用了80%的篇幅,大多数关键词出现的频率都很低,这就造成了文件频率很小,而逆文本频率很大,不便于处理。于是我们取对数,便于计算(当然,这里也有其他数学和信息论上的考虑)。
把词频(TF)、逆文档频率 (IDF)相乘,就是大名鼎鼎的TF-IDF模型了。
一个关键词在一个网页中出现的频率越高,这个关键词越重要,排名越靠前;在所有网页中出现的频率越高,这个关键词告诉我们的信息越少,排名应该更靠后。
TF-IDF模型帮助我们解决了关键词与网页相关性的计算,仅仅使用TF-IDF模型,也可以搭建出效果不错的搜索引擎。
当然,商用搜索引擎在TF-IDF的基础上,进行的一定的改进,比如:出现在文章开头和结尾的关键词更加重要,会根据词出现的位置调整相关度。但还是基于TF-IDF模型的调整。
大名鼎鼎的PageRank
搜索结果排序,仅仅考虑相关性,搜索的结果并不是很好。总有某些网页来回地倒腾某些关键词,使自己的搜索排名靠前(当然,部分原因也来自某些搜索引擎更加喜欢推荐自家的东西,这个就不属于技术问题了)。
引入网页质量,可以解决这个问题。排序的时候,不仅仅考虑相关性,还要考虑网页质量的高低,把质量高的网页放在前面,质量低的放在后面。
那么,如何判断网页质量呢?
解决这个问题的是两位Google的创始人。搜索引擎诞生之初,还是美国斯坦福大学研究生的佩奇 (Larry Page) 和布林 (Sergey Brin) 开始了对网页排序问题的研究。
他们的借鉴了学术界评判学术论文重要性的通用方法,看论文的引用次数,引用的次数越高,论文的质量也就越高。他们想到网页的重要性也可以根据这种方法来评价。
佩奇和布林使用PageRank值表示每个网页的质量,其核心思想其实非常简单,只有两条:
- 如果一个网页有越多的链接指向它,说明这个网页质量越高,PageRank值越高,排名应该越靠前;
- 排名靠前的网页应该有更大的表决权,当一个网页被排名靠前的网页链接时,PageRank值也越高,排名也更靠前。
我们做一个类比:
- 有一个程序员,如果公司的人都夸他编程技术高,那么我们认为他编程技术高;
- 如果他被公司的CTO赏识,我们基本可以确定他的编程水平确实牛。
比如:下面这张图(专业术语叫做拓扑图),每一个节点都是一个网页,每条线都是两个网站之间的链接。
链接越多,说明网站质量越高,相应的PageRank值就越高。
这里有个问题:“当一个网页被排名靠前的网页链接时,其排名也应靠前”,一个网页的排名的过程需要用到排名的结果,这就变成了“先有鸡还是先有蛋”的问题了。
Google的两位创始人用数学解决了这个问题:
最开始的时候,假设搜索的网页具有相同的PageRank值;根据初始值,开始第一轮的计算,按照链接数量和每个网页的PageRank值重新计算每一个网页的PageRank值;按照上一轮的结果,按照链接数量和每个网页的PageRank值重新计算每一个网页的PageRank值……
这样计算下去,直至每个网页的PageRank值基本稳定。
你可能会好奇,这样要计算多少次?
佩奇在论文中指出:对网络中的3.22亿个链接进行递归计算,发现进行52次计算后可获得收敛稳定的PageRank值。
当然,PageRank实际运行起来比这个更加复杂,上亿个网页的PageRank值计算量非常大,一个服务器根本无法完成,需要多台服务器实现分布式计算了。为此,Google甚至开发出了并行计算工具MapReduce来实现PageRank的计算!
除了巨大的计算量,PageRank同样要面对作弊的问题。
开头我们谈到TF-DIF的弊端的时候讲到:总有某些网页来回地倒腾某些关键词,使自己的搜索排名靠前。
同样的,针对PageRank,也总有些网页来回地倒腾链接,使自己的搜索排名靠前。这就需要更多的算法,来识别这些“作弊”行为,我们在搜索引擎反作弊一节再来细讲。
其他排序方式
至此,使用TF-IDF计算网页与搜索内容的相关性,使用PageRank计算网页质量,可以很好地实现网页排序,一个基本的搜索引擎就搭建完成了。
商用搜索引擎在此基础上,还衍生了出其他的排名方式。
竞价排名:
比较著名的是百度推出的竞价排名(其实最开始做竞价排名的不是百度,但百度做得太“成功”,也至于大家都认为是百度发明了竞价排名),竞价排名按照按网站出价高低决定排名先后。
这种排名方式最大的优点是:可以帮助搜索引擎公司盈利。
最大的弊端是:无法保证出价高的网页的质量高,在医疗等特殊领域,有时甚至相反。
随着用户数据的积累,关键词和对应用户点击网页的行为数据也被搜索引擎记录下来了,搜索引擎可以根据用户的操作,不断改进自己的引擎。
时至今日,商用搜索引擎的底层技术都差不了太多,用户数据记录成为了竞争的关键因素,这也是百度得以在国内的搜索引擎市场独占鳌头的重要原因——用户越多,搜索越准确,搜索越准确,用户越多!
站内搜索:
百度、Google等通用搜索引擎要做很多工作,相比之下,站内搜索就简单很多——数据量少、也基本都是整理过的结构化数据,比如:豆瓣读书,搜索的时候直接检索自己的数据库就可以了。
虽然站内搜索的技术与通用搜索引擎有很多不一样的地方,但构建索引、相关性计算、质量计算、排序等流程基本一致。对于站内搜索的需求,同样存在开源的解决方案。
业界两个最流行的开源搜索引擎——Solr和ElasticSearch,它们运行速度快、效果好、可靠性高、可扩展,最关键的是免费,足以满足一般的商业需求。
对大多数公司而言,直接使用开源搜索引擎就可以了,不用重新造轮子,甚至,这些开源的解决方案比自己从头搭建的还更加稳定可靠。