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 相关文章推荐
利用matplotlib+numpy绘制多种绘图的方法实例
May 03 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Python3实现转换Image图片格式
Jun 21 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 Python
5行Python代码实现图像分割的步骤详解
May 25 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
python如何求圆的面积
Jul 01 Python
python+django+selenium搭建简易自动化测试
Aug 19 Python
Pycharm快捷键配置详细整理
Oct 13 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 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设计模式 Template (模板模式)
2011/06/26 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
关于php开启错误提示的总结
2019/09/24 PHP
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
python flask 多对多表查询功能
2017/06/25 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
python将txt文件读取为字典的示例
2018/12/22 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Django和Flask框架优缺点对比
2019/10/24 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
Java程序开发中如何应用线程
2016/03/03 面试题
师范生自我鉴定范文
2013/10/05 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
领导接待方案
2014/03/13 职场文书
建筑管理专业求职信
2014/07/28 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
医院感染管理制度
2015/08/05 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
Mysql事务索引知识汇总
2022/03/17 MySQL