网页排序算法PageRank和HITS的实现

实验目的及要求

实验目的

1.了解网页排序在搜索引擎的重要性

2.掌握网页排序算法PageRank和HITS的原理及过程

3.理解PageRank和HITS各自优缺点及异同

实验要求

1.实现基本PageRank网页排序算法和PageRank随机浏览模型的编码、调试和运行

2.实现HITS网页排序算法的编码、调试和运行。

实验提交内容

1.实验工程文件和可执行文件

2.实验报告

实验原理

1.PageRank:通过链接分析来衡量一个网站好坏,是一种在搜索引擎中根据网页之间相互的链接关系计算网络排名的技术。

2. HITS算法的目的即是通过一定的技术手段,在海量网页中找到与用户查询主题相关的高质量权威页面和枢纽页面,尤其是权威页面,因为这些页面代表了能够满足用户查询的高质量内容,搜索引擎以此作为搜索结果返回给用户。

实验环境(使用的软件)

Python 3.8

实验过程(实验步骤、记录、数据、分析)

一、基本PageRank网页排序算法

import numpy as np

from fractions import Fraction

np.set_printoptions(formatter={'all':lambda x: str(Fraction(x).limit_denominator())}) #格式化 保留分数,不至于精度丢失

H = 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]])  #根据有向图得出的转移矩阵

PR_0 = np.array([1/4,1/4,1/4,1/4]).reshape(4,1)  #初始PR

def PageRank(H,PR_0):    #定义一个迭代函数,直至MR=R时,输出R

    while(True):

        PR_1 = np.dot(H,PR_0)

        if((PR_1 == PR_0).any()):  #判断两个数组是否相等

            print(PR_1)

            break

        else:

            PR_0 = np.copy(PR_1)

PageRank(H,PR_0)

二、PageRank随机浏览模型

#PageRank随机浏览模型

class Graph():

    def __init__(self):

        self.node_map = {}#各个网络顶点的链接关系

        self.node_PR ={}#各个网络顶点的PR值

        self.node_num ={}#各个网络顶点的链接数

    #添加网页顶点

    def add_node(self, node_id):

        if node_id not in self.node_map:

            self.node_map[node_id] = set([])

            self.node_PR[node_id] = 0

            self.node_num[node_id] = 0

        else:

            print("这个顶点已经存在")


    #增加一个从node1指向node2的边。允许添加新顶点

    def add_link(self, node1, node2):

        if node1 not in self.node_map:

            self.add_node(node1)

        if node2 not in self.node_map:

            self.add_node(node2)

        self.node_map[node1].add(node2)#为node1添加一个出链,表示ndoe2引用了node1


    #计算各个网络顶点的链接数

    def get_num(self):

        for node in self.node_num:

            self.node_num[node] = len(self.node_map[node])


    #计算PR值

    def get_PR(self,d=0.85,iteration_num=10):

        self.get_num()

        for node in self.node_PR:#计算初始PR值

            self.node_PR[node]=1/len(self.node_map)

        for i in range(iteration_num):

            for node in self.node_PR:

                self.node_PR[node]=(1-d)+d*sum([self.node_PR[temp_node]/self.node_num[temp_node] for temp_node in self.node_map[node]])

        print(self.node_PR)

edges = [[1,2], [1,3], [1,4], [2,1], [2,4], [3,3], [4,3],[4,2]]#模拟的一个网页链接网络     

if __name__ == '__main__':

    graph = Graph()

    for edge in edges:

        graph.add_link(edge[0], edge[1])

graph.get_PR()

三、HITS算法

from math import sqrt

from pygraph.classes.digraph import digraph

import cmath

class HITSIterator:

    def __init__(self, dg):

        self.max_iterators = 100  # 最大迭代次数

        self.min_delta = 0.0001  # 判断是否迭代结束

        self.graph = dg

        self.hub = {}

        self.authority = {}

        for node in self.graph.nodes():

            self.hub[node] = 1

            self.authority[node] = 1

    def hits(self):

        """

        计算每个页面的Hub,Authority值

        """

        if not self.graph:

            return

        flag = False

        for i in range(self.max_iterators):

            change = 0.0  # 变化量

            norm = 0

            tmp = {}

            tmp = self.authority.copy()

            # 计算每个页面的authority值

            for node in self.graph.nodes():

                self.authority[node] = 0

                for incident_page in self.graph.incidents(node):  # 入射边

                    self.authority[node] += self.hub[incident_page]

                norm += pow(self.authority[node], 2)

            # 标准化

            norm = sqrt(norm)

            for node in self.graph.nodes():

                self.authority[node] /= norm

                change += abs(tmp[node] - self.authority[node])

            # 计算每个页面的Hub值

            norm = 0

            tmp = self.hub.copy()

            for node in self.graph.nodes():

                self.hub[node] = 0

                for neighbor_page in self.graph.neighbors(node):  # 出射边

                    self.hub[node] += self.authority[neighbor_page]

                norm += pow(self.hub[node], 2)

            # 标准化

            norm = sqrt(norm)

            for node in self.graph.nodes():

                self.hub[node] /= norm

                change += abs(tmp[node] - self.hub[node])

            if(change < self.min_delta):

                flag = True

                break

        if flag:

            print("总共进行了%s次迭代" % (i+1))

        else:

            print("总共进行了超过100次迭代")

        print("最好的Authority页面", max(self.authority.items(),key=lambda x: x[1]))

        print("最好的Hub页面", max(self.hub.items(),key=lambda x: x[1]))

if __name__ == '__main__':

    dg = digraph()

    dg.add_nodes(["A", "B", "C", "D", "E","F"])

    dg.add_edge(("A", "B"))

    dg.add_edge(("F", "D"))

    dg.add_edge(("C", "A"))

    dg.add_edge(("D", "A"))

    dg.add_edge(("F", "C"))

    dg.add_edge(("E", "C"))

    dg.add_edge(("E", "D"))

    dg.add_edge(("E", "F"))

    hits = HITSIterator(dg)

    hits.hits()

小结

通过本次学习,我还学习到了NumPy包的相关操作,学会了如何进行线性代数的运算。

我还学习到了python-graph-core包中digraph有向图的相关定义

另外我复习了python3中max函数的用法

————————————————

版权声明:本文为CSDN博主「PawnTz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_45791919/article/details/133281199

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容