算法:TextRank算法

伪码:

  1. 定义函数TextRank(text):
  2. 将文本text进行分词,去除停用词,得到词列表words
  3. 构建词图,将每个词作为节点,词与词之间的共现作为边,得到图G
  4. 初始化节点权重,将每个节点的权重设置为1
  5. 迭代计算节点权重,重复执行以下步骤n次或直到收敛:
    1. 对于每个节点i,计算其新的权重score_i: score_i = (1 - d) + d * sum(w_ij * score_j / sum(w_j)),其中d为阻尼系数(一般取0.85),w_ij为节点i和节点j之间的边的权重,sum(w_j)为节点j的所有出边的权重之和
    2. 对于每个节点i,更新其权重为新的权重score_i
  6. 对节点权重进行排序,得到关键词列表topK
  7. 返回topK作为文本的摘要

源码:

  1. 导入所需的库
import jieba
import jieba.analyse
import numpy as np
  1. 定义函数TextRank
def TextRank(text, topK=5, withWeight=False):
    # 分词
    words = [w for w in jieba.cut(text) if w not in stop_words]
    # 构建词图
    graph = np.zeros((len(words), len(words)))
    for i, word1 in enumerate(words):
        for j, word2 in enumerate(words):
            if i != j:
                graph[i][j] = graph[j][i] = words.count(word1 + word2)
    # 初始化节点权重
    weights = np.ones(len(words))
    # 迭代计算节点权重
    d = 0.85
    for _ in range(10):
        for i, _ in enumerate(words):
            weights[i] = (1 - d) + d * sum([graph[i][j] / sum(graph[j]) * weights[j] for j in range(len(words))])
    # 排序并返回topK
    if withWeight:
        return [(words[i], weights[i]) for i in weights.argsort()[::-1][:topK]]
    else:
        return [words[i] for i in weights.argsort()[::-1][:topK]]
  1. 调用TextRank函数
text = "这是一段文本,包含一些关键词。这些关键词可以用来生成摘要。"
stop_words = []  # 停用词表,可自行添加
keywords = TextRank(text, topK=5)
print(keywords)
提取文字摘要写出算法的伪码和源码

原文地址: https://www.cveoy.top/t/topic/bYQt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录