详细内容请看公众号版本:一文带你学会关键词提取算法—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最重要。可以得到下面的表:
结束\起始 | A | B | C |
---|---|---|---|
A | 0 | 1 | 1 |
B | 0 | 0 | 0 |
C | 0 | 0 | 0 |
横栏代表其实的节点,纵栏代表结束的节点。若两个节点间有链接关系,对应的值为1。
根据公式,需要将每一竖栏归一化(每个元素/元素之和),归一化的结果是:
结束\起始 | A | B | C |
---|---|---|---|
A | 0 | 1 | 1 |
B | 0 | 0 | 0 |
C | 0 | 0 | 0 |
上面的结果构成矩阵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)关键词提取:从文本中提取重要的关键词,用于文本分类、信息检索、搜索引擎优化等。
(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技术解析