简介

本文中的两种方法同样用于排名,可以直接加到排序函数中的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 normalizedscoresreturn 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和toidcur=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]+=prreturn self.normalizescores(linkscores)

python算法应用(六)——搜索与排名2(PageRank算法及其拓展应用)相关推荐

  1. python数据结构与算法第六讲_Python 学习 -- 数据结构与算法 (六)

    栈 是一种 "操作受限"的线性表,只允许在一端插入和删除数据. 从功能是上来说,数组和链表确实可以替代栈,但是特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口 ...

  2. 【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数

    应用一 设计算法以求解无向图G的连通分量的个数 图示: 深度遍历基本算法dfs(v0)如下 : void dfs(int v0) { visite(v0); visited[v0]=TRUE;w=fi ...

  3. 全排列及相关扩展算法(六)——全排列最蛋疼的算法:邻位对换法

    1.引入原因:在此之前我们实现全排列本质上都是采用单向交换的思路,当交换到末端便要回溯至上一层面,如果我们采用双向的交换,便可以不断地交换下去,于是产生了邻位对换法.邻位对换法在找下一个排列的方法上在 ...

  4. 全排列邻位对换法c语言算法,全排列及相关扩展算法(六)——全排列最蛋疼的算法:邻位对换法...

    1.引入原因:在此之前我们实现全排列本质上都是采用单向交换的思路,当交换到末端便要回溯至上一层面,如果我们采用双向的交换,便可以不断地交换下去,于是产生了邻位对换法.邻位对换法在找下一个排列的方法上在 ...

  5. 扇区搜索机制的果蝇优化算法-附代码

    扇区搜索机制的果蝇优化算法 文章目录 扇区搜索机制的果蝇优化算法 1.果蝇优化法 2. 扇区搜索机制 2.1 扇区搜索机制分析及设计 2.2 再优化概念 2.3 SS-FOA算法 3.实验结果 4.参 ...

  6. PageRank算法(网页排名算法)初步理解

    背景:pageRank 是Google CEO 拉里佩奇提出的一种算法,来计算互联网里的网站的重要性,以对搜索进行排名. pagerank 基本思想: l 数量假设:一个页面越被其他页面链接,说明他越 ...

  7. 搜索中常见数据结构与算法探究(二)

    本文介绍了几个常见的匹配算法,通过算法过程和算法分析介绍了各个算法的优缺点和使用场景,并为后续的搜索文章做个铺垫:读者可以通过比较几种算法的差异,进一步了解匹配算法演进过程以及解决问题的场景:KMP算 ...

  8. 基于双层蚂蚁算法和区域优化的机器人导航新算法 翻译+总结

    改进的蚁群算法  1.初始路径的确定   2.光滑路径的优化 摘要 摘要提出了一种用于机器人自主导航的双层蚁群优化算法DL-ACO.该DL-ACO由两个独立和连续运行的蚁群算法组成.首先,我们提出了一 ...

  9. 【转】深入浅出PageRank算法

    原文链接 http://segmentfault.com/a/1190000000711128 PageRank算法 PageRank算法是谷歌曾经独步天下的"倚天剑",该算法由L ...

最新文章

  1. 使用神经网络生成抽象随机艺术
  2. 专为设计师而写的GitHub快速入门教程
  3. js的nextSibling,属性兼容IE和FF等浏览器
  4. 第四周实践项目5 猴子选大王(循环链表)
  5. 【Redis】详细基础命令 - 学习笔记
  6. vs2012 boost配置
  7. 【微服务学习】Polly:熔断降级组件
  8. IE8,9下的ajax缓存问题
  9. js ajax 异步上传图片,javascript实现图片伪异步上传
  10. 02-十六进制与二进制转换的快速记忆
  11. 波士顿大学大都会学院计算机硕士,【陈彩瑛】波士顿大学大都会学院商科专业介绍...
  12. 温度转换示例(有每一步代码的解释)
  13. 明星热图|童瑶、周迅、易烊千玺、张新成签约新品牌;李宇春、陈飞宇参加品牌活动...
  14. MAC剪切板神器 —— Paste
  15. 股票技术指标atr是什么含义_股票技术指标公式详解K线图分析
  16. 0110 - 给 iPhone 6 换了电池
  17. 常见的文件头识别和修复
  18. 被裁员?这是上帝为你开了一扇窗,你知道吗?
  19. 免安装Android Studio使用adb连接手机设备或模拟机进行真机调试
  20. 吉大400+计算机软件人工智能考研攻略

热门文章

  1. 刷新iframe页面
  2. python numpy修改数据维度
  3. python pip下载本地依赖包,并在离线环境中安装,并解决报错ERROR: Could not find a version that satisfies the requirement报错
  4. 解决pytorch CrossEntropyLoss报错RuntimeError: 1D target tensor expected, multi-target not supported
  5. python计算求导后的函数式与赋值计算
  6. vant在cell中加表格_Vant Cell 单元格
  7. python log模块_Python日志模块-logging
  8. java找不到数据库的表_GreenDao:no such table 找不到表的终极解决方案!
  9. vb子程序未定义怎么改怎么办_vb中子程序或者函数未定义!求教解决方案,
  10. Codeforces 446C. DZY Loves Fibonacci Numbers【斐波那契+线段树】