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抽象类的新写法
Jun 18 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
深入浅析python 协程与go协程的区别
May 09 Python
python pandas写入excel文件的方法示例
Jun 25 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
如何在Python对Excel进行读取
Jun 04 Python
python实现PDF中表格转化为Excel的方法
Jun 16 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
python中xlutils库用法浅析
Dec 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下使用curl模拟用户登陆的代码
2010/09/10 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
jQuery功能函数详解
2015/02/01 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
python实现哈希表
2014/02/07 Python
基python实现多线程网页爬虫
2015/09/06 Python
python动态网页批量爬取
2016/02/14 Python
Python中字符串的处理技巧分享
2016/09/17 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
社区党员干部承诺书
2015/05/04 职场文书
污染环境建议书
2015/09/14 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
CSS的calc函数用法小结
2022/06/25 HTML / CSS