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实现简单HTML表格解析的方法
Jun 15 Python
将python代码和注释分离的方法
Apr 21 Python
Python实现聊天机器人的示例代码
Jul 09 Python
python实现趣味图片字符化
Apr 30 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
python之列表推导式的用法
Nov 29 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
Python实现ElGamal加密算法的示例代码
Jun 19 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
浅析Python中的套接字编程
Jun 22 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
第十节--抽象方法和抽象类
2006/11/16 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php实现简单爬虫的开发
2016/03/28 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
Python3开发环境搭建详细教程
2020/06/18 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
仓库主管岗位职责
2014/03/02 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
反腐倡廉观后感
2015/06/08 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书