PageRank算法与TextRank算法

PageRank

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

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

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]])

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

TextRank

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

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

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

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

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

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]])

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

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值