用python写了一个简单版本的textrank,实现提取关键词的功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
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()
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/y12345678904/article/details/77855936