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爬虫爬取淘宝商品信息
Feb 23 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
python截取两个单词之间的内容方法
Dec 25 Python
Python3.4解释器用法简单示例
Mar 22 Python
Python配置虚拟环境图文步骤
May 20 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
使用python接受tgam的脑波数据实例
Apr 09 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
Python self用法详解
Nov 28 Python
python代码实现图书管理系统
Nov 30 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
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
php源码的安装方法和实例
2019/09/26 PHP
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
浅谈Python NLP入门教程
2017/12/25 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
如何查找网页漏洞
2016/06/22 面试题
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
恒华伟业笔试面试题
2015/02/26 面试题
体育教育个人自荐信范文
2013/12/01 职场文书
销售找工作求职信
2013/12/20 职场文书
证券期货行业个人的自我评价
2013/12/26 职场文书
表彰先进的通报
2014/01/31 职场文书
工地安全标语
2014/06/07 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
践行三严三实心得体会
2014/10/13 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
活动简报范文
2015/07/22 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
Nginx报404错误的详细解决方法
2022/07/23 Servers