python实现textrank关键词提取


Posted in Python onJune 22, 2018

用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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python操作列表的常用方法分享
Feb 13 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
Python中random模块用法实例分析
May 19 Python
Python递归遍历列表及输出的实现方法
May 19 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
redis之django-redis的简单缓存使用
Jun 07 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
pyqt5实现登录界面的模板
May 30 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
python Zmail模块简介与使用示例
Dec 19 Python
关于Python错误重试方法总结
Jan 03 Python
python实现自主查询实时天气
Jun 22 #Python
python实现定时提取实时日志程序
Jun 22 #Python
pandas 读取各种格式文件的方法
Jun 22 #Python
python使用turtle库绘制时钟
Mar 25 #Python
Python日期时间对象转换为字符串的实例
Jun 22 #Python
python pandas 对时间序列文件处理的实例
Jun 22 #Python
python使用turtle绘制分形树
Jun 22 #Python
You might like
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
PHP 断点续传实例详解
2017/11/11 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
微信小程序用canvas画图并分享
2020/03/09 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
在Python中移动目录结构的方法
2016/01/31 Python
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
Python反射用法实例简析
2017/12/22 Python
python多线程http压力测试脚本
2019/06/25 Python
Django框架安装方法图文详解
2019/11/04 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
springboot实现string转json json里面带数组
2022/06/16 Java/Android
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle