简介
本文中的两种方法同样用于排名,可以直接加到排序函数中的weights中
PageRank算法
PageRank给每一个网页赋予了一个指示网页重要程度的评价值。网页的重要性是依据指向该网页的所有其他网页的重要性,以及这些网页中所包含的链接数求得的。
若想得到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)