关键词提取技术:TextRank 详解

news2024/12/28 8:23:04

1. 什么是 TextRank?

        TextRank 是一种基于图的排序算法,用于从文本中提取关键词和进行自动摘要。它是受 Google 的 PageRank 算法启发而提出的。与 TF-IDF 不同,TextRank 不依赖外部语料库,也不需要训练数据。它通过构建词语之间的关系图,使用迭代算法计算每个节点(词语或句子)的重要性,从而提取文本的关键信息。

TextRank 可以应用于两个主要任务:

  1. 关键词提取:通过分析词语之间的相邻关系,找出最重要的词语。
  2. 自动摘要:通过句子之间的相似度,生成文本的摘要。

        TextRank 的核心思想是:通过图来表示文本的结构,并通过图的结构特性(比如节点的链接)来估算节点的重要性。

2. TextRank 的底层原理

2.1 PageRank 算法的启发

        TextRank 的核心思想来源于 Google 的 PageRank 算法,后者用于排序网页的“重要性”。在 PageRank 中,网页被表示为图中的节点,网页之间的链接作为边。节点的重要性通过该节点连接到的重要节点数量及这些节点自身的权重来衡量。

        类似地,在 TextRank 中,词语或句子 被表示为图的节点,词语之间的关系(如词语的共现或句子之间的相似性)作为图中的边。TextRank 通过迭代计算节点的重要性,找到最重要的词语或句子。

2.2 TextRank 的步骤

TextRank 的工作流程可分为以下几个步骤:

  1. 构建图模型

    • 对于 关键词提取:每个词语作为图中的节点,边根据词语在一定窗口范围内的共现关系进行连接。
    • 对于 自动摘要:每个句子作为图中的节点,边根据句子之间的相似度(如词语重叠程度)进行连接。
  2. 计算节点的权重

    • 使用类似 PageRank 的算法,初始化每个节点的权重为 1,然后根据图的连接关系进行迭代更新。
    • 更新公式如下:

      W(v_{i})=(1-d)+d*\sum_{v_{j\in In(v_{i})}}^{} \frac{W(v_{j})}{|Out(v_{j})|}

    其中:

    •  W(v_{i})  是节点  v_{i}  的权重。
    • d 是阻尼因子(通常设为 0.85),它控制节点随机跳转的概率。
    • In(v_{i}) 是指向节点  v_{i}  的其他节点集合。
    • Out(v_{j}) 是节点 v_{j} 指向的其他节点的数量。
  3. 排序并提取关键词或句子

    • 经过若干次迭代后,节点的权重收敛,权重越高的词语或句子越重要。
    • 最终,按照权重排序,选取前 N 个节点作为关键词或摘要句。

3. 代码实现(Python)

下面,我们通过 Python 来实现 TextRank 的关键词提取和自动摘要。

3.1 关键词提取
import itertools
import numpy as np
import networkx as nx
from collections import Counter
from sklearn.feature_extraction.text import CountVectorizer

# 文本示例
text = "the cat is on the table. the dog is in the house. there is a cat and a dog."

# 1. 预处理文本
def preprocess_text(text):
    # 简单的分词和去停用词(这里只是示例,实际中需要更复杂的处理)
    return [word.lower() for word in text.split() if len(word) > 1]

# 2. 构建词语图
def build_word_graph(words, window_size=2):
    graph = nx.Graph()
    word_pairs = list(itertools.combinations(words, 2))  # 任意两个词之间的组合

    for word1, word2 in word_pairs:
        if graph.has_edge(word1, word2):
            graph[word1][word2]['weight'] += 1
        else:
            graph.add_edge(word1, word2, weight=1)
    return graph

# 3. 计算 TextRank
def textrank(graph, damping_factor=0.85, max_iter=100, tol=1.0e-6):
    return nx.pagerank(graph, alpha=damping_factor, max_iter=max_iter, tol=tol)

# 4. 提取关键词
def extract_keywords(text, top_n=5):
    words = preprocess_text(text)
    word_graph = build_word_graph(words)
    ranks = textrank(word_graph)
    sorted_ranks = sorted(ranks.items(), key=lambda item: item[1], reverse=True)
    return [word for word, rank in sorted_ranks[:top_n]]

# 运行关键词提取
keywords = extract_keywords(text)
print("Top Keywords:", keywords)

3.1.1 代码解释:
  1. 预处理文本:通过简单的分词和过滤掉长度小于 1 的单词来清洗文本。在实际应用中,还需要去掉停用词和做词干提取或词形还原。

  2. 构建词语图:在指定窗口内,将每个词看作图中的一个节点,相邻的词之间有边。边的权重由它们的共现次数决定。

  3. 计算 TextRank:使用 NetworkX 中的 pagerank 函数计算词语的重要性权重,TextRank 公式与 PageRank 类似,使用一个阻尼系数来控制词语之间的重要性传递。

  4. 提取关键词:根据词语的权重进行排序,选择权重最高的前 N 个词语作为关键词。

3.2 自动摘要
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer

# 文本示例
sentences = [
    "the cat is on the table.",
    "the dog is in the house.",
    "there is a cat and a dog."
]

# 1. 计算句子相似度矩阵
def sentence_similarity_matrix(sentences):
    vectorizer = TfidfVectorizer()
    tfidf_matrix = vectorizer.fit_transform(sentences)
    sim_matrix = cosine_similarity(tfidf_matrix)
    return sim_matrix

# 2. 构建句子图
def build_sentence_graph(sentences):
    sim_matrix = sentence_similarity_matrix(sentences)
    graph = nx.from_numpy_array(sim_matrix)
    return graph

# 3. 提取摘要句
def extract_summary(sentences, top_n=2):
    sentence_graph = build_sentence_graph(sentences)
    ranks = textrank(sentence_graph)
    sorted_ranks = sorted(ranks.items(), key=lambda item: item[1], reverse=True)
    ranked_sentences = [sentences[i] for i, rank in sorted_ranks[:top_n]]
    return ranked_sentences

# 运行摘要提取
summary = extract_summary(sentences)
print("Summary:", summary)
3.2.1 代码解释:
  1. 计算句子相似度:通过 TfidfVectorizer 将每个句子表示为 TF-IDF 向量,然后计算句子之间的余弦相似度,生成句子相似度矩阵。

  2. 构建句子图:将每个句子作为图的节点,使用句子相似度矩阵的值作为边的权重。

  3. 计算 TextRank:使用 PageRank 算法计算句子的重要性。

  4. 提取摘要句:根据句子的重要性权重,选取权重最高的前 N 个句子作为摘要。

4. TextRank 的应用

4.1 关键词提取
  • 自然语言处理任务:在文本分类、信息检索等任务中,使用 TextRank 自动提取文档中的关键词,帮助理解文档主题。
4.2 自动摘要
  • 文档自动摘要:利用 TextRank 自动生成长文本的简洁摘要,帮助用户快速获取关键信息。
4.3 其他应用
  • 情感分析:通过提取文本中最重要的关键词,辅助情感分类任务。
  • 推荐系统:分析文本内容,通过提取高权重的关键词或者摘要句,理解用户兴趣和偏好。

5. TextRank 的优势与局限

5.1 优势
  1. 无需外部语料库:TextRank 不依赖训练数据,适用于无监督任务。
  2. 图模型:通过图模型可以很好地捕捉词语或句子之间的相对关系。
  3. 可扩展性强:不仅适用于关键词提取和自动摘要,还可以应用于其他基于图的 NLP 任务。
5.2 局限
  1. 对长文本不够有效:TextRank 更适合短文本或中等长度文本,对于非常长的文档,图的构建和计算可能会变得复杂。
  2. 不考虑词语的语义:TextRank 仅根据词语的共现关系来构建图,而不考虑词语之间的语义信息。

6. 总结

        TextRank 是一种基于图的排序算法,能够有效地用于关键词提取和自动摘要。通过将词语或句子表示为图的节点,并通过迭代计算节点的重要性,TextRank 提取出文档中最重要的词语或句子。与 TF-IDF 不同,TextRank 不依赖外部语料库,且不需要训练数据,因此非常适合无监督的文本分析任务。

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

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

相关文章

JavaWeb合集06-MySQL数据库

六、MySQL数据库 关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 使用表存储数据,格式统一, 便于维护. 使用SQL语言操作,标准统一,使用方便,可用于复杂…

js中map,filter,find,foreach的用法介绍

js中map,filter,find,foreach的用法介绍 在 JavaScript 中,数组提供了一些常用的迭代方法,如 map、filter、find 和 forEach,这些方法允许你对数组中的每个元素进行操作,下面是它们的用法和区别…

用示波器观测RC一阶电路零输入响应是否激励必须是方波信号

概述 RC一阶电路是一种简单但非常重要的电路,广泛应用于滤波、信号处理和时间常数分析等领域。在研究RC电路的动态特性时,零输入响应(Natural Response)是一项关键内容。本文将详细解析用示波器观测RC一阶电路零输入响应时&#…

基于 MyBatis Plus 分页封装分页方法

一、前言 作为一个 CRUD 工程师,查询必然少不了,分页查询更是常见,市面上也有很多成熟的分页插件,都各有优缺点,这里整理一下,基于 MybatisPlus 的分页插件进一步封装分页的公共方法。 二、对象封装 其实…

elementUI,设置日期,只能选择过去的和今天的日期

在 el-date-picker 组件中加&#xff1a;:picker-options"pickerOptions" <el-form-item label"票据生成日期&#xff1a;"> <el-date-picker v-model"date1" type"daterange" range-separator"至" value-format&…

Webpack 完整指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Webpack篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack介绍 目录 介绍 一、webpack 1.1、webpack是什么 1.2 webpack五个核心配置 1.…

学习threejs,拉伸几何体THREE.TubeGeometry管道

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️拉伸几何体THREE.TubeGeome…

医护人员排班|基于springBoot的医护人员排班系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息…

js 对网页表格内容进行全选

起因&#xff0c; 目的: 需要从一个数据库&#xff0c;手动选取数据&#xff0c;而且这个网页没有全选按钮&#xff0c;只能一个一个点&#xff0c;很烦。 所以写了一个简单的 js 脚本&#xff0c; 一键全选。 过程: 代码 1 function clickAllBoxes() {const checkboxes do…

HarmonyNext保存Base64文件到Download下

本文介绍如何保存Base64的文件到Download下 参考文档地址&#xff1a; 保存用户文件-Harmony Next 用到的是DOWNLOAD模式保存文件 用户在使用save接口时&#xff0c;可以将pickerMode配置为DOWNLOAD模式&#xff0c;该模式下会拉起授权接口&#xff0c;用户确认后会在公共路径…

ChatGPT丨R语言在生态环境数据统计分析、绘图、模型中的应用

第一单元&#xff1a;生态环境数据统计概述 1.1 生态环境数据特点及统计方法介绍 1&#xff0e;生态环境数据复杂性和多样性 2&#xff0e;生态环境数据类型及分布特点 3&#xff0e;生态环境数据主要统计分析方法及统计检验&#xff08;t-检验、F检验、卡方检验&#xff0…

PostgreSQL Windows系统初始化、登录、创建用户及数据库

文章目录 PostgreSQL初始化PostgreSQL登录 PostgreSQL初始化 initdb 到安装目录下&#xff0c;找到目录E:\postgresql\bin&#xff08;自己的安装目录&#xff09;&#xff0c;在该目录下使用管理员方式打开cmd窗口。 initdb.exe -D "E:\postgresql\bin" E:\postgre…

车载软件架构---软件定义汽车的复杂性

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

闹钟、绘制与TCP

闹钟 pro文件&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimer> #include<QTime> #include<QDebug> #include<QTimerEvent> #include<QDateTime> #include<QTextToSpeech> #i…

sql-labs靶场第十五关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库&#xff0c;查看数据库名称 ③爆表&#xff0c;查看security库的所有表 ④爆列&#xff0c;查看users表的所有列 ⑤成功获取用户名…

65.DDR3读写控制器的设计与验证(2)

&#xff08;1&#xff09;写FIFO和读FIFO的配置 &#xff08;2&#xff09;AXI接口写入控制代码&#xff1a; module axi_master_write (//全局变量input wire ACLK , //全局时钟input wire ARESETN , …

AI工具推荐合集

在数字化时代&#xff0c;AI工具的出现极大地改变了我们的工作和生活方式。无论是学术研究、创意设计还是日常写作&#xff0c;这些工具都能提供强大的支持。以下是一些值得推荐的AI工具&#xff0c;帮助您提高效率与创造力。 1. 包阅AI 官网链接: 包阅AI 包阅AI是一款智能A…

哪吒汽车的工资到底发没发?

联网圈第一预言家&#xff0c;也就是美团的王兴&#xff0c;早在新能源热钱最多的那几年就预言&#xff0c;未来中国汽车格局大概率是「3333」。 也就是3家央企、3家地方国企、3家民企和3家新势力…… 此言论一出&#xff0c;当时可以说惹急了很多车企&#xff0c;比如已经退…

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题&#xff08;180&#xff09; Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

ARINC 429总线协议

一、概述 ARINC 是美国航空无线电公司英文字头的缩写&#xff0c; 该公司1977年7月21日出版了“ARINC 429规范”一书&#xff0c;429规范就是飞机电子系统之间数字式数据传输的标准格式&#xff0c;在飞机上使用429总线的电子设备均应遵守这个规范&#xff0c;这样才能保证电子…