python實(shí)現(xiàn)textrank關(guān)鍵詞提取
用python寫(xiě)了一個(gè)簡(jiǎn)單版本的textrank,實(shí)現(xiàn)提取關(guān)鍵詞的功能。
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 = {} #記錄節(jié)點(diǎn)的邊連接字典
self.iternum = iternum#迭代次數(shù)
#對(duì)句子進(jìn)行分詞
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)
#根據(jù)窗口,構(gòu)建每個(gè)節(jié)點(diǎn)的相鄰節(jié)點(diǎn),返回邊的集合
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
#根據(jù)邊的相連關(guān)系,構(gòu)建矩陣
def createMatrix(self):
self.matrix = np.zeros([len(set(self.word_list)), len(set(self.word_list))])
self.word_index = {}#記錄詞的index
self.index_dict = {}#記錄節(jié)點(diǎn)index對(duì)應(yīng)的詞
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
#根據(jù)textrank公式計(jì)算權(quán)重
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)
#輸出詞和相應(yīng)的權(quán)重
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)是從事程序開(kāi)發(fā)、維護(hù)的專(zhuān)業(yè)人員。一般將程序員分為程序設(shè)計(jì)人員和程序編碼人員,但兩者的界限并不非常清楚,特別是在中國(guó)。軟件從業(yè)人員分為初級(jí)程序員、高級(jí)程序員、系統(tǒng)分析員和項(xiàng)目經(jīng)理四大類(lèi)。'
tr = TextRank(s, 3, 0.85, 700)
tr.cutSentence()
tr.createNodes()
tr.createMatrix()
tr.calPR()
tr.printResult()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python中復(fù)數(shù)的共軛復(fù)數(shù)知識(shí)點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家整理的是關(guān)于python中復(fù)數(shù)的共軛復(fù)數(shù)知識(shí)點(diǎn)總結(jié),有需要的朋友們可以學(xué)習(xí)下。2020-12-12
Python標(biāo)準(zhǔn)庫(kù)之sqlite3使用實(shí)例
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)之sqlite3使用實(shí)例,本文講解了創(chuàng)建數(shù)據(jù)庫(kù)、插入數(shù)據(jù)、查詢(xún)數(shù)據(jù)、更新與刪除數(shù)據(jù)操作實(shí)例,需要的朋友可以參考下2014-11-11
python內(nèi)置數(shù)據(jù)類(lèi)型之列表操作
數(shù)據(jù)類(lèi)型是一種值的集合以及定義在這種值上的一組操作。這篇文章主要介紹了python內(nèi)置數(shù)據(jù)類(lèi)型之列表的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
Python利用py-redis實(shí)現(xiàn)分布式鎖
隨著業(yè)務(wù)的增長(zhǎng),后端技術(shù)架構(gòu)會(huì)慢慢的從單體服務(wù)轉(zhuǎn)向多服務(wù)或者微服務(wù)的分布式架構(gòu),本文主要為大家介紹了如何利用Py-Redis實(shí)現(xiàn)簡(jiǎn)單的分布式鎖,需要的可以參考一下2023-08-08
python 實(shí)現(xiàn)批量xls文件轉(zhuǎn)csv文件的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)批量xls文件轉(zhuǎn)csv文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
關(guān)于numpy.polyfit()與Stats.linregress()方法最小二乘近似擬合斜率對(duì)比
這篇文章主要介紹了關(guān)于numpy.polyfit()與Stats.linregress()方法最小二乘近似擬合斜率對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Python?超簡(jiǎn)潔且詳細(xì)爬取西瓜視頻案例
今天給大家?guī)?lái)一篇爬取西瓜視頻的小教程,很簡(jiǎn)單的幾十行代碼就可以實(shí)現(xiàn)了,每一段代碼都詳細(xì)說(shuō)明了用途,看完你就能夠自己動(dòng)手寫(xiě),感興趣的同學(xué)快來(lái)跟著小編往下看吧2021-11-11

