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实现百度关键词排名查询
Mar 30 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
Atom的python插件和常用插件说明
Jul 08 Python
Python使用字典的嵌套功能详解
Feb 27 Python
Python datetime包函数简单介绍
Aug 28 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 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使用smarty模板引擎的方法
2014/07/01 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
jQuery 创建Dom元素
2010/05/07 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
深入理解Promise.all
2018/08/08 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
python编辑用户登入界面的实现代码
2018/07/16 Python
Python input函数使用实例解析
2019/11/22 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
医药专业应届毕业生求职信范文
2014/01/01 职场文书
护士毕业生自荐信
2014/02/07 职场文书
学位证书委托书
2014/09/30 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB
SQL Server Agent 服务无法启动
2022/04/20 SQL Server