搜索与排名
服务器买便宜了,图片装不下了。。。
集体智慧编程和其他机器学习学习笔记->www.sunyuzhao.top
爬虫程序
建立索引
我们通过爬虫程序得到网站的信息之后,包括每一层的url信息和页面出现的单词,还包括链接上出现的单词等信息,这个时候我们就需要将这些信息存入数据库,并为它们建立索引。
本书中建立的索引如下
表wordlist保存了爬取到的单词的索引,表urllist保存了每个url的索引。表wordlocation保存了每个url对应页面上出现的wordid以及他们的location(出现在什么位置,比如 url1对应的页面,word1在文档的第30 59个字符的位置出现则对应 (url1,word1,30)(url1,word1,59)).另外两张表后面再谈。
查询
当我们需要搜索某些单词对应的网站时候,比如输入‘world global’则会先将搜索短语分割为单词,再在数据库中查找所有包含这两个单词的url,将结果返回给用户。这就是最最原始的搜索引擎。下面我们来提升一下这个引擎的效果。
基于内容的排名
如何在返回的大量网页中,找出真正和查询匹配的页面。这需要我们找到一种能够针对给定查询条件为网页进行评价的方法,并且在返回结果中将评价最高的排列在前面。
单词频度
最简单的思想,搜索的单词在网页中出现频率较高,则也有可能是我们要的页面。遗憾的是现实往往没这么简单。
文档位置
文档的主题有可能会出现在靠近文档的开始处,统计单词在文档中出现的位置信息,位置越往前的就越有可能是我们想要的结果。同样这也图样图森破。
单词距离
如果查询条件中有多个单词,则他们在文档中出现的位置应该很靠近。注意这里不是靠近,而是靠前。同样然并卵的一条规则。
以上规则,早期的搜索引擎的确就是这么干的。所以我们也需要用这几条规则来练练手,涉及有数据库,数据归一化以及程序设计的知识。书上的例子还是很不错的。只是我选择了cnn的网站作为实验对象,例子中的网站打不开。最重要的是体会到数据库还是很重要的,要好好学。
书中对单词距离判断那里过于简单了,直接在查询单词组中用相邻两个最近单词的距离来评价一个url,这很不科学,但作为例子而已,这点没必要太深究。
利用外部回指链接
以上是基于网页内容的评价度。现在我们提高一点逼格。通过考察外界就该网页所提供的信息–尤其是哪个页面链向了改网页,以及他们对该网页的评价,来进一步改善搜索结果。
简单计数
处理外部回指链接最为简单的做法,就是在每个网页上统计链接的数目,并将该链接总数所为针对网页的度量。回到刚才数据库关系图:
表link中保存了爬取到的资源中url的指向关系。比如url1的页面中有url2的链接,则(fromid:url1,toid:url2).
通过这个关系,我们可以在表中查询所有toid=指定url的记录,并计数。这个计数值就是这个url对应网页的评价度,再计算所有的url,并归一化,排个序就行。
PageRank算法
PageRank是有Google创始人发明的,并以发明者之一的Larry Page命名。现在基于这种变体已被所有大型搜索引擎采用。该算法认为网页的重要性是依据指向该网页的所有其他网页的重要性,以及这些网页中包含的链接数求得的。没错这个算法就是来评价网页重要性的。这个算法和其它算法(比如计入内容的算法加权求和得到的评价结果能改进引擎的效果)。
上图中,网页B,C和D均指向A,它们的PageRank值已经计算得出。B还指出另外三个网页,而C则指向其他四个网页,D只指向A。为了得到A的PageRank值,我们将指向A的每个网页的PageRank(pr)值除以这些网页中的链接总数,然后乘以阻尼因子0.85,再加上一个0.15的最小值。PR(A)的计算公式如下:
PageRank:
解决方法是,为所有PageRank都设置一个任意的初始值,然后反复计算,迭代若干次。在每次迭代中,每个网页的PageRank值将会越来越接近真实值。迭代所需要次数要视网络数量而定,不过对于目前正在处理的这一小组网页,20次就足够了。
利用链接文本
另一种对搜索结果进行排名的方法,是根据指向某一网页的链接文本来决定网页的相关程度。大多数时候,相比于被链接的网页自身所提供的信息而言,我们从指向该网页的链接中得到信息会更有价值。因为针对其所指的链接,网页上都会提供一些解释其内容的简短描述
以上代码用python3实现一遍: