关键词提取 | 基于Textrank算法的两种关键词提取

目录

一、PageRank算法

二、TextRank算法

1. 关键词抽取(keyword extraction)

2. 关键短语抽取(keyphrase extration)

3. 关键句抽取(sentence extraction)

三、TextRank算法实现

1. 基于Textrank4zh的TextRank算法实现

2. 基于jieba的TextRank算法实现

3. 基于SnowNLP的TextRank算法实现

四、PageRank算法与TextRank算法的区别


TextRank 算法是一种基于谷歌的 PageRank 算法的用于文本的基于图的排序算法,通过把文本分割成若干组成单元(单词、句子)并建立图模型,利用投票机制对文本中的重要成分进行排序,常用于关键词提取和文本摘要。和 LDA、HMM 等模型不同, TextRank 不需要事先对多篇文档进行学习训练, 因其简洁有效而得到广泛应用

我们知道,关键词是能够表达文档中心内容的词语,常用于计算机系统标引论文内容特征、信息检索、系统汇集以供读者检阅。关键词提取是文本挖掘领域的一个分支,是文本检索、文档比较、摘要生成、文档分类和聚类等文本挖掘研究的基础性工作。


一、PageRank算法

PageRank 算法通过计算网页链接的数量和质量来粗略估计网页的重要性,算法创立之初即应用在谷歌的搜索引擎中,对网页进行排名。 PageRank 算法的核心思想如下:

  • 链接数量:如果一个网页被越多的其他网页链接,说明这个网页越重要,即该网页的PR值(PageRank值)会相对较高;
  • 链接质量:如果一个网页被一个越高权值的网页链接,也能表明这个网页越重要,即一个PR值很高的网页链接到一个其他网页,那么被链接到的网页的PR值会相应地因此而提高。

我们知道,PageRank (PR) 是一种用于计算网页权重的算法。我们可以把所有的网页看成一个大的有向图。在此图中,节点是网页。如果网页 A 有指向网页 B 的链接,则它可以表示为从 A 到 B 的有向边。构建完整个图后,我们可以通过以下公式为网页分配权重

其中,S(V_{i})是网页的重要性(PR 值),d是阻尼系数,一般为 0.85,ln(V_{i})是整个互联网中所存在的有指向网页的链接的网页集合,Out(V_{j})是网页j中存在的指向所有外部网页的链接的集合,|Out(V_{j})|该集合中元素的个数。

这是一个示例,可以更好地理解上面的符号。我们有一个图表来表示网页如何相互链接。每个节点代表一个网页,箭头代表边。我们想得到网页 e 的权重。

我们可以将上述函数中的求和部分重写为更简单的版本:

我们可以通过下面的函数得到网页 e 的权重:

我们可以看到网页 e 的权重取决于入站页面的权重。我们需要多次运行此迭代才能获得最终权重。初始化时,每个网页的重要性为 1


二、TextRank算法

TextRank 算法是一种基于图的用于关键词抽取和文档摘要的排序算法,由谷歌的网页重要性排序算法 PageRank 算法改进而来,它利用一篇文档内部的词语间的共现信息(语义)便可以抽取关键词,它能够从一个给定的文本中抽取出该文本的关键词、关键词组,并使用抽取式的自动文摘方法抽取出该文本的关键句。TextRank 算法的基本思想是将文档看作一个词的网络,该网络中的链接表示词与词之间的语义关系

TextRank 算法计算公式:

其中,WS(V_{i}) 表示句子 i 的权重,右侧的求和表示每个相邻句子对本句子的贡前程度在单文档中,我们可以粗略的认为所有句子都是相邻的,无需像多文档一样进行多个窗的生成和抽取,仅需单一文档窗口即可,W_{ji} 表示两个句子的相似度 WS(V_{j}) 代表上次选代出的句子 j 的权重。d 是阻尼系数,一般为0.85。

TextRank算法主要包括:关键词抽取、关键短语抽取、关键句抽取

1. 关键词抽取(keyword extraction)

关键词抽取是指从文本中确定一些能够描述文档含义的术语的过程。对关键词抽取而言,用于构建顶点集的文本单元可以是句子中的一个或多个字;根据这些字之间的关系(比如:在一个框中同时出现)构建边。根据任务的需要,可以使用语法过滤器(syntactic filters)对顶点集进行优化。语法过滤器的主要作用是将某一类或者某几类词性的字过滤出来作为顶点集。

2. 关键短语抽取(keyphrase extration)

关键词抽取结束后,我们可以得到的 N 个关键词,在原始文本中相邻的关键词构成关键短语。因此,从 get_keyphrases 函数的源码中我们可以看到,它先调用 get_keywords 抽取关键词,然后分析关键词是否存在相邻的情况,最后确定哪些是关键短语。

3. 关键句抽取(sentence extraction)

句子抽取任务主要针对的是自动摘要这个场景,将每一个 sentence 作为一个顶点,根据两个句子之间的内容重复程度来计算他们之间的“相似度”,以这个相似度作为联系,由于不同句子之间相似度大小不一致,在这个场景下构建的是以相似度大小作为 edge 权重的有权图。


三、TextRank算法实现

1. 基于Textrank4zh的TextRank算法实现

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Project : 关键词提取
@File    : 基于Textrank4zh的TextRank算法实现.py
@IDE     : PyCharm
@Author  : 源于花海
@Date    : 2023/10/10 21:24
"""
from textrank4zh import TextRank4Keyword


def keywords_extraction(text):
    tr4w = TextRank4Keyword()
    tr4w.analyze(text, window=2, lower=True)
    keywords = tr4w.get_keywords(6, word_min_len=2)
    return keywords


if __name__ == "__main__":
    text = "自然语言处理是一门涉及计算机科学、人工智能和语言学等多个领域的交叉学科。"
    keywords = keywords_extraction(text)
    print(keywords)

2. 基于jieba的TextRank算法实现

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Project : 关键词提取
@File    : 基于jieba的TextRank算法实现.py
@IDE     : PyCharm
@Author  : 源于花海
@Date    : 2023/10/10 22:12
"""
import jieba
from jieba.analyse import textrank

# 定义待处理文本
text = "自然语言处理是一门涉及计算机科学、人工智能和语言学等多个领域的交叉学科。"

# 使用jieba库的TextRank算法提取关键词
keywords = textrank(text, topK=3)

print("关键词提取结果:", keywords)

关键词提取结果:

分词结果: ['自然', '语言', '处理', '是', '一门', '涉及', '计算机', '科学', '、', '人工智能', '和', '语言学', '等', '多个', '领域', '的', '交叉', '学科', '。']
关键词提取结果: ['计算机科学', '语言学', '人工智能']

3. 基于SnowNLP的TextRank算法实现

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Project : 关键词提取
@File    : 基于SnowNLP的TextRank算法实现.py
@IDE     : PyCharm
@Author  : 源于花海
@Date    : 2023/10/10 22:24
"""
from snownlp import SnowNLP
from snownlp import seg

# 定义待处理文本
text = "自然语言处理是一门涉及计算机科学、人工智能和语言学等多个领域的交叉学科。"

# 使用SnowNLP的分词功能对文本进行分词
words = SnowNLP(text).words

# 使用SnowNLP的TextRank算法提取关键词
keywords = SnowNLP(text).keywords(3)

print("分词结果:", words)
print("关键词提取结果:", keywords)

输出结果如下:

分词结果: ['自然', '语言', '处理', '是', '一门', '涉及', '计算机', '科学', '、', '人工智能', '和', '语言学', '等', '多个', '领域', '的', '交叉', '学科', '。']
关键词提取结果: ['语言', '处理', '自然']

可以看到,我们成功地使用 SnowNLP 的 TextRank 算法提取出了该文本中的关键词:语言、处理、自然


四、PageRank算法与TextRank算法的区别

  • PageRank 算法根据网页之间链接关系构造网络,TextRank 算法根据词之间共现关系构造网络;
  • PageRank 算法构造的网络中的边是有向无权边,TextRank 算法构造的网络中的边是无向有权边
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【资源说明】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载食用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【项目介绍】 基于Python的中文本关键词抽取源码(分别使用TF-IDF、TextRank、Word2Vec词聚类三种方法)+数据集和说明.zip 一篇文档的关键词等同于最能表达文档主旨的N个词语,即对于文档来说最重要的词,因此,可以将文本关键词抽取问题转化为词语重要性排序问题,选取排名前TopN个词语作为文本关键词。目前,主流的文本关键词抽取方法主要有以下两大类: (1)基于统计的关键词提取方法 该方法根据统计信息,如词频,来计算得到文档中词语的权重,按权重值排序提取关键词。TF-IDF和TextRank均属于此类方法,其中TF-IDF方法通过计算单文本词频(Term Frequency, TF)和逆文本频率指数(Inverse Document Frequency, IDF)得到词语权重;TextRank方法基于PageRank的思想,通过词语共现窗口构建共现网络,计算词语得分。此类方法简单易行,适用性较强,然而未考虑词序问题。 (2)基于机器学习的关键词提取方法 该方法包括了SVM、朴素贝叶斯等有监督学习方法,以及K-means、层次聚类等无监督学习方法。在此类方法中,模型的好坏取决于特征提取,而深度学习正是特征提取的一种有效方式。由Google推出的Word2Vec词向量模型,是自然语言领域中具有代表性的学习工具。它在训练语言模型的过程中将词典映射到一个更抽象的向量空间中,每一个词语通过高维向量表示,该向量空间中两点之间的距离就对应两个词语的相似程度。 基于以上研究,本文分别采用**TF-IDF方法、TextRank方法和Word2Vec词聚类方法**,利用Python语言进行开发,实现文本关键词的抽取。 总结了三种常用的抽取文本关键词的方法:TF-IDF、TextRank和Word2Vec词向量聚类,并做了原理、流程以及代码的详细描述。因本文使用的测试语料较为特殊且数量较少,未做相应的结果分析,根据观察可以发现,得到的十个文本关键词都包含有文本的主旨信息,其中TF-IDF和TextRank方法的结果较好,Word2Vec词向量聚类方法的效果不佳,这与文献[8]中的结论是一致的。文献[8]中提到,对单文档直接应用Word2Vec词向量聚类方法时,选择聚类中心作为文本的关键词本身就是不准确的,因此与其距离最近的N个词语也不一定是关键词,因此用这种方法得到的结果效果不佳;而TextRank方法是基于图模型的排序算法,在单文档关键词抽取方面有较为稳定的效果,因此较多的论文是在TextRank的方法上进行改进而提升关键词抽取的准确率。 另外,本文的实验目的主要在于讲解三种方法的思路和流程,实验过程中的某些细节仍然可以改进。例如Word2Vec模型训练的原始语料可加入相应的专业性文本语料;标题文本往往包含文档的重要信息,可对标题文本包含的词语给予一定的初始权重;测试数据集可采集多个分类的长文本,与之对应的聚类算法KMeans()函数中的n_clusters参数就应当设置成分类的个数;根据文档的分词结果,去除掉所有文档中都包含某一出现频次超过指定阈值的词语;等等。各位可根据自己的实际情况或者参考论文资料进行参数的优化以及细节的调整
好的,我可以为您提供一些关于用Go语言实现TextRank算法的指导。 首先,TextRank算法是一个基于图的文本摘要算法,主要用于对文本进行关键词提取和摘要生成。它使用图的形式来表示文本中的句子和词语之间的关系,然后通过迭代计算每个节点的重要性来生成摘要。 在Go语言中,可以使用图库来实现TextRank算法,例如gonum/graph库。该库提供了一个图数据结构和一些常用的算法,可以方便地实现TextRank算法。 以下是一个简单的代码示例,用于实现基本的TextRank算法: ```go package main import ( "fmt" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/encoding/dot" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/graph/algorithm" ) func main() { // 创建一个简单图 g := simple.NewWeightedUndirectedGraph(0, 0) // 添加节点 n1 := g.NewNode() n2 := g.NewNode() n3 := g.NewNode() n4 := g.NewNode() // 添加边和权重 g.SetWeightedEdge(g.NewWeightedEdge(n1, n2, 0.5)) g.SetWeightedEdge(g.NewWeightedEdge(n1, n3, 0.3)) g.SetWeightedEdge(g.NewWeightedEdge(n2, n3, 0.8)) g.SetWeightedEdge(g.NewWeightedEdge(n3, n4, 0.2)) // 计算节点的pagerank值 pr := algorithm.PageRank(g, 0.85, 1e-5, nil) // 输出每个节点的pagerank值 for _, n := range g.Nodes() { fmt.Printf("Node %v: Pagerank %v\n", n.ID(), pr[n.ID()]) } // 将图转换为DOT格式 dotdata, _ := dot.Marshal(g, "", "", " ") // 输出DOT格式的图 fmt.Println(string(dotdata)) } ``` 在上面的示例中,我们使用了gonum/graph库来创建一个简单的图,并为每个节点设置了不同的权重。然后,我们使用了algorithm.PageRank函数来计算每个节点的pagerank值,并输出了结果。最后,我们使用dot.Marshal函数将图转换为DOT格式,并输出了结果。 当然,这只是一个简单的示例,实际上TextRank算法中还涉及到一些文本预处理和特征提取的步骤。但是,使用gonum/graph库可以方便地实现这些步骤,并且可以轻松地扩展到更大的文本数据集。 希望这些指导对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值