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

TextRank算法解析和scala代码实现

一. TextRank算法介绍TextRank算法想对来说,其实是很简单的一个算法。算法的流程类似Kleinberg的HITS算法,google的PageRank算法,不得不说是g


一. TextRank算法介绍
TextRank算法想对来说,其实是很简单的一个算法。算法的流程类似Kleinberg的HITS算法,google的PageRank算法,不得不说是google的pageRank算法的出现引发了搜索引擎的一次变革。PageRank算法成功运用到互联网上来评估网页的重要性,当用户搜索时,返回与搜索问题相关又又质量的网页。TextRank算法可以说借鉴了pageRank算法的思想,也非常成功得运用到文章的引文提取,关键词提取上。当然一个单纯的算法提取关键词,可能效果并不那么如意,可以结合其他算法,比如TF-IDF来筛选有力表达主题/文章中心思想的词语。

二. TextRank 算法解析
TextRank算法对文章关键词进行提取的过程,实际就是迭代计算一个由文章中的词语构建的有向有权图G=(V,E) 。其中集合V(图中的节点)有文章中的词语构成,中文我们可以利用ansj_seg进行分词筛选特定词性的词。集合E(图中的边)由文章中的词在特定的滑动窗口下组成。E是一个VxV的子集。图中任意两节点Vi,Vj之间的权重为Wij,而对于一个节点Vi,In(Vi)表示图中指向该节点的其他节点集合,入度。而Out(Vi)为节点Vi指向的其他节点的集合。

对于TextRank算法每次迭代是Vi节点的得分的计算公式为:

TextRank算法解析和scala代码实现

其中d是一个阻尼系数,其值在0到1之间。代表从图中一节点指向其他任意一节点的概率, 一般取值为 0.85。上述的公式,表示当前节点Vi的值为所有指向Vi的节点Vj给予的值的和。就相当于,我现在手上有1个苹果,如果我收集了我朋友给我的苹果,我将有多少个苹果的问题。假如我有两个朋友,他们会给我一些苹果,而我现在拥有的苹果数量就是他们给我的苹果数量的和。朋友A有3个苹果,但是同样他有3个朋友,而且需要给苹果给他的朋友,所以只能给我3/3=1个苹果。朋友B有6个苹果,他有3个朋友,那么他给我6/3=2个苹果。那我现在手头将有1+1+3=5个苹果。实际中还要乘阻尼系数。TextRank算法就是这样迭代计算每个节点的值,而算法停止可以采用指定的迭代次数或者图中节点的值跟上次结果值的误差是否小于一个制定的极限值,一般取值为:0.0001 

三. TextRank 算法文本关键词提取
主要步骤:

1.    利用分词工具对文本进行分词

2.    指定滑动窗口大小

3.    滑动窗口经过文本词组,构建有向有权图。

4.    迭代计算有向有权图,直到收敛。

 

注意:在构建有向有权图时候,只筛选特定词性的词作为节点,比如名词,动词,形容词等,同时删除停用词。

 

举例:

(1)  一文本,对其进行分词之后,词组组成一个集合:

 

       T=[S1,S2,S3,S1,S5,S6,S7,S8,S9]

 

(2)  指定滑动窗口大小为3

 

(3)  窗口里面的词组构建图,每次都是以窗口头节点为主节点。如:

 

1.窗口第一次经过的词组,那么组成的边有:(S1,S2),(S2,S1),(S1,S3),(S3,S1)

TextRank算法解析和scala代码实现


2.窗口第二次经过的词组,组成的边有:(S2,S3),(S3,S1),(S2,S1),(S1,S2)。遇到重叠的边,则权重加1.

TextRank算法解析和scala代码实现


3  构建图完成之后,按照textRank算法的执行步骤,迭代计算,直到收敛。

 

4  最后对节点的权重排序输出。

四. TextRank 算法scala 代码实现
 

TextRank算法的实现,这里采用scala,分词工具采用ansj_seg,这里scala代码实现的TextRank算法,只实现关键词的提取,没有实现句子提取,后续再补充。

代码下载路径:http://download.csdn.net/detail/aijianiula/9744465

调用方式:

object TextRankTest{
  def main(args: Array[String]) {
    val tr = new TextRank
    tr.setStopword(Config.STOP_WORDS_FILE)//停用词
 
    val text = "机器学习是近20多年兴起的一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。"
 
    val tags = tr.textrank(sentence = text,topK = 10, allowPOS = List("ns", "vn", "n", "nr", "nt", "mama"))
    tags.foreach(println)
  }
}

结果:
(算法,n,1.0)
(学科,n,0.963356)
(理论,n,0.934734)
(分析,vn,0.85816)
(机器学习,n,0.723762)
(数据,n,0.615997)
(规律,n,0.537537)
(设计,vn,0.474728)
(概率论,n,0.466409)

 


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
author-avatar
开发者小白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有