PageRank,又称网页排名、谷歌左侧排名、PR,是Google公司所使用的对其搜索引擎搜索结果中的网页进行排名的一种算法。
佩奇排名本质上是一种以网页之间的超链接个数和质量作为主要因素粗略地分析网页的重要性的算法。其基本假设是:更重要的页面往往更多地被其他页面引用(或称其他页面中会更多地加入通向该页面的超链接)。 其将从A页面到B页面的链接解释为“A页面给B页面投票”,并根据投票来源(甚至来源的来源,即链接到A页面的页面)和投票对象的等级来决定被投票页面的等级。简单的说,一个高等级的页面可以提升其他低等级的页面。
该算法以谷歌公司创始人之一的拉里·佩奇(Larry Page)的名字來命名。谷歌搜索引擎用它来分析网页的相关性和重要性,
1.考虑如下结构
出链:链接出去的链接。
入链:链接进来的链接。
一个网页u的影响力=所有入链集合的页面的加权影响力之和:公式如下,L(v)可以理解为某个节点被分成几个出链,每份所占的比例
如图对于A,他有三条出链,分别指向B,C,D,也就是谁他把自己影响力分成了三分,每份是1/3,也就是第0列的四个值。其他几列亦是如此。
2.计算
假设 A,B,C,D四个节点的初始影响力为w0
这里示例一个A的计算结果,pr(A)=1/2*1/4+1/4=9/24
事实上这个过程在迭代一定次数后每个节点的pr值会趋于收敛
至于为什么会收敛,我是自己手动算了几次发现的规律。
3.上述只是一个简化版的模型,然而简化版的并不总是work
- Rank Leak(等级泄露)
- Rank Sink(等级沉没)
不是所有的节点都满足:既有出度,又有入度
上图的表述其实不是很准确,是所有的节点都会趋近于0,代码跑一下就知道了
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8a9ba2a357a466fb3c4593d9974cadc8.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/eb199c1884234ce734562d5ff6474825.png)
N就是页面总数,这里有ABCD四个页面,那就N=4,加入阻尼就是防止页面趋近于0,让他有一个初始值,便于比较
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3e781656e741cb23ca91fa3739350236.png)
还可以参考pagerank
代码演示
import numpy as np
a = np.array([[0, 1/2, 1, 0],
[1/3, 0, 0, 1/2],
[1/3, 0, 0, 1/2],
[1/3, 1/2, 0, 0]])
a_leak = np.array([[0, 0, 0, 1/2],
[0, 0, 0, 1/2],
[0, 1, 0, 0],
[0, 0, 1, 0]])
a_sink = np.array([[0, 0, 0, 0],
[1/2, 0, 0, 1],
[0, 1, 1, 0],
[1/2, 0, 0, 0]])
b = np.array([1/4, 1/4, 1/4, 1/4])
w = b
def work(a, w):
for i in range(100):
w = np.dot(a, w)
print(w)
def random_work(a, w, n):
d = 0.85
for i in range(100):
w = (1-d)/n + d*np.dot(a, w)
print(w)
work(a_leak, w)
#random_work(a, w, 4)
#random_work(a_leak, w, 4)
#random_work(a_sink, w, 4)
textRank
PageRank不仅仅是一个算法,而是一种思想:
- TextRank算法
- EdgeRank算法
- PersonalRank算法
一种用于文本的基于图的排序算法根据词之间的共现关系构造网络构造的网络中的边是无向有权边
textRank 可以生成文章的关键字(jieba.analyse.textrank(string, topK=20, withWeight=True, allowPOS=())
),但是, jieba中使用TF-IDF提取关键词
jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=())
效果好于TextRank,考虑了IDF的情况,而TextRank倾向使用频繁词
效率高于TextRank,TextRank基于图的计算和迭代较慢
但是textRank可以生成摘要
TextRank生成摘要的原理:
每个句子作为图中的节点
如果两个句子相似,则节点之间存在一条无向有权边
相似度=同时出现在两个句子中的单词的个数/句子中单词个数求对数之和
(分母使用对数可以降低长句在相似度计算上的优势)
可以参考下面的代码 然后debug进去学习代码以及原理
代码
from textrank4zh import TextRank4Keyword, TextRank4Sentence
text = '自己输入'
# 输出关键词,设置文本小写,窗口为2
tr4w = TextRank4Keyword()
tr4w.analyze(text=text, lower=True, window=2)
print('关键词:')
for item in tr4w.get_keywords(20, word_min_len=1):
print(item.word, item.weight)
# 输出重要的句子
tr4s = TextRank4Sentence()
tr4s.analyze(text=text, lower=True, source = 'all_filters')
print('摘要:')
# 重要性较高的三个句子
for item in tr4s.get_key_sentences(num=3):
# index是语句在文本中位置,weight表示权重
print(item.index, item.weight, item.sentence)