目录
TextRank算法
是一种文本排序算法,由谷歌网页重要性排序算法PageRank算法改进而来,能够从给定文本中提取关键词/关键词组,并使用抽取式的自动文摘方法提取关键句.
1. TextRank算法原理
1.1 PageRank介绍
该算法由PageRank迁移而来,PageRank算法根据万维网上页面之间的链接关系计算页面重要性;TextRank算法将词视为”万维网上的节点”,根据词之间的共现关系计算每个词的重要性,并将PageRank中的有向边变为无向边.
对于搜索引擎而言,最初靠人对网页分类筛选高质量网站,之后采用文本检索的方式,现在被PageRank算法替代,核心思想如下:
- 如果一个网页被很多其他网页链接,这个网页比较重要;
- 如果一个比较重要的网页链接到一个其他网页,那么被链接到的网页因此而重要
下面的两幅图中,将重要性记为PR,那么由以下等式:
可以看出,上边的图中,A的重要性是BCD的和;下边的图中,由于存在BCD的链接,所A的重要性为B/2+C+D/3.
对于任意网页i,PR可以表示如下:
以上是简单模型,但并不适用于只出不如或者环回的情况,所以考虑更普遍的模型—-随机浏览模型.
随机浏览模型的假设是这样的:假定一个网页浏览者从一个随机页面开始浏览,浏览者不断点击当前网页的链接开始下一次浏览。但是,浏览者会逐渐厌倦并开始随机浏览网页。随机浏览的方式更符合用户的真实浏览行为,避免了上述情况的发生,由此产生了随机浏览模型,随机浏览模型中每个网页的PR值通过以下公式计算:
这样,一个网页的重要性由相互链接的其它网页决定,满足马尔科夫链性质,那么通过迭代可以得到所有网页的PR值,经过重复计算这些值会趋于稳定.
1.2 TextRank介绍
二者的思想有相通之处,区别在于:PageRank算法根据网页之间的链接关系构造网络,而TextRank算法根据词之间的共现关系构造网络. 不同之处在于PageRank算法构造网络中的边是有向无权边,而TextRank算法构造网络中的边是无向有权边.核心公式如下其中wji表示两个节点之间的边连接具有不同的重要程度.
关键词和关键词组的步骤:
- 对文本按照整句进行分割;
- 对每个句子进行分词和词性标注,剔除停用词,保留指定词性的词;
- 构建词图,采用共现关系构造任意两个节点之间的边;两个节点之间存在的边仅当他们对应的词在长度为K的窗口中共现时存在,K表示窗口大小,即最多共现K个单词,一般K取2.
- 根据公式,迭代计算各节点权重,直至收敛;
- 排序,取top作为关键词
- 对于得到的关键词,在原始文本中进行标记,如果形成了相邻词组,则为关键词.
关键句的步骤:
- 同时出现两个句子中同一个词的数量除以句子中词的个数求对数和;
- 设置阈值去掉相似度较低的连接,构建节点连接图,然后迭代计算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:tsz1216@sina.com
"""
# 导入系统模块
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:tsz1216@sina.com
"""
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