TextRank算法

是一种文本排序算法,由谷歌网页重要性排序算法PageRank算法改进而来,能够从给定文本中提取关键词/关键词组,并使用抽取式的自动文摘方法提取关键句.

1. TextRank算法原理

1.1 PageRank介绍

该算法由PageRank迁移而来,PageRank算法根据万维网上页面之间的链接关系计算页面重要性;TextRank算法将词视为”万维网上的节点”,根据词之间的共现关系计算每个词的重要性,并将PageRank中的有向边变为无向边.

对于搜索引擎而言,最初靠人对网页分类筛选高质量网站,之后采用文本检索的方式,现在被PageRank算法替代,核心思想如下:

  • 如果一个网页被很多其他网页链接,这个网页比较重要;
  • 如果一个比较重要的网页链接到一个其他网页,那么被链接到的网页因此而重要

下面的两幅图中,将重要性记为PR,那么由以下等式:

11
12
13

可以看出,上边的图中,A的重要性是BCD的和;下边的图中,由于存在BCD的链接,所A的重要性为B/2+C+D/3.

对于任意网页i,PR可以表示如下:

14

以上是简单模型,但并不适用于只出不如或者环回的情况,所以考虑更普遍的模型—-随机浏览模型.

随机浏览模型的假设是这样的:假定一个网页浏览者从一个随机页面开始浏览,浏览者不断点击当前网页的链接开始下一次浏览。但是,浏览者会逐渐厌倦并开始随机浏览网页。随机浏览的方式更符合用户的真实浏览行为,避免了上述情况的发生,由此产生了随机浏览模型,随机浏览模型中每个网页的PR值通过以下公式计算:

15

这样,一个网页的重要性由相互链接的其它网页决定,满足马尔科夫链性质,那么通过迭代可以得到所有网页的PR值,经过重复计算这些值会趋于稳定.

1.2 TextRank介绍

二者的思想有相通之处,区别在于:PageRank算法根据网页之间的链接关系构造网络,而TextRank算法根据词之间的共现关系构造网络. 不同之处在于PageRank算法构造网络中的边是有向无权边,而TextRank算法构造网络中的边是无向有权边.核心公式如下其中wji表示两个节点之间的边连接具有不同的重要程度.

16

关键词和关键词组的步骤:

  1. 对文本按照整句进行分割;
  2. 对每个句子进行分词和词性标注,剔除停用词,保留指定词性的词;
  3. 构建词图,采用共现关系构造任意两个节点之间的边;两个节点之间存在的边仅当他们对应的词在长度为K的窗口中共现时存在,K表示窗口大小,即最多共现K个单词,一般K取2.
  4. 根据公式,迭代计算各节点权重,直至收敛;
  5. 排序,取top作为关键词
  6. 对于得到的关键词,在原始文本中进行标记,如果形成了相邻词组,则为关键词.

关键句的步骤:

  1. 同时出现两个句子中同一个词的数量除以句子中词的个数求对数和;
  2. 设置阈值去掉相似度较低的连接,构建节点连接图,然后迭代计算Textrank值,排序后选出分值最高的几个句子.

2. TextRank源码解读

textrank4zh模块是针对中文文本的TextRank算法的python实现,源码解读如下:

util.py #工具包,算法核心
Segmentation.py #分词和分句的类
TextRank4Keyword.py #提取关键词和关键词组的类
TextRank4Sentence.py #提取关键句的类

3. textrank4zh模块使用


安装:
pip install textrank4zh

使用:
1)提取关键词/关键短语和关键句
```python
#-*-coding:utf-8-*-
"""
@author:taoshouzheng
@time:2018/5/18 8:20
@email:[email protected]
"""
# 导入系统模块
import sys
# imp模块提供了一个可以实现import语句的接口
from imp import reload
 
# 异常处理
try:
	# reload方法用于对已经加载的模块进行重新加载,一般用于原模块有变化的情况
	reload(sys)
	# 设置系统的默认编码方式,仅本次有效,因为setdefaultencoding函数在被系统调用后即被删除
	sys.setdefaultencoding('utf-8')
except:
	pass
 
"""
展示textrank4zh模块的主要功能:
提取关键词
提取关键短语(关键词组)
提取摘要(关键句)
"""

# 导入编码转换模块
import codecs
# 从textrank4zh模块中导入提取关键词和生成摘要的类
from textrank4zh import TextRank4Keyword, TextRank4Sentence
 
# 待读取的文本文件,一则新闻
file = r'C:\Users\Tao Shouzheng\Desktop\01.txt'
# 打开并读取文本文件
text = codecs.open(file, 'r', 'utf-8').read()
 
# 创建分词类的实例
tr4w = TextRank4Keyword()
# 对文本进行分析,设定窗口大小为2,并将英文单词小写
tr4w.analyze(text=text, lower=True, window=2)
 
"""输出"""
print('关键词为:')
# 从关键词列表中获取前20个关键词
for item in tr4w.get_keywords(num=20, word_min_len=1):
	# 打印每个关键词的内容及关键词的权重
	print(item.word, item.weight)
print('\n')
 
print('关键短语为:')
# 从关键短语列表中获取关键短语
for phrase in tr4w.get_keyphrases(keywords_num=20, min_occur_num=2):
	print(phrase)
print('\n')
 
# 创建分句类的实例
tr4s = TextRank4Sentence()
# 英文单词小写,进行词性过滤并剔除停用词
tr4s.analyze(text=text, lower=True, source='all_filters')
 
print('摘要为:')
# 抽取3条句子作为摘要
for item in tr4s.get_key_sentences(num=3):
	# 打印句子的索引、权重和内容
	print(item.index, item.weight, item.sentence</code></pre>

<!-- /wp:code -->


<!-- wp:shortcode -->
关键词为:
媒体 0.02155864734852778
高圆圆 0.020220281898126486
微 0.01671909730824073
宾客 0.014328439104001788
赵又廷 0.014035488254875914
答谢 0.013759845912857732
谢娜 0.013361244496632448
现身 0.012724133346018603
记者 0.01227742092899235
新人 0.01183128428494362
北京 0.011686712993089671
博 0.011447168887452668
展示 0.010889176260920504
捧场 0.010507502237123278
礼物 0.010447275379792245
张杰 0.009558332870902892
当晚 0.009137982757893915
戴 0.008915271161035208
酒店 0.00883521621207796
外套 0.008822082954131174


关键短语为:
微博


摘要为:
0 0.07097195571711616 中新网北京12月1日电(记者 张曦) 30日晚,高圆圆和赵又廷在京举行答谢宴,诸多明星现身捧场,其中包括张杰(微博)、谢娜(微博)夫妇、何炅(微博)、蔡康永(微博)、徐克、张凯丽、黄轩(微博)等
6 0.05410372364148859 高圆圆身穿粉色外套,看到大批记者在场露出娇羞神色,赵又廷则戴着鸭舌帽,十分淡定,两人快步走进电梯,未接受媒体采访
27 0.04904283129838876 记者了解到,出席高圆圆、赵又廷答谢宴的宾客近百人,其中不少都是女方的高中同学
<!-- /wp:shortcode -->

<!-- wp:code -->
<pre class="wp-block-code"><code>2)三种分词效果
```
#-*-coding:utf-8-*-
"""
@author:taoshouzheng
@time:2018/5/18 14:52
@email:[email protected]
"""
 
import codecs
from imp import reload
 
from textrank4zh import TextRank4Keyword, TextRank4Sentence
 
import sys
try:
	reload(sys)
	sys.setdefaultencoding('utf-8')
except:
	pass

"""测试3类分词的效果"""
 
text = '这间酒店位于北京东三环,里面摆放很多雕塑,文艺气息十足。答谢宴于晚上8点开始。'
tr4w = TextRank4Keyword()
 
tr4w.analyze(text=text, lower=True, window=2)
# 将文本划分为句子列表
print('sentences:')
for s in tr4w.sentences:
	print(s)
print('\n')
 
# 对句子列表中的句子进行分词,不进行词性过滤
print('words_no_filter:')
# words为词列表,tr4w.words_no_filter为由词列表组成的列表
for words in tr4w.words_no_filter:
	print('/'.join(words))
print('\n')
 
# 打印去掉停用词的词列表
print('words_no_stop_words:')
for words in tr4w.words_no_stop_words:
	print('/'.join(words))
print('\n')
 
# 打印去掉停用词并进行词性过滤之后的词列表
print('words_all_filters:')
for words in tr4w.words_all_filters:
	print('/'.join(words))

sentences:
这间酒店位于北京东三环,里面摆放很多雕塑,文艺气息十足
答谢宴于晚上8点开始

words_no_filter:
这/间/酒店/位于/北京/东三环/里面/摆放/很多/雕塑/文艺/气息/十足
答谢/宴于/晚上/8/点/开始

words_no_stop_words:
间/酒店/位于/北京/东三环/里面/摆放/很多/雕塑/文艺/气息/十足
答谢/宴于/晚上/8/点

words_all_filters:
酒店/位于/北京/东三环/摆放/雕塑/文艺/气息
答谢/宴于/晚上

参考链接:https://blog.csdn.net/wotui1842/article/details/80351386

ddzzhen

发表评论