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对小数进行除法运算的正确方法示例
Aug 25 Python
python中ConfigParse模块的用法
Sep 29 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
Python循环结构的应用场景详解
Jul 11 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
pycharm进入时每次都是insert模式的解决方式
Feb 05 Python
Python按顺序遍历并读取文件夹中文件
Apr 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递归列出所有文件和目录的代码
2008/09/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
Firefox div高度自适应
2009/04/28 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
jquery获取radio值实例
2014/10/16 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
学习python (2)
2006/10/31 Python
Python3基础之基本数据类型概述
2014/08/13 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
酒店led欢迎词
2014/01/09 职场文书
交通事故协议书
2014/04/15 职场文书
横幅标语大全
2014/06/17 职场文书
2014年领班工作总结
2014/11/25 职场文书
学校推普周活动总结
2015/05/07 职场文书
小学教师教学反思
2016/02/24 职场文书