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绘制人人网好友关系图示例
Apr 01 Python
从零学Python之入门(五)缩进和选择
May 27 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
Python的socket模块源码中的一些实现要点分析
Jun 06 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
Python标准库shutil用法实例详解
Aug 13 Python
python一键去抖音视频水印工具
Sep 14 Python
简单了解python协程的相关知识
Aug 31 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
Python使用jpype模块调用jar包过程解析
Jul 29 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
在同一窗体中使用PHP来处理多个提交任务
2006/10/09 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
js 日期转换成中文格式的函数
2009/07/07 Javascript
jQuery 技巧小结
2010/04/02 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
Python Tkinter GUI编程入门介绍
2015/03/10 Python
介绍Python中内置的itertools模块
2015/04/29 Python
django实现前后台交互实例
2017/08/07 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
python cookie反爬处理的实现
2020/11/01 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
Java的类与C++的类有什么不同
2014/01/18 面试题
电子商务专业实习生自我鉴定
2013/09/24 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
党员批评与自我批评
2014/10/15 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书