当前位置:   article > 正文

jieba库中基于 TextRank 算法的关键词抽取——源代码分析(七)_jieba使用textrank

jieba使用textrank

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

我们接下来继续分析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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

首先还是一个简单的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个降序排好关键词;如果未指定,全部按顺序输出。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/281621
推荐阅读
相关标签
  

闽ICP备14008679号