文本分词后进行关键词提取之TextRank算法

 TextRank是一种文本排序算法,它利用图模型来提取文章中的关键词,是由 Google 搜索的核心网页排序算法 PageRank改编而来。在介绍TextRank前,我们先简单介绍下什么是PageRank。另外,TextRank不仅能进行关键词提取,也能做自动文摘,这篇文章主要介绍它的关键词提取功能。

文章目录

        • 1、PageRank算法
        • 2、TextRank算法
        • 3、编程实例

1、PageRank算法

PageRank设计之初是用于Google的网页排名的,以该公司创办人拉里·佩奇(Larry Page)之姓来命名。Google用它来体现网页的相关性和重要性,在搜索引擎优化操作中是经常被用来评估网页优化的成效因素之一。
文本分词后进行关键词提取之TextRank算法_第1张图片
 PageRank通过互联网中的超链接关系来确定一个网页的排名,它将整个互联网可以看作是一张有向图,网页是图中的节点,网页之间的链接就是图中的边。根据重要性传递的思想,如果我们要计算网页A的PageRank值(以下简称PR值),那么我们需要知道有哪些网页链接到网页A,也就是要首先得到网页A的入链,然后通过入链给网页A的投票来计算网页A的PR值。这样设计可以保证达到这样一个效果:当某些高质量的网页指向网页A的时候,那么网页A的PR值会因为这些高质量的投票而变大,而网页A被较少网页指向或被一些PR值较低的网页指向的时候,A的PR值也不会很大,这样可以合理地反映一个网页的质量水平。构造完图后,根据以上思想,佩奇设计了下面的公式来计算网页i的重要性(PR值):
在这里插入图片描述

  • S(Vi)表示网页Vi的重要性得分,即网页Vi的PR值
  • d表示阻尼系数,一般取0.85
  • Vi表示某个网页
  • In(Vi)表示链接到网页Vi的网页集合
  • Vj表示链接到Vi的网页
  • Out(Vj)表示网页 j 中的链接指向的网页的集合
  • |Out(Vj)| 是集合中元素的个数

 PageRank需要使用上面的公式多次迭代才能得到结果。初始时,可以设置每个网页的重要性为1,上面公式等号左边计算的结果是迭代后网页i的PR值,等号右边用到的PR值全是迭代前的,当S(V)的变化量小于阈值(0.0001)时停止迭代。

2、TextRank算法

 进行关键词提取时,TextRank算法思想和PageRank算法类似,不同的是,TextRank在构建图的时候将节点由网页改成了句子或是词,以共现关系建立起节点之间的链接,并为节点之间的边引入了权值,其中权值表示两个句子的相似程度,本质上构建的是一个带权无向图。需要强调的是,PageRank中是有向边,而TextRank中是无向边,或者说是双向边。
文本分词后进行关键词提取之TextRank算法_第2张图片
 什么是共现关系呢?将文本进行分词,去除停用词或词性筛选等之后,设定窗口长度为K,即最多只能出现K个词,进行窗口滑动,在窗口中共同出现的词之间即可建立起无向边。

基本思想:

  • 将待抽取关键词的文本进行分词
  • 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
  • 计算图中节点的PageRank,注意是无向带权图

基本公式:
在这里插入图片描述
 可以看出,该公式仅仅比PageRank多了一个权重项Wji,用来表示两个词(句子)之间的边连接有不同的重要程度,即两个词 Si和 Sj的相似度分数。计算图中各词的得分时,同样需要给图中的词指定任意的初值,通常都设为1。然后递归计算直到收敛。

基本步骤:

  1. 把给定的文本T按照完整句子进行分割;
  2. 对于每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词等。这些词形成候选关键词;
  3. 构建候选关键词图G = (V,E),其中V为节点集,由(2)生成的候选关键词组成,然后采用共现关系构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现;
  4. 根据PageRank原理中的衡量重要性的公式,初始化各节点的权重,然后迭代计算各节点的权重,直至收敛;
  5. 对节点权重进行倒序排序,从而得到最重要的T个单词,作为候选关键词;
  6. 由(5)得到最重要的T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词。例如,文本中有句子“Matlab code for plotting ambiguity function”,如果“Matlab”和“code”均属于候选关键词,则组合成“Matlab code”加入关键词序列。
3、编程实例
import jieba
from jieba.analyse import *

def stopwordslist(filepath):    # 定义函数创建停用词列表
    stopword = [line.strip

你可能感兴趣的:(python,自然语言处理)