热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TextRank系列之关键词提取算法

前期回顾:TF-IDF算法介绍及实现仅仅从词的统计信息出发,而没有充分考虑词之间的语义信息。现在本文将介绍一种考虑了相邻词的语义关系、基于图排序的关键

前期回顾:


TF-IDF算法介绍及实现

  仅仅从词的统计信息出发,而没有充分考虑词之间的语义信息。现在本文将介绍一种考虑了相邻词的语义关系、基于图排序的关键词提取算法TextRank。



简述:

用TextRank提取来提取关键词,用PageRank的思想来解释它:

  • 如果一个单词出现在很多单词后面的话,那么说明这个单词比较重要
  • 一个TextRank值很高的单词后面跟着的一个单词,那么这个单词的TextRank值会相应地因此而提高

在这里插入图片描述

  其思想非常简单:通过词之间的相邻关系构建网络,然后用PageRank迭代计算每个节点的rank值,排序rank值即可得到关键词。PageRank本来是用来解决网页排名的问题,网页之间的链接关系即为图的边,迭代计算公式如下:

    PR(Vi)=(1−d)+d∗∑j∈In(Vi)1∣Out(Vj)∣PR(Vj)PR\left(V_{i}\right)=(1-d)+d * \sum_{j \in I n\left(V_{i}\right)} \frac{1}{\left|Out\left(V_{j}\right)\right|} PR\left(V_{j}\right)PR(Vi)=(1d)+djIn(Vi)Out(Vj)1PR(Vj)

  其中,PR(Vi)PR\left(V_{i}\right)PR(Vi)表示结点ViV_{i}Vi的 rank 值,In(Vi)In(V_{i})In(Vi)表示结点ViV_{i}Vi的前驱结点集合,Out(Vj){Out\left(V_{j}\right)}Out(Vj)表示结点VjV_{j}Vj的后继结点集合,d为damping factor用于做平滑。

  网页之间的链接关系可以用图表示,那么怎么把一个句子(可以看作词的序列)构建成图呢?TextRank将某一个词与其前面的N个词、以及后面的N个词均具有图相邻关系(类似于N-gram语法模型)。具体实现:设置一个长度为N的滑动窗口,所有在这个窗口之内的词都视作词结点的相邻结点;则TextRank构建的词图为无向图。下图给出了由一个文档构建的词图(去掉了停用词并按词性做了筛选):
在这里插入图片描述
  考虑到不同词对可能有不同的共现(co-occurrence),TextRank将共现作为无向图边的权值。那么,TextRank的迭代计算公式如下:

  WS(Vi)=(1−d)+d∗∑j∈In(Vi)wji∑Vk∈Out(Vj)wjkWS(Vj)W S\left(V_{i}\right)=(1-d)+d * \sum_{j \in I n\left(V_{i}\right)} \frac{w_{j i}}{\sum_{V_{k} \in O u t\left(V_{j}\right)} w_{j k}} W S\left(V_{j}\right)WS(Vi)=(1d)+djIn(Vi)VkOut(Vj)wjkwjiWS(Vj)

评估:

接下来将评估TextRank在关键词提取任务上的准确率、召回率与F1-Measure,并与TFIDF做对比;准确率计算公式如下:

      Precision =1N∑i=0N−1∣Pi∩Ti∣∣Pi∣=\frac{1}{N} \sum_{i=0}^{N-1} \frac{\left|P_{i} \cap T_{i}\right|}{\left|P_{i}\right|}=N1i=0N1PiPiTi

其中,N为文档数量,PiP_{i}Pi 为文档i所提取出的关键词,TiT_{i}Ti为文档的标注关键词。召回率与F1的计算公式如下:

      Precision =1N∑i=0N−1∣Pi∩Ti∣∣Ti∣=\frac{1}{N} \sum_{i=0}^{N-1} \frac{\left|P_{i} \cap T_{i}\right|}{\left|T_{i}\right|}=N1i=0N1TiPiTi

      F1=2∗Precision ∗RecallPrecision +Recall F 1=\frac{2 * \text { Precision } * \text { Recall}}{\text { Precision }+\text { Recall }}F1= Precision + Recall 2 Precision  Recall

  测试集是由刘知远老师提供的网易新闻标注数据集,共有13702篇文档。Jieba完整地实现了关键词提取TFIDF与TextRank算法,基于Jieba-0.39的评估实验代码如下:

import jieba.analyse
import json
import codecsdef precision_recall_fscore_support(y_true, y_pred):"""evaluate macro precision, recall and f1-score."""doc_num = len(y_true)p_macro = 0.0r_macro = 0.0for i in range(doc_num):tp = 0true_len = len(y_true[i])pred_len = len(y_pred[i])for w in y_pred[i]:if w in y_true[i]:tp += 1p = 1.0 if pred_len == 0 else tp / pred_lenr = 1.0 if true_len == 0 else tp / true_lenp_macro += pr_macro += rp_macro /= doc_numr_macro /= doc_numreturn p_macro, r_macro, 2 * p_macro * r_macro / (p_macro + r_macro)file_path = 'data/163_chinese_news_dataset_2011.dat'
with codecs.open(file_path, 'r', 'utf-8') as fr:y_true = []y_pred = []for line in fr.readlines():d = json.loads(line)content = d['content']true_key_words = [w for w in set(d['tags'])]y_true.append(true_key_words)# for w in true_key_words:# jieba.add_word(w)key_word_pos = ['x', 'ns', 'n', 'vn', 'v', 'l', 'j', 'nr', 'nrt', 'nt', 'nz', 'nrfg', 'm', 'i', 'an', 'f', 't','b', 'a', 'd', 'q', 's', 'z']extract_key_words = jieba.analyse.extract_tags(content, topK=2, allowPOS=key_word_pos)# trank = jieba.analyse.TextRank()# trank.span = 5# extract_key_words = trank.textrank(content, topK=2, allowPOS=key_word_pos)y_pred.append(extract_key_words)prf = precision_recall_fscore_support(y_true, y_pred)print('precision: {}'.format(prf[0]))print('recall: {}'.format(prf[1]))print('F1: {}'.format(prf[2]))

  其中,每个文档提取的关键词数为2,并按词性做过滤;span表示TextRank算法中的滑动窗口的大小。评估结果如下:

方法PrecisionRecallF1-Measure
TFIDF0.26970.22560.2457
TextRank span=50.26080.21500.2357
TextRank span=70.26140.21550.2363

  其中,每个文档提取的关键词数为2,并按词性做过滤;span表示TextRank算法中的滑动窗口的大小。评估结果如下:

方法PrecisionRecallF1-Measure
TFIDF0.26970.22560.2457
TextRank span=50.26080.21500.2357
TextRank span=70.26140.21550.2363

  如果将标注关键词添加到自定义词典,则评估结果如下:

方法PrecisionRecallF1-Measure
TFIDF0.31450.27130.2913
TextRank span=50.28870.24420.2646
TextRank span=70.29030.24550.2660

  直观感受下关键词提取结果(添加了自定义词典):

// TFIDF, TextRank, labelled
['文强', '陈洪刚'] ['文强', '陈洪刚'] {'文强', '重庆'}
['内贾德', '伊朗'] ['伊朗', '内贾德'] {'制裁', '世博', '伊朗'}
['调控', '王珏林'] ['调控', '楼市'] {'楼市', '调控'}
['罗平县', '男子'] ['男子', '罗平县'] {'被砍', '副局长', '情感纠葛'}
['佟某', '黄玉'] ['佟某', '黄现忠'] {'盲井', '伪造矿难'}

从上述两组实验结果,可以发现:

  • TextRank与TFIDF均严重依赖于分词结果——如果某词在分词时被切分成了两个词,那么在做关键词提取时无法将两个词黏合在一起(TextRank有部分黏合效果,但需要这两个词均为关键词)。因此是否添加标注关键词进自定义词典,将会造成准确率、召回率大相径庭。
  • TextRank的效果并不优于TFIDF。
  • TextRank虽然考虑到了词之间的关系,但是仍然倾向于将频繁词作为关键词。

此外,由于TextRank涉及到构建词图及迭代计算,所以提取速度较慢。

参考作者:

作者:Treant
出处:http://www.cnblogs.com/en-heng/


推荐阅读
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 本文详细解析了 MySQL 5.7.20 版本中二进制日志(binlog)崩溃恢复机制的工作流程。假设使用 InnoDB 存储引擎,并且启用了 `sync_binlog=1` 配置,文章深入探讨了在系统崩溃后如何通过 binlog 进行数据恢复,确保数据的一致性和完整性。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • 利用ViewComponents在Asp.Net Core中构建高效分页组件
    通过运用 ViewComponents 技术,在 Asp.Net Core 中实现了高效的分页组件开发。本文详细介绍了如何通过创建 `PaginationViewComponent` 类并利用 `HelloWorld.DataContext` 上下文,实现对分页参数的定义与管理,从而提升 Web 应用程序的性能和用户体验。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • 利用GDAL库在Python中高效读取与处理栅格数据的详细指南 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • 运用Isotonic回归算法解决鸢尾花数据集中的回归挑战
    本文探讨了利用Isotonic回归算法解决鸢尾花数据集中的回归问题。首先介绍了Isotonic回归的基本原理及其在保持单调性方面的优势,并通过具体示例说明其应用方法。随后详细描述了鸢尾花数据集的特征和获取途径,最后展示了如何将Isotonic回归应用于该数据集,以实现更准确的预测结果。 ... [详细]
  • 如何判断一个度序列能否构成简单图——哈维尔-哈基米算法的应用与解析 ... [详细]
  • 本文初步探讨了PHP中基于JWT(JSON Web Token)的身份验证机制。具体流程包括:1. 客户端通过用户名和密码发起登录请求;2. 服务器接收并验证用户凭证的合法性,若验证通过,则生成并返回一个JWT令牌;3. 客户端接收该令牌,并在后续请求中携带此令牌以完成身份验证。这一机制不仅提高了安全性,还简化了会话管理。 ... [详细]
author-avatar
turneerpelliccia_291
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有