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 相关文章推荐
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Python常用模块之requests模块用法分析
May 15 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
python绘制BA无标度网络示例代码
Nov 21 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
简单了解Python读取大文件代码实例
Dec 18 Python
使用Tkinter制作信息提示框
Feb 18 Python
Python数据库封装实现代码示例解析
Sep 05 Python
Python爬取豆瓣数据实现过程解析
Oct 27 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中spl_autoload_register函数的用法总结
2013/11/07 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
php常用的url处理函数总结
2014/11/19 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
基于Vue实现可以拖拽的树形表格实例详解
2018/10/18 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
python中使用%与.format格式化文本方法解析
2017/12/27 Python
浅谈python之新式类
2018/08/12 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
python修改txt文件中的某一项方法
2018/12/29 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
深入解析神经网络从原理到实现
2019/07/26 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
法律专业自我鉴定
2013/10/03 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
设备管理实施方案
2014/05/31 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python