赞
踩
2021SC@SDUSC
2021SC@SDUSC
在上篇博文中,我们分析了类UndirectWeightedGraph中定义的最重要的用以计算权值的rank方法,至此,无向有权图的实现部分主要代码已经分析完毕,那么我们接下来继续分析textrank方法。
首先回顾一下textrank方法之前实现词的共现部分的代码,里面就涉及到了无向有权图和权值,即其实对第二步只有简短的一小部分,大部分都涉及到了第三部分——即无向有权图。
for i, wp in enumerate(words): #遍历cut之后的分词结果(i,wp),对其进行处理
if self.pairfilter(wp): #判断词wp是否符合代提取关键词的条件
#span是滑动窗口,在这里取的j是i词的下文,这里实现词的共现,即词之间的连接关系
for j in xrange(i + 1, i + self.span):
if j >= len(words): #判断词的范围是否在分词结果中
break
#判断i词的后向词j词是否也符合关键词的条件,不符合,则跳过
if not self.pairfilter(words[j]):
continue
#将i词和j词作为关键词,出现的次数作为值,添加到共现词典中
#即在第三步中,将两词作为无向有权图中一条边的两个节点,出现的次数作为权重计算的重要参数
if allowPOS and withFlag:
cm[(wp, words[j])] += 1
else:
cm[(wp.word, words[j].word)] += 1
我们接下来继续分析textrank方法的最后一小段——无向有权图。
#遍历共现词典 for terms, w in cm.items(): g.addEdge(terms[0], terms[1], w)#将共现词典中的数据(带权值边)加入到建立好的空的无向有权图 nodes_rank = g.rank() #rank方法,返回无向加权图中各词权值 #权值排序 if withWeight:#如果指定了权值的下限,则返回单词和权值列表,从大到小排序输出 tags = sorted(nodes_rank.items(), key=itemgetter(1), reverse=True) else:#返回单词和权值列表,从大到小排序输出 tags = sorted(nodes_rank, key=nodes_rank.__getitem__, reverse=True) if topK: #指定topK,输出前topK个关键词 return tags[:topK] else: #未指定,全部关键词按顺序输出 return tags extract_tags = textrank
首先还是一个简单的for循环,在上一个for循环中,我们建立了共现词典,这个循环则是遍历共现词典,将共现的词与出现的次数作为权值(带权值的边)添加到提前定义好的无向有权图中。
if结构则是将各词的权值根据指标值进行排序。
这里用到了sorted函数用于排序,sorted函数的主要用法如下:
sorted 可以对所有可迭代的对象进行排序操作,返回一个新的 list,而不是在原来的基础上进行的操作。
语法:sorted(iterable, cmp=None, key=None, reverse=False)
参数说明:
iterable – 可迭代对象。
cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
那么因为权值越高,关键词越重要,所以这里是降序排序
那么由sorted函数的用法我们可以看出,在if withWeight这里是在指定用来比较的元素(关键词权值的下限)后对所有词权值进行排序,else分支则是未指定,全部降序。
最后一部分if分支结构则是有没有指定关键词的数量,如果指定topK个,则输出前topK个降序排好关键词;如果未指定,全部按顺序输出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。