python实现textrank关键词提取
作者:sparksnail 发布时间:2021-11-01 16:47:58
标签:python,textrank,关键词
用python写了一个简单版本的textrank,实现提取关键词的功能。
import numpy as np
import jieba
import jieba.posseg as pseg
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']
seg_result = pseg.cut(self.sentence)
self.word_list = [s.word for s in seg_result if s.flag in tag_filter]
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)
tmp_set = set()
left = index - self.window + 1#窗口左边界
right = index + self.window#窗口右边界
if left < 0: left = 0
if right >= word_list_len: right = word_list_len
for i in range(left, right):
if i == index:
continue
tmp_set.add(self.word_list[i])
self.edge_dict[word] = tmp_set
#根据边的相连关系,构建矩阵
def createMatrix(self):
self.matrix = np.zeros([len(set(self.word_list)), len(set(self.word_list))])
self.word_index = {}#记录词的index
self.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():
for w in self.edge_dict[key]:
self.matrix[self.word_index[key]][self.word_index[w]] = 1
self.matrix[self.word_index[w]][self.word_index[key]] = 1
#归一化
for j in range(self.matrix.shape[1]):
sum = 0
for 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])
for 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)):
word_pr[self.index_dict[i]] = self.PR[i][0]
res = sorted(word_pr.items(), key = lambda x : x[1], reverse=True)
print(res)
if __name__ == '__main__':
s = '程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。'
tr = TextRank(s, 3, 0.85, 700)
tr.cutSentence()
tr.createNodes()
tr.createMatrix()
tr.calPR()
tr.printResult()
来源:https://blog.csdn.net/y12345678904/article/details/77855936


猜你喜欢
- HTML 5基本思维概念形成于2003年,之后W3C对页面超文本应用技术工作小组(WHATWG)开发的HTML草图颇感兴趣,这个小组的开发人
- 本文实例讲述了python 实现的发送邮件模板。分享给大家供大家参考,具体如下:##发送普通txt文件(与发送html邮件不同的是邮件内容设
- pycharm创建sql文件及模板创建模板pycharm默认新建文件选项中没有sql文件,每次通过文件末尾添加.sql识别文件格式很麻烦。可
- 1.什么是接口接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接。为什
- Pandas之drop_duplicates:去除重复项方法DataFrame.drop_duplicates(subset=None, k
- IE下专属CSS:<![if !IE]><link rel="stylesheet" type=&qu
- Windows•安装lxml最好的安装方式是通过wheel文件来安装,http://www.lfd.uci.edu/~gohlke/pyth
- 前言有时候大家需要知道一个关键词在互联网上的热度,想知道某个关键词的热度变化趋势。大家可能就是使用百度指数、微信指数之类的。非常好用,但是就
- 大家都知道一些论坛的标题有高亮显示功能,在这里我不讨论也不研究论坛普遍的实现方法,下面是我的实现方法:实现思路:把要高亮显示的标题加上特定标
- 比如要访问b站在a站设置一个cookies,则可以这样做: 1.在b.com下建立一个文件cookies.htm 内容为: 代码如下:内容摘
- Python中的列表是简直可说是有容乃大,虽然看似类似C中的数组,但是Python列表可以接受任意的对象元素,比如,字符串,数字,布尔值,甚
- 目前lnmp一键安装包比较多的问题就是502 Bad Gateway,大部分情况下原因是在安装php前,脚本中某些lib包可能没有安装上,造
- 本文实例为大家分享了python版百度语音识别功能的具体代码,供大家参考,具体内容如下环境:使用的IDE是Pycharm1.新建工程2.配置
- 本文实例讲述了Python面向对象类的继承。分享给大家供大家参考,具体如下:一、概述面向对象编程 (OOP) 语言的一个主要功能就是“继承”
- 介绍在本文中,你将学习如何使用 Python 构建人脸识别系统。人脸识别比人脸检测更进一步。在人脸检测中,我们只检测人脸在图像中的位置,但在
- 目录前言:另一用法sort 与 sorted 区别:前言:加入我需要对如下几个文件按照从下到大排序,可是他的关键字有多个应该怎么办了?例如我
- python列表元素去重后如何保持原来的顺序不变原列表:list1 = [1,2,1,4,9,3,5,2,6,7,3,1,6,8,4,0]去
- 最近用python写了一个远程监控的程序,主要功能有:1.用邮件控制所以功能2.可以对屏幕截图,屏幕截图发送到邮箱3.可以用摄像头获取图片,
- function chinese2unicode(Str) &nbs
- 1. Redo日志的介绍Redo日志是物理日志,记录的是页面的变化。1.1 Redo日志的作用提升数据库写入效率保证数据库不丢数据,进行数据