赞
踩
PageRank 是一种用于计算网页重要性的算法,其核心思想源自随机浏览模型。这个模型假设一个网络中的用户通过随机点击链接在网页之间跳转,并根据网页的链接结构计算每个网页的重要性。
假设三个网页按以下方式连接,计算每个网页的PR值。
PR公式:若A被B、C网页链接,则A的PR值为:B的PR值/B的链出总数,C的PR值/C的链出总数 ,再求和
- import torch
-
-
- def compute_page_rank(tol=1e-6, max_iter=100):
- # 定义网页之间的连接关系矩阵
- adjacency_matrix = torch.tensor([[1, 1, 0],
- [0, 0, 1],
- [0, 0, 0]], dtype=torch.float32)
-
- # 计算每个网页的出链总数,并进行归一化
- out_link_counts = torch.sum(adjacency_matrix, dim=0, keepdim=True) # dim=0 按列计算出链总数
- normalized_adjacency_matrix = adjacency_matrix / out_link_counts
- normalized_adjacency_matrix[torch.isnan(normalized_adjacency_matrix)] = 0
-
- # 根据公式计算每个网页的 PageRank 值
- num_pages = adjacency_matrix.size(0)
- initial_page_rank = torch.tensor([[1.0 / num_pages]] * num_pages, dtype=torch.float32)
- page_rank = initial_page_rank
-
- damping_factor = 0.85
-
- # 开始迭代计算每个网页的 PageRank 值
- for _ in range(max_iter):
- new_page_rank = (1 - damping_factor) * initial_page_rank + damping_factor * (
- normalized_adjacency_matrix @ page_rank)
-
- # 检查是否收敛
- if torch.norm(new_page_rank - page_rank, p=1) < tol:
- print(_)
- break
-
- page_rank = new_page_rank
- # 打印最终的 PageRank 值
- print('最终的 PageRank 值--->', page_rank.reshape(1, -1))
-
-
- if __name__ == '__main__':
- compute_page_rank()
2
最终的 PageRank 值---> tensor([[0.8575, 0.0925, 0.0500]])
从结果得出,网页重要性
TextRank 是一种用于文本中的关键词提取和摘要生成的算法,灵感来自于 PageRank 算法。TextRank 通过图论的方法来评估词或句子的相对重要性。
生活如同一杯苦酒,不会苦一辈子,但会苦一阵子
分词结果:['生活', '一杯', '酒’, '苦', '一辈子', ‘但会’, '苦', '一阵子']
去重结果:['生活', '一杯', '酒', '苦', '一辈子', '但会', '一阵子']
TR公式:若词A与B、C共现,则A的PR值为:AB的共现值/B的链出总数,AC的共现值/C的链出总数 ,再求和
- import torch
- import networkx as nx
- import matplotlib.pyplot as plt
-
-
- def compute_text_rank():
-
- # 构建词与其他词的共现矩阵
- co_occurrence_matrix = torch.tensor([[0, 1, 0, 0, 0, 0, 0],
- [1, 0, 1, 0, 0, 0, 0],
- [0, 1, 0, 1, 0, 0, 0],
- [0, 0, 1, 0, 1, 1, 1],
- [0, 0, 0, 1, 0, 1, 0],
- [0, 0, 0, 1, 1, 0, 0],
- [0, 0, 0, 1, 0, 0, 0]], dtype=torch.float32)
-
- # 计算每个词的链出总数,并对共现矩阵进行归一化处理
- outgoing_links_sum = torch.sum(co_occurrence_matrix, dim=0, keepdim=True)
- normalized_co_occurrence_matrix = co_occurrence_matrix / outgoing_links_sum
-
- # 绘制词之间的共现关系图
- graph = nx.from_numpy_array(normalized_co_occurrence_matrix.numpy())
- node_labels = {idx: word for idx, word in enumerate(['生活', '一杯', '酒', '苦', '一辈子', '但会', '一阵子'])}
- nx.draw_networkx(graph, labels=node_labels)
- plt.rcParams['font.sans-serif'] = ['SimHei']
- plt.show()
-
- # 每个词的初始 TextRank 值
- initial_text_rank = torch.tensor([[1/7],
- [1/7],
- [1/7],
- [1/7],
- [1/7],
- [1/7],
- [1/7]], dtype=torch.float32)
-
- # 阻尼系数
- damping_factor = 0.85
-
- # 迭代求解
- text_rank = initial_text_rank
- for _ in range(100):
- text_rank = (1 - damping_factor) * initial_text_rank + damping_factor * (normalized_co_occurrence_matrix @ text_rank)
-
- # 打印每个词的 TextRank 值
- print("每个词的 TextRank 值:", text_rank.reshape(1, -1))
-
-
- if __name__ == '__main__':
- compute_text_rank()
每个词的 TextRank 值: tensor([[0.0887, 0.1582, 0.1445, 0.2627, 0.1344, 0.1344, 0.0773]])
基于结果,'一杯', '酒', '苦', '一辈子', '但会'适合做关键词
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。