【自然语言处理】TextRank 算法提取关键词(Python实现)

文章目录

  • 前言
  • PageRank 实现
  • TextRank 简单版源码实现
  • jieba工具包实现TextRank


前言

  TextRank 算法是一种基于图的排序算法,主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性,类似于 Google 的 PageRank 算法。TextRank 算法的关键思想是,一个词语在文本中的重要性可以通过与其他词语的关系来评估,而这些关系可以表示为图中的边。
  图构建(Graph Construction): 将文本中的词语或短语表示为图的节点,词语之间的关系可以是共现关系、语义相似度等。通常,可以使用共现矩阵或者基于词向量的相似度来构建图。
边权重计算(Edge Weighting): 计算图中边的权重,反映节点之间的关系强度。例如,可以使用共现词频、词向量相似度等作为边的权重。
  节点权重计算(Node Weighting): 利用图中节点之间的关系以及边的权重来计算节点的权重。通常采用迭代方法,类似于 PageRank 算法,根据节点之间的相互影响来计算节点的权重。
  排名(Ranking): 根据节点的权重对节点进行排名,排名较高的节点被认为是重要的词语或短语。
  TextRank 算法的节点得分更新公式:

PageRank 实现

初始化时,每个网页的重要性为 1。

我们可以用一个矩阵来表示图中 a、b、e、f 之间的入站和出站链接。

一行中的每个节点表示来自其他节点的入站链接。例如,对于 e 行,节点 a 和 b 具有指向节点 e 的出站链接。本演示文稿将简化更新权重的计算。

根据 1/|out(vi)|​,从函数中,我们应该规范化每一列。

我们使用这个矩阵乘以所有节点的权重。这只是一次没有阻尼系数 d 的迭代。 我们可以使用 Python 进行多次迭代。
import numpy as np
g = [[0, 0, 0, 0],[0, 0, 0, 0],[1, 0.5, 0, 0],[0, 0.5, 0, 0]]g = np.array(g)
pr = np.array([1, 1, 1, 1]) # initialization for a, b, e, f is 1
d = 0.85for iter in range(10):pr = 0.15 + 0.85 * np.dot(g, pr)print(iter)print(pr)
0
[0.15 0.15 1.425 0.575]
1
[0.15 0.15 0.34125 0.21375]
2
[0.15 0.15 0.34125 0.21375]
3
[0.15 0.15 0.34125 0.21375]
4
[0.15 0.15 0.34125 0.21375]
5
[0.15 0.15 0.34125 0.21375]
6
[0.15 0.15 0.34125 0.21375]
7
[0.15 0.15 0.34125 0.21375]
8
[0.15 0.15 0.34125 0.21375]
9
[0.15 0.15 0.34125 0.21375]
10
[0.15 0.15 0.34125 0.21375]

所以 e 的权重(PageRank值)为 0.34125。

如果我们把有向边变成无向边,我们就可以相应地改变矩阵。

规范化。

我们应该相应地更改代码。

import numpy as np
g = [[0, 0, 0.5, 0],[0, 0, 0.5, 1],[1, 0.5, 0, 0],[0, 0.5, 0, 0]]g = np.array(g)
pr = np.array([1, 1, 1, 1]) # initialization for a, b, e, f is 1
d = 0.85for iter in range(10):pr = 0.15 + 0.85 * np.dot(g, pr)print(iter)print(pr)
0
[0.575 1.425 1.425 0.575]
1
[0.755625 1.244375 1.244375 0.755625]
2
[0.67885937 1.32114062 1.32114062 0.67885937]
3
[0.71148477 1.28851523 1.28851523 0.71148477]
4
[0.69761897 1.30238103 1.30238103 0.69761897]
5
[0.70351194 1.29648806 1.29648806 0.70351194]
6
[0.70100743 1.29899257 1.29899257 0.70100743]
7
[0.70207184 1.29792816 1.29792816 0.70207184]
8
[0.70161947 1.29838053 1.29838053 0.70161947]
9
[0.70181173 1.29818827 1.29818827 0.70181173]

所以 e 的权重(PageRank值)为 1.29818827。

TextRank 简单版源码实现

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date  : 2025/2/06
#@email:1344732766@qq.comimport numpy as np
import jieba
import jieba.posseg as pseg #posseg是Python中的一个分词工具,它可以将文本切割成词语,并且为每个词语标注词性class TextRank(object):def __init__(self, sentence, window, alpha, iternum):self.sentence = sentence #文本self.window = window#窗口大小self.alpha = alpha#权重self.edge_dict = {}  # 记录节点的边连接字典self.iternum = iternum  # 迭代次数# 对句子进行分词def cutSentence(self):#jieba.load_userdict('user_dict.txt')#tag_filter = ['a', 'd', 'n', 'v'] #a形容词,d副词,n名称, v动词tag_filter = ['ns', 'n', 'vn', 'v']#地名、名词、动名词、动词seg_result = pseg.cut(self.sentence)self.word_list = [s.word for s in seg_result if s.flag in tag_filter and len(s.word)>1]#print(self.word_list)#['年度', '中国', '爱心', '城市', '公益活动', '新闻', '发布会'...]# 根据窗口,构建每个节点的相邻节点,返回边的集合def createNodes(self):tmp_list = []word_list_len = len(self.word_list)for index, word in enumerate(self.word_list):if word not in self.edge_dict.keys():tmp_list.append(word)#针对当前word取出左右边界词  word:{左边界词1,左边界词2...右边界词1,右边界词2}tmp_set = set()#当前word的left = index - self.window + 1  # 窗口左边界right = index + self.window  # 窗口右边界if left < 0: left = 0if right >= word_list_len: right = word_list_lenfor i in range(left, right):#左闭右开if i == index:continuetmp_set.add(self.word_list[i])self.edge_dict[word] = tmp_set #{word:{左边界词1,左边界词2...右边界词1,右边界词2}}# 根据边的相连关系,构建矩阵def createMatrix(self):#self.word_list=['年度', '中国', '爱心', '城市', '公益活动', '新闻', '发布会'...]self.matrix = np.zeros([len(set(self.word_list)), len(set(self.word_list))])self.word_index = {}  # 记录词的indexself.index_dict = {}  # 记录节点index对应的词for i, v in enumerate(set(self.word_list)):self.word_index[v] = i#{词:索引}self.index_dict[i] = v #{索引:词}for key in self.edge_dict.keys():#edge_dict {word:{左边界词1,左边界词2...右边界词1,右边界词2}|for w in self.edge_dict[key]:self.matrix[self.word_index[key]][self.word_index[w]] = 1self.matrix[self.word_index[w]][self.word_index[key]] = 1# 归一化for j in range(self.matrix.shape[1]):#列sum = 0for i in range(self.matrix.shape[0]):#行sum += self.matrix[i][j]#一列的和for i in range(self.matrix.shape[0]):self.matrix[i][j] /= sum# 根据textrank公式计算权重def calPR(self):self.PR = np.ones([len(set(self.word_list)), 1])#每个词语重要性初始化为1for i in range(self.iternum):self.PR = (1 - self.alpha) + self.alpha * np.dot(self.matrix, self.PR)#重要性迭代更新# 输出词和相应的权重def printResult(self):word_pr = {}for i in range(len(self.PR)):#self.index_dict[i] 得到位置索引i对应的词word_pr[self.index_dict[i]] = self.PR[i][0] #{词:重要性}res = sorted(word_pr.items(), key=lambda x: x[1], reverse=True)[:5]#前5个单词print(res)if __name__ == '__main__':text = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \'中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \'办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \'重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \'领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \'市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \'、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \'这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \'的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \'事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \'常委会主任陈健倩介绍了大会的筹备情况。'tr = TextRank(text, 3, 0.85, 600)tr.cutSentence()tr.createNodes()tr.createMatrix()tr.calPR()tr.printResult()

jieba工具包实现TextRank

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date  : 2025/2/06
#@email:1344732766@qq.comimport jieba
import jieba.posseg as psg
from jieba import analysedef textrank_extract(text, pos=False, keyword_num=5):textrank = analyse.textrankkeywords = textrank(text, allowPOS=('ns', 'n', 'vn', 'v'),topK=keyword_num,withWeight=False,)# 输出抽取出的关键词for keyword in keywords:print(keyword + "/ ", end='')print()
if __name__ == '__main__':text = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \'中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \'办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \'重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \'领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \'市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \'、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \'这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \'的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \'事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \'常委会主任陈健倩介绍了大会的筹备情况。'print('TextRank模型结果:')textrank_extract(text)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Desktop安装到其他盘

Docker Desktop 默认安装到c盘&#xff0c;占用空间太大了&#xff0c;想给安装到其他盘&#xff0c;网上找了半天的都不对 正确安装命令&#xff1a; start /w "" "Docker Desktop Installer.exe" install --installation-dirF:\docker命令执行成功&am…

feign 远程调用详解

在平常的开发工作中&#xff0c;我们经常需要跟其他系统交互&#xff0c;比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么&#xff0c;我们应该通过什么方式进行系统之间的交互呢&#xff1f;今天&#xff0c;简单来总结下 feign 的用法。 1&#xff1a;引入依…

Rust语言进阶之标准输入: stdin用法实例(一百零五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

modbus协议处理

//------------------------0x01-------------------------------- //MDA_usart_send: aa 55 01 00 06 00 02 00 05 //转modbusTCP——Master——send&#xff1a;地址00002&#xff0c;寄存器数量&#xff1a;00005 00 00 00 00 00 06 01 01 00 02 00 05 //ModbusTCP——Slave…

保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 四、部署可视化工具 1、创建挂载目录 2、运行Kafka-ui容器 3、Compose运行Kafka-ui容器 4、查看Kafka-ui运行状态 …

CPU的基本结构

基本结构 控制器&#xff08;Control Unit&#xff09;&#xff1a;负责控制&#xff0c;如指令计数器&#xff0c;指令跳转。 算术逻辑控制器&#xff08;Arithmetic/Logic Unit&#xff09;&#xff1a;负责计算&#xff0c;如算术运算加减&#xff0c;逻辑比较大小等。 南北…

集合类不安全问题

ArrayList不是线程安全类&#xff0c;在多线程同时写的情况下&#xff0c;会抛出java.util.ConcurrentModificationException异常 解决办法&#xff1a; 1.使用Vector&#xff08;ArrayList所有方法加synchronized&#xff0c;太重&#xff09; 2.使用Collections.synchronized…

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具04

SQLSERVER的ImpDp和ExpDp工具演示 1、指定某些表作为导出对象外 (-exclude_table) 验证用&#xff1a;导出的表&#xff0c;导入到新的数据库 2、指定某些表作为导出对象外 (-exclude_table) 支持模糊检索&#xff0c;可以使用星号 以s开头的表作为导出对象外&#xff0c;…

【大模型】基于LlamaIndex实现大模型RAG

文章目录 一、RAG基础二、使用大语言模型LLMs2.1 使用OpenAI大模型2.2 本地大模型 三、构建RAG pipeline3.1 加载数据3.1.1 SimpleDirectoryReader3.1.2 DatabaseReader3.1.3 直接创建文档Document 3.2 转换数据3.3 索引/嵌入 Indexing & Embedding3.4 存储3.5 查询3.6 评估…

你猜猜 攻防世界

你猜猜 打开附件&#xff1a; 504B03040A0001080000626D0A49F4B5091F1E0000001200000008000000666C61672E7478746C9F170D35D0A45826A03E161FB96870EDDFC7C89A11862F9199B4CD78E7504B01023F000A0001080000626D0A49F4B5091F1E0000001200000008002400000000000000200000000000000…

优惠券平台(一):基于责任链模式创建优惠券模板

前景概要 系统的主要实现是优惠券的相关业务&#xff0c;所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能&#xff0c;这里先通过模拟的形式代替。后续如果需要后管展示&#xff0c;会重构该代码 UserInfoDTO userInfoDTO new…

VsCode创建VUE项目

1. 首先安装Node.js和npm 通过网盘分享的文件&#xff1a;vsCode和Node&#xff08;本人电脑Win11安装&#xff09; 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装&#xff0c;点击下一步即可 …

数据结构--八大排序算法

1. 直接插入排序 当插入第 i(i>1) 个元素时&#xff0c;前面的 array[0],array[1],…,array[i-1] 已经排好序&#xff0c;此用 array[i] 的排序码与 array[i-1],array[i-2],… 的排序码顺序进行比较&#xff0c;找到插入位置即将 array[i] 插入&#xff0c;原来位置上的元素…

【C/C++算法】从浅到深学习---双指针算法(图文兼备 + 源码详解)

绪论&#xff1a;冲击蓝桥杯一起加油&#xff01;&#xff01; 每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是新开篇章也是算法的第一篇章----双指针算法&#xff0c;双指针算法是算法中非常…

Win本地安装Ollama+本地运行大模型+Cherrystudio使用

0. 前言 本文主要介绍 win 本地安装 Ollama &#xff0c;本地部署 Ollama 的 deepseek-r1:7b 大模型&#xff0c;使用具有界面画操作的工具 Cherrystudio进行操作。文章内容仅供参考。 1. Ollama简介 ‌ ‌Ollama 是一个开源的框架&#xff0c;旨在本地运行大型语言模型…

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…

【数据结构】(6) LinkedList 链表

一、什么是链表 1、链表与顺序表对比 不同点LinkedListArrayList物理存储上不连续连续随机访问效率O(N)O(1&#xff09;插入、删除效率O(1)O(N) 3、链表的分类 链表根据结构分类&#xff0c;可分为单向/双向、无头结点/有头节点、非循环/循环链表&#xff0c;这三组每组各取…

使用Pygame制作“俄罗斯方块”游戏

1. 前言 俄罗斯方块&#xff08;Tetris&#xff09; 是一款由方块下落、行消除等核心规则构成的经典益智游戏&#xff1a; 每次从屏幕顶部出现一个随机的方块&#xff08;由若干小方格组成&#xff09;&#xff0c;玩家可以左右移动或旋转该方块&#xff0c;让它合适地堆叠在…

(苍穹外卖)项目结构

苍穹外卖项目结构 后端工程基于 maven 进行项目构建&#xff0c;并且进行分模块开发。 1). 用 IDEA 打开初始工程&#xff0c;了解项目的整体结构&#xff1a; 对工程的每个模块作用说明&#xff1a; 序号名称说明1sky-take-outmaven父工程&#xff0c;统一管理依赖版本&…

【漫画机器学习】082.岭回归(或脊回归)中的α值(alpha in ridge regression)

岭回归&#xff08;Ridge Regression&#xff09;中的 α 值 岭回归&#xff08;Ridge Regression&#xff09;是一种 带有 L2​ 正则化 的线性回归方法&#xff0c;用于处理多重共线性&#xff08;Multicollinearity&#xff09;问题&#xff0c;提高模型的泛化能力。其中&am…