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第三步无向有权图部分。