python实现textrank关键词提取

yipeiwu_com6年前Python基础

用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安装twisted的问题解析

python安装twisted的问题解析

今天在用pip安装wisted模块的时候没有任何的问题,但是当使用的时候发生了,无法导入win32api这个包,原因是因为python不能自己去使用系统的api。因此需要去安装pywin...

详解python列表生成式和列表生成式器区别

本文实例为大家分享了python(列表生成式/器)的具体代码,供大家参考,具体内容如下 一、列表生成式 #列表生成式是快速生成一个列表的一些公式 numbers = [] for...

处理python中多线程与多进程中的数据共享问题

之前在写多线程与多进程的时候,因为一般情况下都是各自完成各自的任务,各个子线程或者各个子进程之前并没有太多的联系,如果需要通信的话我会使用队列或者数据库来完成,但是最近我在写一些多线程与...

python画折线图的程序

python画折线图的程序

前做PPT要用到折线图,嫌弃EXCEL自带的看上去不好看,就用python写了一个画折线图的程序。 import matplotlib.pyplot as plt x=[1,2,3...

Python中使用__new__实现单例模式并解析

单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定。  在Python中常见的单例模式有None,这就是一个很典...