一、TextRank算法
TextRank算法与其他算法不同的地方在于,其他的算法需要基于一个现有的语料库,比如:TF-IDF算法就需要计算每一个词在多个文档中出现;主题模型需要通过对大量文档的学习,来发现隐含的主题。但是TextRank算法可以对单篇文档分析来提取关键词,TextRank算法的基本思想来源于PageRank算法,先介绍PageRank算法。
1.1 PageRank算法
PageRank算法是一种网页排名的算法,其主要的思想为:
1.一个网页被越多的其他的网页链接,则说明这个网页就越重要;
2.一个网页被一个权值越高的网页所连接,也说明这个网页越重要;
基本的公式为:
S
(
V
i
)
=
∑
j
∈
(
I
n
(
V
j
)
)
⟮
1
∣
O
u
t
(
V
j
)
∣
∗
S
(
V
j
)
⟯
S(V_i) = \sum_ {j\in(In(V_j))} \lgroup\frac{1}{|Out(V_j)|} * S(V_j)\rgroup
S(Vi)=j∈(In(Vj))∑⟮∣Out(Vj)∣1∗S(Vj)⟯
其中,
I
n
(
V
i
)
In(V_i)
In(Vi)为
V
i
V_i
Vi的入链的集合,
O
u
t
(
V
j
)
Out(V_j)
Out(Vj)为
V
j
V_j
Vj的出链的集合,
∣
O
u
t
(
V
j
)
∣
|Out(V_j)|
∣Out(Vj)∣是出链的数量,且每个网页要将他们自身的分数平均的分给每一个出链,而
1
∣
O
u
t
(
V
j
)
∣
∗
S
(
V
j
)
\frac{1}{|Out(V_j)|} * S(V_j)
∣Out(Vj)∣1∗S(Vj) 意思为
V
j
V_j
Vj贡献给
V
i
V_i
Vi的分数。将
V
i
V_i
Vi的所有入链贡献给他的分数全部加起来,就是
V
i
V_i
Vi本身的得分。算法在开始的时候将所有的网页的得分初始化为1,然后通过迭代对每个网页的分数进行收敛,收敛时的得分就是网页的最终得分,然后从高到低进行排名,就是要得到的关键字;若不能收敛的话,需要设定最大的迭代次数。
要是按照以上的公式可能会导致一些网页孤立(这些网页没有出链入链),就需要对公式进行处理,假如一个阻尼系数
d
d
d,一般设为0.85,公式为:
S
(
V
i
)
=
(
1
−
d
)
+
d
∗
∑
j
∈
(
I
n
(
V
j
)
)
⟮
1
∣
O
u
t
(
V
j
)
∣
∗
S
(
V
j
)
⟯
S(V_i) = (1 -d) + d * \sum_ {j\in(In(V_j))} \lgroup\frac{1}{|Out(V_j)|} * S(V_j)\rgroup
S(Vi)=(1−d)+d∗j∈(In(Vj))∑⟮∣Out(Vj)∣1∗S(Vj)⟯
1.2 TextRank算法
但是PageRank是有向无权图,而TextRank是有权图,在进行计算得分时,除了需要考虑链接句的重要性,还需要考虑句子之间的相似度,计算每个句子给它链接句子的贡献时,不是平均分配了,就通过句子之间的相似度来求解,在做自动摘要的时候,默认每个语句和其他的句子都是有链接关系的,是一个有向完全图,公式为:
但是TextRank做关键词的抽取和自动摘要是不同的,不同点在于:
1.词与词之间的关联没有权重;
2.每个词不是与文档中所有词都有链接;
针对第一点,TexkRank的计算分数就与PageRank一样:
针对第二点,就提出来“窗口”的概念,如文本:
重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩
经过分词后的结果为:[重庆市/ 民政局/ 巡视员 /谭/ 明政/ 晋江市/ 人大常委会/ 主任/ 陈健倩],将窗口大小设为5,可以得到:
1.[重庆市/ 民政局/ 巡视员/ 谭/ 明政]
2.[民政局/ 巡视员/ 谭 /明政/ 晋江市]
3.[巡视员/ 谭/ 明政/ 晋江市/ 人大常委会]
…
每个窗口的所有词都是有链接关系的,如:重庆市就和[民政局/巡视员/谭/明政]之间有链接关系,就可以得到分数,然后选取
n
n
n个分数最高的作为关键词。
1.3 代码实现
from jieba import analyse
text = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \
'中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \
'办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \
'重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \
'领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \
'市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \
'、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \
'这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \
'的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \
'事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \
'常委会主任陈健倩介绍了大会的筹备情况。'
textrank = analyse.textrank
keywords = textrank(text, 5)
print(keywords)
输出的结果为:
['城市', '爱心', '救助', '中国', '社会']
其中:
analyse.textrank(sentence,topK=20,withWeight=False,allowPOS=('ns', 'n', 'vn', 'v'),withFlag=False,)
sentence:要输入的文本
topK:返回多少个关键词,如果为:None,则返回所有可能的word
withWeight:默认为False,若是为False的话,返回的是word的列表;
若为True的话,返回的是包含(word,weight)的列表
allowPOS:返回哪些词性的woed,如:allowPOS=('ns', 'n'),只会返回词性为'ns'和'n'的word
withFlag:默认为False,若为False的话,返回的列表为word的列表;
若为True,返回的是(word,词性)的列表
二、参考资料
《Python自然语言处理实战:核心技术和方法》