python实现textrank关键词提取
用python写了一个简单版本的textrank,实现提取关键词的功能。
importnumpyasnp
importjieba
importjieba.possegaspseg
classTextRank(object):
def__init__(self,sentence,window,alpha,iternum):
self.sentence=sentence
self.window=window
self.alpha=alpha
self.edge_dict={}#记录节点的边连接字典
self.iternum=iternum#迭代次数
#对句子进行分词
defcutSentence(self):
jieba.load_userdict('user_dict.txt')
tag_filter=['a','d','n','v']
seg_result=pseg.cut(self.sentence)
self.word_list=[s.wordforsinseg_resultifs.flagintag_filter]
print(self.word_list)
#根据窗口,构建每个节点的相邻节点,返回边的集合
defcreateNodes(self):
tmp_list=[]
word_list_len=len(self.word_list)
forindex,wordinenumerate(self.word_list):
ifwordnotinself.edge_dict.keys():
tmp_list.append(word)
tmp_set=set()
left=index-self.window+1#窗口左边界
right=index+self.window#窗口右边界
ifleft<0:left=0
ifright>=word_list_len:right=word_list_len
foriinrange(left,right):
ifi==index:
continue
tmp_set.add(self.word_list[i])
self.edge_dict[word]=tmp_set
#根据边的相连关系,构建矩阵
defcreateMatrix(self):
self.matrix=np.zeros([len(set(self.word_list)),len(set(self.word_list))])
self.word_index={}#记录词的index
self.index_dict={}#记录节点index对应的词
fori,vinenumerate(set(self.word_list)):
self.word_index[v]=i
self.index_dict[i]=v
forkeyinself.edge_dict.keys():
forwinself.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
#归一化
forjinrange(self.matrix.shape[1]):
sum=0
foriinrange(self.matrix.shape[0]):
sum+=self.matrix[i][j]
foriinrange(self.matrix.shape[0]):
self.matrix[i][j]/=sum
#根据textrank公式计算权重
defcalPR(self):
self.PR=np.ones([len(set(self.word_list)),1])
foriinrange(self.iternum):
self.PR=(1-self.alpha)+self.alpha*np.dot(self.matrix,self.PR)
#输出词和相应的权重
defprintResult(self):
word_pr={}
foriinrange(len(self.PR)):
word_pr[self.index_dict[i]]=self.PR[i][0]
res=sorted(word_pr.items(),key=lambdax: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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。