当前位置:   article > 正文

PageRank算法与TextRank算法

PageRank算法与TextRank算法

PageRank

PageRank 是一种用于计算网页重要性的算法,其核心思想源自随机浏览模型。这个模型假设一个网络中的用户通过随机点击链接在网页之间跳转,并根据网页的链接结构计算每个网页的重要性。

假设三个网页按以下方式连接,计算每个网页的PR值。
PR公式:若A被B、C网页链接,则A的PR值为:B的PR值/B的链出总数,C的PR值/C的链出总数 ,再\sum求和
 

  1. import torch
  2. def compute_page_rank(tol=1e-6, max_iter=100):
  3. # 定义网页之间的连接关系矩阵
  4. adjacency_matrix = torch.tensor([[1, 1, 0],
  5. [0, 0, 1],
  6. [0, 0, 0]], dtype=torch.float32)
  7. # 计算每个网页的出链总数,并进行归一化
  8. out_link_counts = torch.sum(adjacency_matrix, dim=0, keepdim=True) # dim=0 按列计算出链总数
  9. normalized_adjacency_matrix = adjacency_matrix / out_link_counts
  10. normalized_adjacency_matrix[torch.isnan(normalized_adjacency_matrix)] = 0
  11. # 根据公式计算每个网页的 PageRank 值
  12. num_pages = adjacency_matrix.size(0)
  13. initial_page_rank = torch.tensor([[1.0 / num_pages]] * num_pages, dtype=torch.float32)
  14. page_rank = initial_page_rank
  15. damping_factor = 0.85
  16. # 开始迭代计算每个网页的 PageRank 值
  17. for _ in range(max_iter):
  18. new_page_rank = (1 - damping_factor) * initial_page_rank + damping_factor * (
  19. normalized_adjacency_matrix @ page_rank)
  20. # 检查是否收敛
  21. if torch.norm(new_page_rank - page_rank, p=1) < tol:
  22. print(_)
  23. break
  24. page_rank = new_page_rank
  25. # 打印最终的 PageRank 值
  26. print('最终的 PageRank 值--->', page_rank.reshape(1, -1))
  27. if __name__ == '__main__':
  28. compute_page_rank()

 2
最终的 PageRank 值---> tensor([[0.8575, 0.0925, 0.0500]])

 从结果得出,网页重要性A>B>C

TextRank

TextRank 是一种用于文本中的关键词提取和摘要生成的算法,灵感来自于 PageRank 算法。TextRank 通过图论的方法来评估词或句子的相对重要性。

生活如同一杯苦酒,不会苦一辈子,但会苦一阵子

分词结果:['生活', '一杯', '酒’, '苦', '一辈子', ‘但会’, '苦', '一阵子']

去重结果:['生活', '一杯', '酒', '苦', '一辈子', '但会', '一阵子'] 

TR公式:若词A与B、C共现,则A的PR值为:AB的共现值/B的链出总数,AC的共现值/C的链出总数 ,再\sum求和

  1. import torch
  2. import networkx as nx
  3. import matplotlib.pyplot as plt
  4. def compute_text_rank():
  5. # 构建词与其他词的共现矩阵
  6. co_occurrence_matrix = torch.tensor([[0, 1, 0, 0, 0, 0, 0],
  7. [1, 0, 1, 0, 0, 0, 0],
  8. [0, 1, 0, 1, 0, 0, 0],
  9. [0, 0, 1, 0, 1, 1, 1],
  10. [0, 0, 0, 1, 0, 1, 0],
  11. [0, 0, 0, 1, 1, 0, 0],
  12. [0, 0, 0, 1, 0, 0, 0]], dtype=torch.float32)
  13. # 计算每个词的链出总数,并对共现矩阵进行归一化处理
  14. outgoing_links_sum = torch.sum(co_occurrence_matrix, dim=0, keepdim=True)
  15. normalized_co_occurrence_matrix = co_occurrence_matrix / outgoing_links_sum
  16. # 绘制词之间的共现关系图
  17. graph = nx.from_numpy_array(normalized_co_occurrence_matrix.numpy())
  18. node_labels = {idx: word for idx, word in enumerate(['生活', '一杯', '酒', '苦', '一辈子', '但会', '一阵子'])}
  19. nx.draw_networkx(graph, labels=node_labels)
  20. plt.rcParams['font.sans-serif'] = ['SimHei']
  21. plt.show()
  22. # 每个词的初始 TextRank 值
  23. initial_text_rank = torch.tensor([[1/7],
  24. [1/7],
  25. [1/7],
  26. [1/7],
  27. [1/7],
  28. [1/7],
  29. [1/7]], dtype=torch.float32)
  30. # 阻尼系数
  31. damping_factor = 0.85
  32. # 迭代求解
  33. text_rank = initial_text_rank
  34. for _ in range(100):
  35. text_rank = (1 - damping_factor) * initial_text_rank + damping_factor * (normalized_co_occurrence_matrix @ text_rank)
  36. # 打印每个词的 TextRank 值
  37. print("每个词的 TextRank 值:", text_rank.reshape(1, -1))
  38. if __name__ == '__main__':
  39. compute_text_rank()


每个词的 TextRank 值: tensor([[0.0887, 0.1582, 0.1445, 0.2627, 0.1344, 0.1344, 0.0773]])

 基于结果,'一杯', '酒', '苦', '一辈子', '但会'适合做关键词

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/936597
推荐阅读
相关标签
  

闽ICP备14008679号