【NLP自然语言处理】TextRank揭秘:文本摘要与关键词提取的强大算法

【NLP自然语言处理】TextRank揭秘:文本摘要与关键词提取的强大算法

目录

🍔 TextRank算法的来源

🍔 TextRank算法的概念

🍔 TextRank算法代码实践

3.1 关键词抽取(keyword extraction)

3.2 关键短语抽取(keyphrase extraction)

3.3 关键句抽取(sentence extraction)

3.4 基于jieba的TextRank算法

🍔 小节

学习目标

🍀 理解TextRank算法的来源.

🍀 掌握TextRank算法的概念.

🍀 掌握TextRank算法的代码实践.

🍔 TextRank算法的来源

  • 在介绍TextRank算法之前, 我们先来简单回顾一下著名的PageRank算法.

  • PageRank算法: 通过计算网页链接的数量和质量来评估网页的重要性, 算法发明人即谷歌的两位联合创始人之一的拉里.佩奇(Larry Page). 最初被应用在搜索引擎优化操作中.

  • 联想思维: PageRank算法其实是借鉴了学术界评价学术论文重要性的通用方法-"影响因子", 可以直观的理解为"该论文被引用的次数".

  • 这样就可以很自然的得到PageRank的核心思想:
    • 如果一个网页被很多其他网页连接到的话, 说明这个网页比较重要, 也就是PageRank值会比较高.
    • 如果一个PageRank值很高的网页链接到另一个网页, 那么被链接到的那个网页的PageRank值也会相应的被提高.

🍔 TextRank算法的概念

  • 对比于衡量网页重要性的PageRank算法, TextRank算法用于衡量哪些单词是关键词, 类比之下的算法思想也就很好理解了:
    • 如果一个单词出现在很多单词的后面, 就是它和很多单词有关联, 那么说明这个单词比较重要.
    • 如果一个TextRank值很高的单词后面跟着另一个单词, 那么后面这个单词的TextRank值也会相应的被提高.

  • 如果对TextRank更深的理论感兴趣, 可以直接查询原始论文, 地址如下:
    • https://web.eecs.umich.edu/~mihalcea/papers/mihalcea.emnlp04.pdf


🍔 TextRank算法代码实践

  • 在本小节中, 我们仅以示例代码跑通几段小程序, 让同学们掌握如何具体在代码层面用TextRank.
    • 关键词抽取(keyword extraction)
    • 关键短语抽取(keyphrase extraction)
    • 关键句抽取(sentence extraction)

3.1 关键词抽取(keyword extraction)

  • 关键词抽取: 是指从文本中确定一些能够描述文档含义的关键术语的过程.

  • 对关键词抽取而言, 用于构建顶点集的文本单元可以使句子中的一个或多个字. 根据这些字之间的关系构建边.
  • 根据任务的需要, 可以使用语法过滤器(syntactic filters)对顶点集进行优化. 语法过滤器的主要作用是将某一类或者某几类词性的字过滤出来作为顶点集.

  • 在真实的企业场景下, 应用TextRank一般都直接采用基于textrank4zh工具包来说辅助工程.
# coding=utf-8 # 导入textrank4zh的相关工具包 from textrank4zh import TextRank4Keyword, TextRank4Sentence # 导入常用工具包 import pandas as pd import numpy as np #关键词抽取 def keywords_extraction(text): # allow_speech_tags : 词性列表, 用于过滤某些词性的词 tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz']) # text: 文本内容, 字符串 # window: 窗口大小, int, 用来构造单词之间的边, 默认值为2 # lower: 是否将英文文本转换为小写, 默认值为False # vertex_source: 选择使用words_no_filter, words_no_stop_words, words_all_filters中的>哪一个来构造pagerank对应的图中的节点 # 默认值为'all_filters', 可选值为'no_filter', 'no_stop_words', 'all_filters' # edge_source: 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪>一个来构造pagerank对应的图中的节点之间的边 # 默认值为'no_stop_words', 可选值为'no_filter', 'no_stop_words', 'all_filters', 边的构造要结合window参数 # pagerank_config: pagerank算法参数配置, 阻尼系数为0.85 tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words', pagerank_config={'alpha': 0.85, }) # num: 返回关键词数量 # word_min_len: 词的最小长度, 默认值为1 keywords = tr4w.get_keywords(num=6, word_min_len=2) # 返回关键词 return keywords 

  • 调用:
if __name__ == "__main__": text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \ "我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \ "副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \ "据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \ "获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \ "国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \ "正式将该小行星命名为“周又元星”。" #关键词抽取 keywords=keywords_extraction(text) print(keywords) 

  • 输出结果:
[{'word': '小行星', 'weight': 0.05808441467341854}, {'word': '天文台', 'weight': 0.05721653775742513}, {'word': '命名', 'weight': 0.0485177005159723}, {'word': '中国', 'weight': 0.045716478124251815}, {'word': '中国科学院', 'weight': 0.037818937836996636}, {'word': '国家', 'weight': 0.03438059254484016}] 

3.2 关键短语抽取(keyphrase extraction)

  • 关键短语抽取: 关键词抽取结束后, 可以得到N个关键词, 在原始文本中相邻的关键词便构成了关键短语.

  • 具体方法: 分析get_keyphrases()函数可知, 内部实现上先调用get_keywords()得到关键词, 然后分析关键词是否存在相邻的情况, 最后即可确定哪些是关键短语.
from textrank4zh import TextRank4Keyword, TextRank4Sentence #关键短语抽取 def keyphrases_extraction(text): tr4w = TextRank4Keyword() tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words', pagerank_config={'alpha': 0.85, }) # keywords_num: 抽取的关键词数量 # min_occur_num: 关键短语在文中的最少出现次数 keyphrases = tr4w.get_keyphrases(keywords_num=6, min_occur_num=1) # 返回关键短语 return keyphrases 

  • 调用:
if __name__ == "__main__": text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \ "我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \ "副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \ "据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \ "获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \ "国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \ "正式将该小行星命名为“周又元星”。" #关键短语抽取 keyphrases=keyphrases_extraction(text) print(keyphrases) 

  • 输出结果:
['小行星命名'] 

3.3 关键句抽取(sentence extraction)

  • 关键句抽取: 句子抽取任务主要就是为了解决自动文本摘要任务, 将每一个sentence作为一个顶点, 根据两个句子之间的内容重复程度来计算他们之间的相似度. 由于不同的句子对之间相似度大小不同, 因此最终构建的是以相似度大小作为edge权重的有权图.

  • 代码实现中, 可以直接调用函数完成:
from textrank4zh import TextRank4Keyword, TextRank4Sentence #关键句抽取 def keysentences_extraction(text): tr4s = TextRank4Sentence() # text: 文本内容, 字符串 # lower: 是否将英文文本转换为小写, 默认值为False # source: 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来生成句子之间的相似度 # 默认值为'all_filters', 可选值为'no_filter', 'no_stop_words', 'all_filters' tr4s.analyze(text, lower=True, source='all_filters') # 获取最重要的num个长度大于等于sentence_min_len的句子用来生成摘要 keysentences = tr4s.get_key_sentences(num=3, sentence_min_len=6) # 返回关键句子 return keysentences 

  • 调用:
if __name__ == "__main__": text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \ "我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \ "副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \ "据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \ "获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \ "国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \ "正式将该小行星命名为“周又元星”。" #关键句抽取 keysentences=keysentences_extraction(text) print(keysentences) 

  • 输出结果:
[{'index': 4, 'sentence': '2018年9月25日,经国家天文台申报,国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会,正式将该小行星命名为“周又元星”', 'weight': 0.2281040325096452}, {'index': 3, 'sentence': '”据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站,获得国际永久编号第120730号', 'weight': 0.2106246105971721}, {'index': 1, 'sentence': '4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式,我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂', 'weight': 0.2020923401661083}] 

3.4 基于jieba的TextRank算法

  • jieba工具不仅仅可以用来分词, 进行词性分析. 也可以用来完成TextRank.
import jieba.analyse def jieba_keywords_textrank(text): keywords = jieba.analyse.textrank(text, topK=6) return keywords 

  • 调用:
if __name__ == "__main__": text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \ "我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \ "副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \ "据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \ "获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \ "国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \ "正式将该小行星命名为“周又元星”。" # 基于jieba的textrank算法实现 keywords = jieba_keywords_textrank(text) print(keywords) 

  • 输出结果:
['小行星', '命名', '国际', '中国', '国家', '天文学家'] 

🍔 小节

  • 介绍了TextRank算法的来源和核心思想, 并通过代码实践, 依次提取关键词, 关键短语, 关键句. 利用textrank4zh工具和jieba工具来实现TextRank, 既方便又好用.

Read more

【强化学习】深度确定性策略梯度算法(DDPG)详解(附代码)

【强化学习】深度确定性策略梯度算法(DDPG)详解(附代码)

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:        【强化学习】- 【单智能体强化学习】(10)---《深度确定性策略梯度算法(DDPG)详解》 深度确定性策略梯度算法(DDPG)详解 目录 DDPG算法详细介绍 算法特点 核心改进点 算法公式推导 1. Q值函数更新 2. 策略更新(Actor网络) 3. 目标网络更新 算法流程 [Python] DDPG算法实现 1. 导入必要库 2. 定义 Actor 网络 3. 定义 Critic 网络 4. 定义经验回放池 5.

By Ne0inhk

Java版LeetCode热题100之最长回文子串:从暴力到Manacher的全方位解析

Java版LeetCode热题100之最长回文子串:从暴力到Manacher的全方位解析 摘要:本文深入剖析 LeetCode 热题 100 中的经典字符串问题——「最长回文子串」。我们将从原题回顾出发,系统讲解三种主流解法:动态规划、中心扩展法、Manacher 算法。每种方法均包含原理分析、代码实现、复杂度评估,并延伸至面试应对、实际应用、相关题目等维度。全文结构严谨、内容翔实,适合算法进阶与面试准备。 一、原题回顾 题目描述: 给你一个字符串 s,找到 s 中最长的回文子串。 回文串定义:正读和反读都相同的字符串,如 "aba"、"abba"。 示例 1: 输入:s = "babad" 输出:"

By Ne0inhk
数据结构:kmp算法,Trie树,以及并查集的干货详解---小白也能看懂

数据结构:kmp算法,Trie树,以及并查集的干货详解---小白也能看懂

🎬 博主名称:个人主页 🔥 个人专栏: 《算法通关》,《Java讲解》 ⛺️心简单,世界就简单 序言 昨晚数据结构写了一半,做图太累了,文章写的比较慢,这篇应该就是第二篇,后面还有一篇,太困了,真不行了 今天讲一下 kmp算法,Trie, 并查集 目录 序言 KMP算法 原理 next数组 匹配过程 Trie树 并查集 KMP算法 这里说一下kmp的大致情况 用于处理字符串匹配问题,他也是十分的抽象                给一个S[]主串(比较长的那个),P[]为模板串,kmp我们一般用下标1来开始遍历 接下来我们需要去思考的是 1,暴力去怎么做 2,怎么去优化 下面是暴力的模板代码 大概意思就是,每当我们匹配到不一样的部位,我们的P就要从头开始再跟刚刚s的起点+1位置重新匹配,        这样就会造成串的长度很长时候,就会超时,所以我们就要从这个过程中找性质了

By Ne0inhk
【树 DFS BFS 离线查询】P11855 [CSP-J2022 山东] 部署|普及+

【树 DFS BFS 离线查询】P11855 [CSP-J2022 山东] 部署|普及+

本文涉及知识点 C++图论 C++BFS算法 C++DFS P11855 [CSP-J2022 山东] 部署 题目背景 受疫情影响,山东省取消了 CSP-J 2022 认证活动,并于次年三月重新命题,在省内补办比赛。 题目描述 “万里羽书来未绝,五关烽火昼仍传。” 古时候没有现代信息化战争的技术,只能靠烽火传信和将军运筹帷幄的调兵遣将来取得战争的优势。 为了使消耗最低,现在 A 国已经在 n n n 个城市之间建好了道路和行军部署渠道,使得这 n n n 个城市都能互相到达且不存在环(即构成以 1 1 1 号城市为根节点的树型结构)。每个城市都驻扎了一定数量的兵力。 为了清晰的描述问题,我们给这 n n n 个城市进行 1

By Ne0inhk