Java教程

jieba库中基于 TextRank 算法的关键词抽取——源代码分析(四)

本文主要是介绍jieba库中基于 TextRank 算法的关键词抽取——源代码分析(四),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

2021SC@SDUSC
2021SC@SDUSC
Text Rank第二步——以固定窗口大小,词之间的共现关系,构建图
在源代码分析(一)、(二)、(三)中主要针对TextRank算法中第一步——分词,进行分析。从本篇文章中开始继续分析textrank.py进行分析。

def textrank(self, sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'), withFlag=False):
        """
        Extract keywords from sentence using TextRank algorithm.
        Parameter:
            - topK: return how many top keywords. `None` for all possible words.
            - withWeight: if True, return a list of (word, weight);
                          if False, return a list of words.
            - allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v'].
                        if the POS of w is not in this list, it will be filtered.
            - withFlag: if True, return a list of pair(word, weight) like posseg.cut
                        if False, return a list of words
        """
        self.pos_filt = frozenset(allowPOS)	 #初始化关键字词性过滤条件
        g = UndirectWeightedGraph() #定义无向有权图
        cm = defaultdict(int) #定义共现词典
        words = tuple(self.tokenizer.cut(sentence))    #分词,使用cut方法

这些代码,尤其是分词部分,之前已经在文章中详细分析过,那么接着往下进行分析。

接下来是for循环,主要是对第一步分词得到的结果进行遍历处理,实现TextRank的第二步,词之间的共现,也就是词之间的连接,因为TextRank的算法中计算词rank需要基于上下文中词的rank。

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

这里主要是细节部分,首先在进行词的共现时,要先判断词是否符合关键词的提取条件,并且不仅i词,j词也要判断,因为TextRank中考虑的是关键词之间的联系,而不是与任意关键词之间的联系。

那么这就是TextRank实现过程中的第二步——实现词的共现的主要代码及分析,下篇文章我们会主要分析TextRank第三步无向有权图部分。

这篇关于jieba库中基于 TextRank 算法的关键词抽取——源代码分析(四)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!