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

文章目录

  • 一、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)]

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

展厅为何倾向使用三维数字沙盘进行多媒体互动设计?优势探讨!

随着数字技术的迅猛进步,展厅多媒体互动设计正迎来深刻变革。其中,三维数字沙盘作为经典沙盘模型的革新之作,不仅保留了其空间布局直观展示的优点,更巧妙融入光影互动与中控系统,推动展览展示向智能化迈进。今日&#…

SDKMAN! 的英文全称是 Software Development Kit Manager(软件开发工具包管理器)

文章目录 SDKMAN! 的核心功能SDKMAN! 的常用命令SDKMAN! 的优势总结 SDKMAN! 的英文全称是 Software Development Kit Manager。它是一个用于管理多个软件开发工具(如 Java、Groovy、Scala、Kotlin 等)版本的工具。SDKMAN! 提供了一个简单的方式来安装、…

java配置api,vue网页调用api从oracle数据库读取数据

一、主入口文件 1:java后端端口号 2:数据库类型 和 数据库所在服务器ip地址 3:服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1:column后变量名是数据库中存储的变量名 property的值是column值的…

蓝桥杯C语言组:分治问题研究

蓝桥杯C语言组分治问题研究 摘要 本文针对蓝桥杯C语言组中的分治问题展开深入研究,详细介绍了分治算法的原理、实现方法及其在解决复杂问题中的应用。通过对经典例题的分析与代码实现,展示了分治算法在提高编程效率和解决实际问题中的重要作用&#xff…

Golang GORM系列:GORM CRUM操作实战

在数据库管理中,CRUD操作是应用程序的主干,支持数据的创建、检索、更新和删除。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性,使这些操作变得轻而易举。本文是掌握使用GORM进行CRUD操作的全面指南,提供了在Go应用程序中有效…

如何评估云原生GenAI应用开发中的安全风险(下)

以上就是如何评估云原生GenAI应用开发中的安全风险系列中的上篇内容,在本篇中我们介绍了在云原生AI应用开发中不同层级的风险,并了解了如何定义AI系统的风险。在本系列下篇中我们会继续探索我们为我们的云原生AI应用评估风险的背景和意义,并且…

2025 年 2 月 TIOBE 指数

2025 年 2 月 TIOBE 指数 二月头条:快,更快,最快! 现在,世界需要每秒处理越来越多的数字,而硬件的发展速度却不够快,程序的速度变得越来越重要。话虽如此,快速编程语言在 TIOBE 指数中取得进展也就不足为奇了。编程语言 C++ 最近攀升至第 2 位,Go 已稳居前 10 名,Ru…

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492,我们详细探讨了YOLO11的部署以及推理训练,但是评论区的观众老爷就说了:“博主博主,你这个只能推理…

Segformer模型的平台部署和项目应用

最近因为离职太忙了之前的很多内容没有更新,离开BYD进入新的环境中成长。 本文包含了Segformer的网络结构重构后如何部署到算法平台中方便标注训练推理的过程,以及如何应用到项目中(BYD最后一个项目:异物检测系统) C做…

react redux用法学习

参考资料: https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具:deepseek,通义灵码 第一天 安装相关依赖: 使用redux的中间件: npm i react-redu…

【2025 Unity Meta Quest MR 开发教程】透视 Passthrough 模块配置(戴上头显看见现实画面)

XR 开发者社区:https://www.spatialxr.tech/ 文章目录 📕导入透视模块📕OVRManager📕OVRPassthroughLayer 脚本📕相机 教程中使用的 SDK:Meta XR SDK v72(可以从 Unity 资源商店添加 Meta XR A…

UWB功耗大数据插桩调研

一、摘要 UWB功耗点 插桩点 日志关键字 电流 蓝牙持锁 BatteryStats的锁统计 vendor_bluetooth_lock 30~40mA 测距 UwbSessionManager.startRanging UwbSessionManager.stoptRanging 或接入fadiKey Uwb状态广播 "com.fadiui.dkservice.action.uwb.state.change&q…

旅游行业内容管理系统CMS提升网站建设效率与体验

内容概要 在如今快速发展的互联网时代,旅游行业对网站的要求越来越高,内容管理系统(CMS)的应用不可或缺。以 Baklib 为代表的先进CMS可显著提高旅游网站的建设效率与用户体验。为了满足不断变化的市场需求,这些系统通…

【vscode+latex】实现overleaf本地高效编译

overleaf本地高效编译 1. 配置本地latex环境2. vscode插件与配置3. 使用 之前觉得用overleaf在线写论文很方便,特别是有辅助生成latex格式公式的网页,不需要在word上一个一个手打调格式。 然而,最近在写一篇论文的时候,由于这篇论…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…

51c自动驾驶~合集49

我自己的原文哦~ https://blog.51cto.com/whaosoft/13164876 #Ultra-AV 轨迹预测新基准!清华开源:统一自动驾驶纵向轨迹数据集 自动驾驶车辆在交通运输领域展现出巨大潜力,而理解其纵向驾驶行为是实现安全高效自动驾驶的关键。现有的开…

IGBT的两级关断

IGBT(绝缘栅双极型晶体管)的两级关断(Two-stage turn-off)是一种优化关断过程的方法,主要用于减少关断时的电压过冲和dv/dt(电压变化率)过高的问题,特别是在大功率应用中&#xff08…

centos 7 关于引用stdatomic.h的问题

问题&#xff1a;/tmp/tmp4usxmdso/main.c:6:23: fatal error: stdatomic.h: No such file or directory #include <stdatomic.h> 解决步骤&#xff1a; 1.这个错误是因为缺少C编译器的标准原子操作头文件 stdatomic.h。在Linux系统中&#xff0c;我们需要安装开发工具…

20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题

20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题 2025/2/11 17:45 缘起&#xff1a;荣品的RK3566核心板在Android13下&#xff0c;出现charge_extrem_low_power之后就直接挂住了。 由于我司使用了CW2217这个电量计&#xff0c;没有使用核心板自…

动手学深度学习---深层神经网络

目录 一、神经网络1.1、模型训练1.2、损失函数1.2.1、分类&#xff1a;hinge loss/合页损失/支持向量机损失1.2.2、分类&#xff1a;交叉熵损失(softmax分类器)1.2.2.1 二分类交叉熵损失1.2.2.2 多分类交叉熵损失 1.2.3、回归&#xff1a;误差平方和&#xff08;SSE&#xff09…