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中as用法实例分析
Apr 30 Python
python3中set(集合)的语法总结分享
Mar 24 Python
浅谈python 线程池threadpool之实现
Nov 17 Python
Python实现调度算法代码详解
Dec 01 Python
python3.x实现发送邮件功能
May 22 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
Pycharm修改python路径过程图解
May 22 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
php学习 函数 课件
2008/06/15 PHP
php集成环境xampp中apache无法启动问题解决方案
2014/11/18 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
使用python生成目录树
2018/03/29 Python
python实现自动发送报警监控邮件
2018/06/21 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
高中毕业的自我鉴定
2013/12/09 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
社区服务活动小结
2014/07/08 职场文书
前台岗位职责
2015/02/13 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS