34

NLP关键短语提取必备:从TextRank看PositionRank等四种花式变体的算法思想与开源实现

 2 years ago
source link: https://mp.weixin.qq.com/s?__biz=MjM5ODkzMzMwMQ%3D%3D&%3Bmid=2650429837&%3Bidx=1&%3Bsn=a2d1b8663f3c2b0297139a85c4b3367a
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

NLP关键短语提取必备:从TextRank看PositionRank等四种花式变体的算法思想与开源实现

AINLP 2022-04-06 14:16
640?wx_fmt=jpeg

在前面的文章《NLP关键词提取必备:从TFIDF到KeyBert范式原理优缺点与开源实现》一文中,我们介绍了当前关键词的提取方法。

而一般关键词keywords提取的粒度一般都比较粗,因此更一细粒度的关键短语keyphrase提取也成为了一个经典任务。

特别的,在无监督方法下,基于pagerank思想的Textrank算法受到广泛关注,而近期通过阅读文献发现,考虑词语相邻关系的TextRank产生了系列变体,例如考虑位置关系的PositionRank、考虑可变窗口信息的SingleRank、考虑文本主题信息的TopicRank以及考虑主题和关键词的MultipartiteRank算法。

例如,以昨日的一篇时事文章为例:

640?wx_fmt=png

使用pke(https://github.com/boudinfl/pke)工具,可以实验出上述五种方法的关键短语结果如下:

模型类型关键词集合TextRank中国主权安全发展利益、中国反外国制裁法有关规定、所谓人权问题炮制恶劣谎言、中国外交部例行记者会、中方人员正当合法权益、中国官员、国际关系基本准则、中国形象、中国内政、美国国务卿布林肯、中方官员、炮制谎言、中方利益、人权问题、华制裁、道德底线、发言人汪文斌、签证限制、3月21日、美方官员PositionRank美国国务卿布林肯、3月21日、美方官员、中国官员、中方官员、中国反外国制裁法、美方、中国外交部、中国内政、人权问题、中国形象、中方利益、声明、中方人员、中方、炮制谎言、人权、恶劣谎言、发言人汪文斌、正当合法权益SingleRank所谓人权问题炮制恶劣谎言、中方人员正当合法权益、中国主权安全发展利益、中国反外国制裁法有关规定、中国外交部例行记者会、中国官员、中方官员、中方利益、中国内政、中国形象、美方官员、中方、人权问题、国际关系基本准则、炮制谎言、美国国务卿布林肯、美方、发言人汪文斌、道德底线、人权TopicRank中方官员、中国官员、中国外交部例行记者会、道德底线、美国国务卿布林肯、发言人汪文斌、31日、3月21日、美方官员、国际法、炮制谎言、中方人员正当合法权益MultipartiteRank中国官员、中方官员、中国外交部例行记者会、美国国务卿布林肯、31日、3月21日、发言人汪文斌、道德底线、中国形象、国际法、美方官员、中方利益、中国内政、中方人员正当合法权益、炮制谎言

看着效果还是比较惊艳的,并且十分有趣,与纯关键词相比更有意义。

因此,本文主要围绕着textrank算法的变体这一主题,从算法思想、文献地址以及代码实现三个方面进行介绍,供大家一起思考。

一、考虑词语相邻关系的TextRank

1、算法思想 

之前的文章说到,TF-IDF基于词袋模型(Bag-of-Words),把文章表示成词汇的集合,由于集合中词汇元素之间的顺序位置与集合内容无关,所以TF-IDF指标不能有效反映文章内部的词汇组织结构。

TextRank由Mihalcea与Tarau提出,通过词之间的相邻关系构建网络,然后用PageRank迭代计算每个节点的rank值,排序rank值即可得到关键词。

640?wx_fmt=png

TextRank是一种基于随机游走的关键词提取算法,考虑到不同词对可能有不同的共现(co-occurrence),TextRank将共现作为无向图边的权值。

其中,TextRank的迭代计算公式如下:

640?wx_fmt=png

其实现包括以下步骤:

1)把给定的文本T按照完整句子进行分割;

2)对于每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,即,其中 ti,j 是保留后的候选关键词;

3)构建候选关键词图G = (V,E),其中V为节点集,由2)生成的候选关键词组成,然后采用共现关系(co-occurrence)构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词;

4)根据上面公式,迭代传播各节点的权重,直至收敛;

5)对节点权重进行倒序排序,从而得到最重要的T个单词,作为候选关键词;

6)由5得到最重要的T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词;

2、文献地址: http://www.aclweb.org/anthology/W04-3252.pdf

3、代码实现:

>>> import pke
>>> text = "3月21日,美国国务卿布林肯发表声明,宣布美方将对所谓侵犯人权的中国官员实施签证限制。对此,在今天(31日)的中国外交部例行记者会上,发言人汪文斌宣布,美方借口所谓人权问题炮制恶劣谎言,并以此为由干涉中国内政,抹黑中国形象,打压中方官员。这些行径毫无道德底线,严重违反国际法和国际关系基本准则,中方对此坚决反对。为维护中国主权安全发展利益,保护中方人员正当合法权益。根据中国反外国制裁法有关规定,中方决定对在涉华人权问题上炮制谎言,推动出台对华制裁、损害中方利益的美方官员对等采取签证限制。"
>>> extractor = pke.unsupervised.TextRank()
>>> extractor.load_document(input=text, language=‘zh’,normalization=‘none')
>>> extractor.candidate_selection()
>>> extractor.candidate_weighting()
>>> extractor.get_n_best(n=20)
[('中国 主权 安全 发展 利益', 0.1439883499104867), ('中国 反外国 制裁法 有关 规定', 0.14393128665611685), 
('所谓 人权 问题 炮制 恶劣 谎言', 0.13407864229050276), ('中国 外交部 例行 记者会', 0.12011181578574892), 
('中方 人员 正当 合法 权益', 0.11476293917527146), ('中国 官员', 0.09022326415909442), 
('国际 关系 基本 准则', 0.08938622486033518), ('中国 形象', 0.0714960100030547), 
('中国 内政', 0.07149597000305469), ('美国 国务卿 布林肯', 0.06703913614525138), 
('中方 官员', 0.06067005962586065), ('炮制 谎言', 0.05185782798955512), ('中方 利益', 0.05116170112737739), ('人权 问题', 0.04736595953167091), ('华 制裁', 0.044693947430167594),
('道德 底线', 0.044693417430167595), ('发言人 汪文斌', 0.04469310743016759), ('签证 限制', 0.04469293743016759), ('3月 21日', 0.04469273743016759), ('美方 官员', 0.042500258350377566)]

二、考虑位置关系的PositionRank

1、算法思想

《PositionRank:An Unsupervised Approach to Keyphrase Extraction from Scholarly Documents》一文提供了一种学术文档关键短语提取的无监督方法。

从思想上,与TextRank相似,都是基于PageRank的图关系计算词的得分,通过将PageRank应用于由文档中的相邻单词构成的词图上,从而对关键短语进行评分。

它同时将单词的位置及其频率包含在文档中,以计算每个候选词的有偏PageRank分数。

基于图的排序算法通过考虑从整个图递归计算的全局信息来测量图中顶点的重要性,对于每个单词,通过聚合单词出现的所有位置的信息来计算权重。

然后将该权重合并到有偏的PageRank算法中,以便为每个单词分配不同的“偏好”。

PositionRank提取关键词用S(V_i)表示词的重要性得分,其公式如下:

640?wx_fmt=png

其中,alpha表示阻尼因子,一般设为0.75;w表示图的边的权重,即词之间的相似度。O(v_j)表示词v_j所有出向边的权重和。

其中,pi~表示词的初始得分归一化后的值。640?wx_fmt=png

在具体计算上,词的初始得分跟词的在文本中的位置成反比,跟词频成正比。假定词v在文本的第2,第3,第8位置出现,p=1/2+1/3+1/8。

2、文献地址: http://www.aclweb.org/anthology/P17-1102.pdf

3、代码实现:

>>> import pke
>>> text = "3月21日,美国国务卿布林肯发表声明,宣布美方将对所谓侵犯人权的中国官员实施签证限制。对此,在今天(31日)的中国外交部例行记者会上,发言人汪文斌宣布,美方借口所谓人权问题炮制恶劣谎言,并以此为由干涉中国内政,抹黑中国形象,打压中方官员。这些行径毫无道德底线,严重违反国际法和国际关系基本准则,中方对此坚决反对。为维护中国主权安全发展利益,保护中方人员正当合法权益。根据中国反外国制裁法有关规定,中方决定对在涉华人权问题上炮制谎言,推动出台对华制裁、损害中方利益的美方官员对等采取签证限制。"
>>> extractor = pke.unsupervised.PositionRank()
>>> extractor.load_document(input=text, language=‘zh’,normalization=‘none')
>>> extractor.candidate_selection()
>>> extractor.candidate_weighting()
>>> extractor.get_n_best(n=20)
[('美国 国务卿 布林肯', 0.15996079993960613), ('3月 21日', 0.13970058466898522),
('美方 官员', 0.09190195294321446), ('中国 官员', 0.0769731920256748), 
('中方 官员', 0.06733529743880873), ('中国 反外国 制裁法', 0.0666534434499268), 
('美方', 0.06515272901375364), ('中国 外交部', 0.061757238331506585), ('中国 内政', 0.058870658292563605), ('人权 问题', 0.057428457243452975), 
('中国 形象', 0.057022636059898976), ('中方 利益', 0.05483791957865125), ('声明', 0.05309593580915621), ('中方 人员', 0.050404516626847876), ('中方', 0.04058607350934792), ('炮制 谎言', 0.0394098338115855), ('人权', 0.0362940538057754), ('恶劣 谎言', 0.031480317780157786), ('发言人 汪文斌', 0.03142347563854007), ('正当 合法 权益', 0.02986367797514948)]

三、考虑可变窗口信息的SingleRank

1、算法思想

《Single Document Keyphrase Extraction Using Neighborhood Knowledge》 一文中,通过在可变大小w≥2的窗口中共同出现的单词之间加上加权边缘,将TextRank扩展为SingleRank。

与TextRank不同的是,SingleRank保留所有的unigrams词,然后类似TextRank方法,滑动窗口方式计算更高的n-grams词,两个分值较低的unigram,有可能产生较高分值的bi-gram。

2、文献地址

http://www.aclweb.org/anthology/C08-1122.pdf

3、代码实现

>>> import pke
>>> text = "3月21日,美国国务卿布林肯发表声明,宣布美方将对所谓侵犯人权的中国官员实施签证限制。对此,在今天(31日)的中国外交部例行记者会上,发言人汪文斌宣布,美方借口所谓人权问题炮制恶劣谎言,并以此为由干涉中国内政,抹黑中国形象,打压中方官员。这些行径毫无道德底线,严重违反国际法和国际关系基本准则,中方对此坚决反对。为维护中国主权安全发展利益,保护中方人员正当合法权益。根据中国反外国制裁法有关规定,中方决定对在涉华人权问题上炮制谎言,推动出台对华制裁、损害中方利益的美方官员对等采取签证限制。"
>>> extractor = pke.unsupervised.SingleRank()
>>> extractor.load_document(input=text, language=‘zh’,normalization=‘none')
>>> extractor.candidate_selection()
>>> extractor.candidate_weighting()
>>> extractor.get_n_best(n=20)
[('所谓 人权 问题 炮制 恶劣 谎言', 0.1528846496918629), ('中方 人员 正当 合法 权益', 0.14893412181548232), ('中国 主权 安全 发展 利益', 0.13626903157942447), 
('中国 反外国 制裁法 有关 规定', 0.13429174136894625), ('中国 外交部 例行 记者会', 0.11274643826578769), ('中国 官员', 0.09997006503249145), ('中方 官员', 0.09922771341033396), 
('中方 利益', 0.0896328488649127), ('中国 内政', 0.0808957497835488), ('中国 形象', 0.08008446536476913), ('美方 官员', 0.07476946588131113), ('中方', 0.06644825412653164), ('人权 问题', 0.060667937880388274), ('国际 关系 基本 准则', 0.06057513193837046), ('炮制 谎言', 0.047665722392745594), ('美国 国务卿 布林肯', 0.04700088724300609), 
('美方', 0.041988646597508825), ('发言人 汪文斌', 0.037028462565882256), ('道德 底线', 0.03561933071562185), ('人权', 0.034757964125265835)]

四、考虑文本主题信息的TopicRank

1、算法思想

《TopicRank: Graph-Based Topic Ranking for Keyphrase Extraction》一文提出了一种引入主题信息的无监督关键词提取算法TopicRank。

640?wx_fmt=png

在实现思路上,

首先,对文档进行预处理(句子分割、单词标记和词性标记),并将关键词候选词聚集到主题中。

在主题识别上,主要抽取名词短语来表征文档的主题,短语中有超过25%重合的单词就考虑为相似短语,用 Hierarchical Agglomerative Clustering (HAC) 算法进行聚类相似的短语。

然后,根据主题在文档中的重要性对其进行排序,并通过为每个最重要的主题选择一个关键短语候选来提取关键短语。

在构图上,TopicRank 用一个完整的图来表示一个文档,其中主题是顶点,边根据顶点之间语义关系的强度进行加权。然后,TextRank 的基于图的排序模型用于为每个主题分配一个显着性分数,采用textRank为每个主题打分。

在最后关键短语的输出上,一旦topic进行排序后,选择top K个topics,每个topic选择一个最重要的关键短语作为输出,所有topics总共产生top K个关键短语。

在该论文中,提供了三个策略来选择一个topic最适合的关键短语,例如:

选择关键短语中最开始出现在文档的那个关键短语;

选择频率最高的那个关键短语;

选择聚焦的群簇中心的那个关键短语。

2、文献地址

 http://aclweb.org/anthology/I13-1062.pdf

3、代码实现

>>> import pke
>>> text = "3月21日,美国国务卿布林肯发表声明,宣布美方将对所谓侵犯人权的中国官员实施签证限制。对此,在今天(31日)的中国外交部例行记者会上,发言人汪文斌宣布,美方借口所谓人权问题炮制恶劣谎言,并以此为由干涉中国内政,抹黑中国形象,打压中方官员。这些行径毫无道德底线,严重违反国际法和国际关系基本准则,中方对此坚决反对。为维护中国主权安全发展利益,保护中方人员正当合法权益。根据中国反外国制裁法有关规定,中方决定对在涉华人权问题上炮制谎言,推动出台对华制裁、损害中方利益的美方官员对等采取签证限制。"
>>> extractor = pke.unsupervised.TopicRank()
>>> extractor.load_document(input=text, language=‘zh’,normalization=‘none')
>>> extractor.candidate_selection()
>>> extractor.candidate_weighting()
>>> extractor.get_n_best(n=20)
[('中方 官员', 0.15151732413078872), ('中国 官员', 0.14931537269576378),
('中国 外交部 例行 记者会', 0.09342811014283732), ('道德 底线', 0.07966743796067863), ('美国 国务卿 布林肯', 0.07703317076478021), 
('发言人 汪文斌', 0.07545155903686007), ('31日', 0.07503300525882955), ('3月 21日', 0.07353899352874806), ('美方 官员', 0.06976642225093019),
('国际法', 0.06721608587244375), ('炮制 谎言', 0.04512186399549502), ('中方 人员 正当 合法 权益', 0.04291065436184492)]

五、考虑主题和关键词的MultipartiteRank

1、算法思想

《Unsupervised Keyphrase Extraction with Multipartite Graphs》 一文在TopicRank的基础上,在多部分图结构中对主题信息进行编码,并将关键词候选词和主题表示在一个图中,并利用它们之间的相互加强关系来提取关键词。

640?wx_fmt=png

2、文献地址

https://arxiv.org/abs/1803.08721

3、代码实现

>>> import pke
>>> text = "3月21日,美国国务卿布林肯发表声明,宣布美方将对所谓侵犯人权的中国官员实施签证限制。对此,在今天(31日)的中国外交部例行记者会上,发言人汪文斌宣布,美方借口所谓人权问题炮制恶劣谎言,并以此为由干涉中国内政,抹黑中国形象,打压中方官员。这些行径毫无道德底线,严重违反国际法和国际关系基本准则,中方对此坚决反对。为维护中国主权安全发展利益,保护中方人员正当合法权益。根据中国反外国制裁法有关规定,中方决定对在涉华人权问题上炮制谎言,推动出台对华制裁、损害中方利益的美方官员对等采取签证限制。"
>>> extractor = pke.unsupervised.MultipartiteRank()
>>> extractor.load_document(input=text, language=‘zh’,normalization=‘none')
>>> extractor.candidate_selection()
>>> extractor.candidate_weighting()
>>> extractor.get_n_best(n=20)
[('中国 官员', 0.1289113456909658), ('中方 官员', 0.10679422933722019), ('中国 外交部 例行 记者会', 0.09087577269586433), ('美国 国务卿 布林肯', 0.08236616933397517),
('31日', 0.07843964610413598), ('3月 21日', 0.07685494304402038), ('发言人 汪文斌', 0.07148930651290919), ('道德 底线', 0.06307232637769292), 
('中国 形象', 0.05314554905951223), ('国际法', 0.05227181533200795), ('美方 官员', 0.04754086156717561), ('中方 利益', 0.04162692601292564), 
('中国 内政', 0.04126306748861862), ('中方 人员 正当 合法 权益', 0.032951465047409645), ('炮制 谎言', 0.03239657639556631)]

关键短语提取是自然语言处理中的一类关键技术,能够得到更为细粒度的关键短语集合,这个可以用于query重要性打分。

在本文中,我们介绍了考虑词语相邻关系的TextRank的系列变体,包括考虑位置关系的PositionRank、考虑可变窗口信息的SingleRank、考虑文本主题信息的TopicRank以及考虑主题和关键词的MultipartiteRank算法。

这些算法很具有启发性,即充分利用pagerank这一算法精髓,融合更多的特征进行重要性评估,包括主题信息、位置信息、窗口信息等。

而进一步的,利用好网络信息也是当前文本处理任务的一个重要趋势,欢迎大家关注这方面的工作。

1、https://blog.csdn.net/zkq_1986/article/details/83010367
2、https://www.cxyzjd.com/article/BGoodHabit/108926383

0?wx_fmt=png
AINLP
一个有趣有AI的自然语言处理公众号:关注AI、NLP、机器学习、推荐系统、计算广告等相关技术。公众号可直接对话双语聊天机器人,尝试自动对联、作诗机、藏头诗生成器,调戏夸夸机器人、彩虹屁生成器,使用中英翻译,查询相似词,测试NLP相关工具包。
343篇原创内容
Official Account
进技术交流群请添加AINLP小助手微信(id: ainlper)
请备注具体方向+所用到的相关技术点
640?wx_fmt=jpeg

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。

640?wx_fmt=jpeg

阅读至此了,分享、点赞、在看三选一吧🙏


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK