一文带你学会关键词提取算法---TextRank 和 FastTextRank实践

在这里插入图片描述
详细内容请看公众号版本:一文带你学会关键词提取算法—TextRank 和 FastTextRank实践

TextRank算法介绍
原理介绍:https://www.letianbiji.com/article/101666.html
首先要从PageRank讲起 PageRank最开始用来计算网页的重要性。整个www可以看作一张有向图图,节点是网页。如果网页A存在到网页B的链接,那么有一条从网页A指向网页B的有向边。
构造完图后,使用下面的公式:
在这里插入图片描述

𝑆(𝑉𝑖)是网页i的中重要性(PR值)。d是阻尼系数,一般设置为0.85。𝐼𝑛(𝑉𝑖)是存在指向网页i的链接的网页集合。𝑂𝑢𝑡(𝑉𝑗)是网页j中的链接存在的链接指向的网页的集合。|𝑂𝑢𝑡(𝑉𝑗)|是集合中元素的个数。

PageRank需要使用上面的公式多次迭代才能得到结果。初始时,可以设置每个网页的重要性为1。上面公式等号左边计算的结果是迭代后网页i的PR值,等号右边用到的PR值全是迭代前的。

举个例子:
在这里插入图片描述
上图表示了三张网页之间的链接关系,直觉上网页A最重要。可以得到下面的表:

结束\起始ABC
A011
B000
C000

横栏代表其实的节点,纵栏代表结束的节点。若两个节点间有链接关系,对应的值为1。
根据公式,需要将每一竖栏归一化(每个元素/元素之和),归一化的结果是:

结束\起始ABC
A011
B000
C000

上面的结果构成矩阵M。我们用matlab迭代100次看看最后每个网页的重要性:

M = [0 1 1 
    0 0 0
    0 0 0];
 
PR = [1; 1 ; 1];
 
for iter = 1:100
    PR = 0.15 + 0.85*M*PR;
    disp(iter);
    disp(PR);
end

运行结果(省略部分):

.....
 
    95
 
    0.4050
    0.1500
    0.1500
 
    96
 
    0.4050
    0.1500
    0.1500
 
    97
 
    0.4050
    0.1500
    0.1500
 
    98
 
    0.4050
    0.1500
    0.1500
 
    99
 
    0.4050
    0.1500
    0.1500
 
   100
 
    0.4050
    0.1500
    0.1500

最终A的PR值为0.4050,B和C的PR值为0.1500。
如果把上面的有向边看作无向的(其实就是双向的),那么:

M = [0 1 1 
    0.5 0 0
    0.5 0 0];
 
PR = [1; 1 ; 1];
 
for iter = 1:100
    PR = 0.15 + 0.85*M*PR;
    disp(iter);
    disp(PR);
end

运行结果(省略部分):

.....
 
    98
 
    1.4595
    0.7703
    0.7703
 
    99
 
    1.4595
    0.7703
    0.7703
 
   100
 
    1.4595
    0.7703
    0.7703

依然能判断出A、B、C的重要性。

使用TextRank提取关键字

将原文本拆分为句子,在每个句子中过滤掉停用词(可选),并只保留指定词性的单词(可选)。由此可以得到句子的集合和单词的集合。

每个单词作为pagerank中的一个节点。设定窗口大小为𝑘,假设一个句子依次由下面的单词组成:
𝑤1,𝑤2,𝑤3,𝑤4,𝑤5,…,𝑤𝑛
[𝑤1,𝑤2,…,𝑤𝑘]、[𝑤2,𝑤3,…,𝑤𝑘+1]、[𝑤3,𝑤4,…,𝑤𝑘+2]等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边。

基于上面构成,可以计算出每个单词节点的重要性。最重要的若干单词可以作为关键词。
在这里详细解释一下窗口的作用是什么。窗口就相当于是一个pagerank中的网页,用来构建共现表格,窗口建立共现关系: 设定一个窗口大小,遍历文本中的词语。 在每个窗口内,窗口内的词语被认为是共现的。 窗口的大小可以根据具体任务和文本特点来调整。
例如,考虑以下文本: “TextRank is an algorithm for keyword extraction.” 分词后得到词语序列 [“TextRank”, “is”, “an”, “algorithm”, “for”, “keyword”, “extraction”]。

如果设置窗口大小为2,就会得到以下边的关系: 
("TextRank", "is"),  	
("TextRank", "an"),  	
("is", "an"),  
("is", "algorithm"),  
("an", "algorithm"),  
("an", "for"),  
("algorithm", "for"),  
("algorithm", "keyword"),  
("for", "keyword"),  
("for", "extraction"),  
("keyword", "extraction") 

在这里,每个词语对应一个节点,窗口内共现的词语之间构建边。 这样,通过窗口内的共现关系,就建立了图的节点和边,为后续的TextRank算法提供了基础。

使用TextRank提取关键短语

若原文本中存在若干个关键词相邻的情况,那么这些关键词可以构成一个关键短语。

例如,在一篇介绍“支持向量机”的文章中,可以找到三个关键词支持、向量、机。通过关键短语提取,可以得到支持向量机。 使用TextRank提取摘要,将每个句子看成图中的一个节点,若两个句子之间有相似性,认为对应的两个节点之间有一个无向有权边,权值是相似度。

通过pagerank算法计算得到的重要性最高的若干句子可以当作摘要。

论文中使用下面的公式计算两个句子Si和Sj的相似度:
在这里插入图片描述

分子是在两个句子中都出现的单词的数量。|Si|是句子i的单词数。

由于是有权图,PageRank公式略做修改:
在这里插入图片描述

具体架构如下:
1.文本预处理:     
	清洗文本数据,去除无关字符、标点符号、停用词等。     
	进行分词,将文本划分为单独的词语。  
2.构建图(图的节点和边):     
	将文本中的词语作为图的节点。根据词语之间的共现关系构建边。通常可以选择在一个窗口内共同出现的词语之间建立边。 	
	这一步的具体操作包括以下几个阶段: 	 	
	2.1 分词: 将文本进行分词,将文本拆分为一个个独立的词语。 	 	
	2.2 窗口建立共现关系: 设定一个窗口大小,遍历文本中的词语,在每个窗口内,窗口内的词语被认为是共现的。 	窗口的大小可以根据具体任务和文本特点来调整。 	 	
	2.3 建立图的节点和边:将文本中的每个词语作为图的节点。对于在窗口内共现的词语,为它们之间建立一条边。这样,如果两个词在同一个窗口内同时出现,它们之间就有一条边。通过窗口内的共现关系,就建立了图的节点和边,为后续的TextRank算法提供了基础。在TextRank的迭代过程中,节点之间的权重将根据共现关系进行调整,最终得到关键词的排序。 	 	
	2.4 计算节点之间的权重:为图中的每个节点计算权重。 	通常使用词语之间的共现次数或者其他相关度作为权重。 	 	
	2.5 利用TextRank算法进行迭代:初始化节点的权重。迭代更新节点的权重,直到收敛。TextRank的更新公式类似于PageRank算法,涉及到节点之间的传播和权重的调整。  	
	2.6 根据节点的权重排序:根据节点的权重值进行排序,选择排名靠前的词作为关键词。  	
	2.7 提取关键词:根据排序后的节点,选择排名靠前的词作为关键词。可以根据需求选择提取的关键词数量。 

部署
项目地址:https://github.com/letiantian/TextRank4ZH.git
关于TextRank4ZH的原理和使用介绍:https://www.letianbiji.com/article/101666.html
(1)拉取项目

git clone https://github.com/letiantian/TextRank4ZH.git

(2)安装依赖

pip install textrank4zh
pip install jieba >= 0.35
pip install numpy >= 1.7.1
pip install networkx >= 1.9.1

(3)运行代码
本文章在TextRank4ZH/test/doc目录下创建了一个test.txt文件进行测试,并将example01.py中读取文件的路径修改为/mnt/workspace/TextRank4ZH/test/doc/test.txt。
test.txt的文件内容如下:
在这里插入图片描述
在终端运行如下代码:

python TextRank4ZH/example/example01.py

结果输出:
在这里插入图片描述
FastTextRank
原理介绍:
FastText是一个基于Python的库,它致力于提供高效的文本排名和摘要生成解决方案。该项目灵感来源于Facebook的FastText模型和经典的TextRank算法,旨在结合两者的优点,以更快速、准确的方式处理大量文本数据。

FastText 是一种流行的词嵌入模型,它能够捕捉词汇的上下文关系,并且在计算效率上优于其他如Word2Vec的模型。而TextRank 则是自然语言处理中的经典算法,用于文本摘要和关键词提取,通过构建词语之间的图谱并进行PageRank计算来确定重要性。 FastTextRank将这两者结合起来,首先利用FastText获取每个单词的语义表示,然后应用TextRank算法来评估句子的重要性。这种混合方法使得它在处理文本时不仅考虑了单词的表面形式,还考虑到了它们的深层含义,从而提高了文本摘要的质量和准确性。

一些可以优化的方案:https://blog.csdn.net/phynikesi/article/details/109229117

部署
项目地址:https://github.com/ArtistScript/FastTextRank.git
(1)项目拉取
在终端中运行:

git clone https://github.com/ArtistScript/FastTextRank.git

(2)安装依赖
安装最新包即可

pip install Numpy
pip install gensim
pip install FastTextRank

(3)运行项目
本文在FastTextRank/FastTextRank/test目录下创建test.txt文件进行测试,并将KeyWord.py文件中读取文件的路径修改为:FastTextRank/FastTextRank/test/test.txt
test.txt内容
在这里插入图片描述
将提取关键词的数修改为20进行对比

在这里插入图片描述
在终端中运行:

python FastTextRank/FastTextRank/test/KeyWord.py

运行结果在这里插入图片描述

  1. 应用场景
    (1)关键词提取:从文本中提取重要的关键词,用于文本分类、信息检索、搜索引擎优化等。
    (2)文本摘要生成:提取文本中最重要的句子,生成简洁的摘要,广泛用于新闻、报告、文章的自动摘要生成。
    (3)话题检测:从大规模文本数据中检测和提取主要话题,用于社交媒体分析、舆情监控等。
    (4)推荐系统:提取用户评论中的关键词,用于个性化推荐系统。
    3.特点
    (1)TextRank
    无监督学习: 不需要预先标注的数据,适用于各种语言和领域。
    基于图的模型: 利用词语之间的共现关系,能有效捕捉文本的结构信息。
    易于理解和实现: 算法简单,易于实现和扩展。
    (2)FastTextRank
    高效性: 相较于传统的TextRank,FastTextRank在处理大规模数据时具有显著的速度优势。
    适用性广: 适用于需要高效关键词提取和文本摘要的各种场景。
    保持准确性: 在提高计算速度的同时,保持了较高的关键词提取和摘要生成准确性。

参考:
https://zhuanlan.zhihu.com/p/359232044(解释了TFIDF算法的部分内容)
https://blog.csdn.net/qq_37977007/article/details/135610596
https://www.letianbiji.com/article/101666.html
https://blog.csdn.net/phynikesi/article/details/109229117

合著作者:USTB-zmh

相关阅读
大模型名词扫盲贴
RAG实战-QAnything
提升大型语言模型性能的新方法:Query Rewriting技术解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值