简介

本文中的两种方法同样用于排名,可以直接加到排序函数中的weights中

PageRank算法

PageRank给每一个网页赋予了一个指示网页重要程度的评价值。网页的重要性是依据指向该网页的所有其他网页的重要性,以及这些网页中所包含的链接数求得的。

rank的参数python rank python_rank的参数python


若想得到A的PageRank值,需要将指向A的每个网页的PageRank值除以这些网页中的链接总数,然后乘以阻尼因子0.85

PR(A)=0.15+0.85*(PR(B)/links(B)+PR(C)/links(C)+PR(D)/links(D))
     =0.15+0.85*(0.5/4+0.7/5+0.2/1)
     =0.54525

但是,若想要知道某一网页的PageRank值,需要知道所有指向该网页的网页的PageRank值。解决的方法是为所有的PageRank都设置一个任意的初始值,然后反复计算,迭代若干次,在迭代期间,每个网页的PageRank值将会越来越接近真实值(收敛的原因?感觉:链接越多的网页PR越大,即重要性越大,经过一段时间的迭代后将稳定)
注意:
1.新建的pagerank表的字段为(url,score)
2.各url中的pagerank不会随搜索而发生变化,在调用一次calculatepagerank()后就固定
算法描述:
1.建立pagerank表,并插入字段(url,score)
2.初始化每一个url的score为1.0
3.开始迭代,对所有的url进行遍历
4.在link中查找所有指向该网页的网页(即toid相同,不同的fromid)
5.在pagerank中查找每一个fromid的score值,并在link中查找fromid一共指向多少个网页
6.利用公式进行计算,存入pagerank表中
7.返回评价值时需要进行归一化处理

#计算pagerank值,代表网页的重要性
    def calculatepagerank(self,iterations=20):
        #清除当前的PageRank表
        self.con.execute('drop table if exists pagerank')
        self.con.execute('create table pagerank(urlid primary key,score)')
        
        #初始化每个url,令其PageRank值为1
        #此语句为insert的一种用法,作用为选择urllist中(rowid,1.0)插入pagerank表中的(urlid,score)
        self.con.execute('insert into pagerank select rowid, 1.0 from urllist')
        self.dbcommit()
        
        for i in range(iterations):
            print("Iteration %d" %i)
            for (urlid,) in self.con.execute('select rowid from urllist'):
                pr=0.15
                
                #循环遍历指向当前网页的所有网页
                for (linker,) in self.con.execute('select distinct fromid from link where toid=%d' %urlid):
                    #得到链接源
                    linkingpr=self.con.execute('select score from pagerank where urlid=%d' %linker).fetchone()[0]
                    
                    #根据链接源,求得总的链接数
                    linkingcount=self.con.execute('select count(*) from link where fromid=%d' %linker).fetchone()[0]
                    pr+=0.85*(linkingpr/linkingcount)
                #将pr值存入该url对应的PageRank值中
                self.con.execute('update pagerank set score=%f where urlid=%d' %(pr,urlid))
            self.dbcommit()
    
    #对PageRank值进行评分并做归一化处理
    def pagerankscore(self,rows):
        pageranks=dict([(row[0],self.con.execute('select score from pagerank where urlid=%d' %row[0]).fetchone()[0]) for row in rows])
        #maxrank=max(pageranks.values())
        #normalizedscores=dict([(u,float(l)/maxrank) for (u,l) in pageranks.items()])
        #return normalizedscores
        return self.normalizescores(pageranks)

利用链接文本

此方法利用的是指向某一网页的所有网页,这些网页中提供的会比网页本身提供的信息更具有价值,也更让人信服,故我们在这些网页中进行搜索词的查找。
算法描述:
1.在link中查找符合搜索单词的fromid和toid(这里好像只要符合一个搜索单词就可)
2.找出一个toid所有fromid的pagerank值,求和
3.归一化

#利用链接文本 根据指向某一网页的链接文本来决定网页的相关程度
    #原理 一个网页如果拥有大量来自其他重要网页的链接指向,且这些网页又满足查询条件,则该网页会得到一个很高的评价
    def linktextscore(self,rows,wordids):
        linkscores=dict([(row[0],0) for row in rows])
        for wordid in wordids:
            #找出urllink中含有搜索词的,并在link表中查找fromid和toid
            cur=self.con.execute('select link.fromid,link.toid from linkwords,link where wordid=%d and linkwords.linkid=link.rowid' %wordid)
            for (fromid,toid) in cur:
                if toid in linkscores:
                    pr=self.con.execute('select score from pagerank where urlid=%d' %fromid).fetchone()[0]
                    linkscores[toid]+=pr
        return self.normalizescores(linkscores)