hanlp关键词提取算法TextRank

欢迎关注鄙人公众号,技术干货随时看!
在这里插入图片描述

技术交流qq群: 659201069

鄙人的新书《elasticsearch7完全开发指南》,欢迎订阅!

https://wenku.baidu.com/view/8ff2ce94591b6bd97f192279168884868762b8e7

《kibana权威指南》

https://wenku.baidu.com/view/24cfee1ce43a580216fc700abb68a98270feac21

TextRank是在Google的PageRank算法启发下,针对文本里的句子设计的权重算法,目标是自动摘要。它利用投票的原理,让每一个单词给它的邻居(术语称窗口)投赞成票,票的权重取决于自己的票数。这是一个“先有鸡还是先有蛋”的悖论,PageRank采用矩阵迭代收敛的方式解决了这个悖论。引用自http://www.hankcs.com/nlp/textrank-algorithm-to-extract-the-keywords-java-implementation.html。本博文通过hanlp关键词提取的一个Demo,并通过图解的方式来讲解TextRank的算法。

//长句子String content = "程序员(英文Programmer)是从事程序开发、维护的专业人员。" +"一般将程序员分为程序设计人员和程序编码人员," +"但两者的界限并不非常清楚,特别是在中国。" +"软件从业人员分为初级程序员、高级程序员、系统" +"分析员和项目经理四大类。";

最后提取的关键词是:[程序员, 程序, 分为, 人员, 软件]

下面来分析为什么会提取出这5个关键词

第一步:分词

把content 通过一个的分词算法进行分词,这里采用的是Viterbi算法也就是HMM算法,具体请参与我的另篇文章https://blog.csdn.net/zhaojianting/article/details/78194317。分词后(当然首先应把停用词、标点、副词之类的去除)的结果是:
  
[程序员, 英文, Programmer, 从事, 程序, 开发, 维护, 专业, 人员, 程序员, 分为, 程序, 设计, 人员, 程序, 编码, 人员, 界限, 并不, 非常, 清楚, 特别是在, 中国, 软件, 从业人员, 分为, 程序员, 高级, 程序员, 系统分析员, 项目经理, 四大]

第二步:构造窗口

hanlp的实现代码如下:

 Map<String, Set<String>> words = new TreeMap<String, Set<String>>();Queue<String> que = new LinkedList<String>();for (String w : wordList){if (!words.containsKey(w)){words.put(w, new TreeSet<String>());}// 复杂度O(n-1)if (que.size() >= 5){que.poll();}for (String qWord : que){if (w.equals(qWord)){continue;}//既然是邻居,那么关系是相互的,遍历一遍即可words.get(w).add(qWord);words.get(qWord).add(w);}que.offer(w);}

这个代码的功能是为分个词构造窗口,这个词前后各四个词就是这个词的窗口,如词分词后一个词出现了多次,像**[程序员]**,那就是把每次出现取一次窗口,然后把各次结果合并去重,最后结果是:程序员=[Programmer, 专业, 中国, 人员, 从业人员, 从事, 分为, 四大, 开发, 程序, 系统分析员, 维护, 英文, 设计, 软件, 项目经理, 高级]。最后形成的窗口:

Map<String, Set<String>> words = {Programmer=[从事, 开发, 程序, 程序员, 维护, 英文], 专业=[人员, 从事, 分为, 开发, 程序, 程序员, 维护], 中国=[从业人员, 分为, 并不, 清楚, 特别是在, 程序员, 软件, 非常], 人员=[专业, 分为, 并不, 开发, 清楚, 界限, 程序, 程序员, 维护, 编码, 设计, 非常], 从业人员=[中国, 分为, 清楚, 特别是在, 程序员, 软件, 高级], 从事=[Programmer, 专业, 开发, 程序, 程序员, 维护, 英文], 分为=[专业, 中国, 人员, 从业人员, 特别是在, 程序, 程序员, 系统分析员, 维护, 设计, 软件, 高级], 四大=[程序员, 系统分析员, 项目经理, 高级], 并不=[中国, 人员, 清楚, 特别是在, 界限, 程序, 编码, 非常], 开发=[Programmer, 专业, 人员, 从事, 程序, 程序员, 维护, 英文], 清楚=[中国, 人员, 从业人员, 并不, 特别是在, 界限, 软件, 非常], 特别是在=[中国, 从业人员, 分为, 并不, 清楚, 界限, 软件, 非常], 界限=[人员, 并不, 清楚, 特别是在, 程序, 编码, 非常], 程序=[Programmer, 专业, 人员, 从事, 分为, 并不, 开发, 界限, 程序员, 维护, 编码, 英文, 设计], 程序员=[Programmer, 专业, 中国, 人员, 从业人员, 从事, 分为, 四大, 开发, 程序, 系统分析员, 维护, 英文, 设计, 软件, 项目经理, 高级], 系统分析员=[分为, 四大, 程序员, 项目经理, 高级], 维护=[Programmer, 专业, 人员, 从事, 分为, 开发, 程序, 程序员], 编码=[人员, 并不, 界限, 程序, 设计, 非常], 英文=[Programmer, 从事, 开发, 程序, 程序员], 设计=[人员, 分为, 程序, 程序员, 编码], 软件=[中国, 从业人员, 分为, 清楚, 特别是在, 程序员, 非常, 高级], 非常=[中国, 人员, 并不, 清楚, 特别是在, 界限, 编码, 软件], 项目经理=[四大, 程序员, 系统分析员, 高级], 高级=[从业人员, 分为, 四大, 程序员, 系统分析员, 软件, 项目经理]}

第三步:迭代投票

每个词最后的投票得分由这个词的窗口进行多次迭代投票决定,迭代的结束条件就是大于最大迭代次数这里是200次,或者两轮之前某个词的权重小于某一值这里是0.001f。看下代码:

Map<String, Float> score = new HashMap<String, Float>();//依据TF来设置初值for (Map.Entry<String, Set<String>> entry : words.entrySet()){ score.put(entry.getKey(),sigMoid(entry.getValue().size()));}System.out.println(score);for (int i = 0; i < max_iter; ++i){Map<String, Float> m = new HashMap<String, Float>();float max_diff = 0;for (Map.Entry<String, Set<String>> entry : words.entrySet()){String key = entry.getKey();Set<String> value = entry.getValue();m.put(key, 1 - d);for (String element : value){int size = words.get(element).size();if (key.equals(element) || size == 0) continue;m.put(key, m.get(key) + d / size * (score.get(element) == null ? 0 : score.get(element)));}max_diff = Math.max(max_diff, Math.abs(m.get(key) - (score.get(key) == null ? 0 : score.get(key))));}score = m;if (max_diff <= min_diff) break;}System.out.println(score);return score;}

投票的原理拿Programmer=[从事, 开发, 程序, 程序员, 维护, 英文],这个词来说明,Programmer最后的得分是由**[从事, 开发, 程序, 程序员, 维护, 英文]**,这6个词依次投票决定的,每个词投出去的分数是和他本身的权重相关的。

1、投票开始前每个词初始化了一个权重,score.put(entry.getKey(),sigMoid(entry.getValue().size())),这个权重是0到1之间,公式是

//value是每个词窗口的大小public static float sigMoid(float value) {return (float)(1d/(1d+Math.exp(-value)));} 

这个函数的公式和图像如下,因为value一定是大于0的,所以sigMod值属于(0,1)
这里写图片描述

初始化后的分词是:{特别是在=0.99966466, 程序员=0.99999994, 编码=0.99752736, 四大=0.98201376, 英文=0.9933072, 非常=0.99966466, 界限=0.99908894, 系统分析员=0.9933072, 从业人员=0.99908894, 程序=0.99999774, 专业=0.99908894, 项目经理=0.98201376, 设计=0.9933072, 从事=0.99908894, Programmer=0.99752736, 软件=0.99966466, 人员=0.99999386, 清楚=0.99966466, 中国=0.99966466, 开发=0.99966466, 并不=0.99966466, 高级=0.99908894, 分为=0.99999386, 维护=0.99966466}

进行迭代投票,第一轮投票,[Programmer, 专业, 中国, 人员, 从业人员, 从事, 分为, 四大, 开发, 程序, 系统分析员, 维护, 英文, 设计, 软件, 项目经理, 高级]依给次****程序员投票,得分如下:
  
  **[Programmer][程序员]投票后,[]程序员]**的得分:
这里写图片描述

**[专业][程序员]**投票

这里写图片描述

这样**[Programmer, 专业, 中国, 人员, 从业人员, 从事, 分为, 四大, 开发, 程序, 系统分析员, 维护, 英文, 设计, 软件, 项目经理, 高级]依次给[程序员]投票,投完票后,再给其它的词进行投票,本轮结束后,判断是否达到最大迭代次数200或两轮之间分数差值小于0.001,如果满足则结束,否则继续进行迭代。
 最后的投票得分是:
{特别是在=1.0015739, 程序员=2.0620303, 编码=0.78676623, 四大=0.6312981, 英文=0.6835063, 非常=1.0018439, 界限=0.88890904, 系统分析员=0.74232763, 从业人员=0.8993066, 程序=1.554001, 专业=0.88107216, 项目经理=0.6312981, 设计=0.6702926, 从事=0.9027207, Programmer=0.7930236, 软件=1.0078223, 人员=1.4288887, 清楚=0.9998723, 中国=0.99726284, 开发=1.0065585, 并不=0.9968608, 高级=0.9673803, 分为=1.4548829, 维护=0.9946941}**,分数最高的关键词就是要提取的关键词

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/51284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jieba进行词频统计与关键词提取

文章目录 1 词频统计1.1 简单词频统计1.2 加入停用词 2 关键词提取2.1 关键词提取原理2.2 关键词提取代码 1 词频统计 1.1 简单词频统计 导入jieba库并定义文本 import jieba text "Python是一种高级编程语言&#xff0c;广泛应用于人工智能、数据分析、Web开发等领域…

关键词提取(keyword extraction)技术

目录 1 统计方法&#xff08;Statistical Method&#xff09;1.1 TF1.2 TFIDF1.3 YAKE 2 图方法&#xff08;Graph Based Approaches&#xff09;2.1 PageRank2.2 TextRank2.2 SingleRank2.3 TopicRank2.4 PositionRank 3 语义模型&#xff08;Semantic Models&#xff09; 1 统…

TextRank关键词提取算法

参考&#xff1a;百度AI Studio课程_学习成就梦想&#xff0c;AI遇见未来_AI课程 - 百度AI Studio - 人工智能学习与实训社区 (baidu.com) 1.关键词提取算法分类 1.有监督 将关键词提取问题转换成二分类问题&#xff0c;判断每个候选关键词是否为关键词该类算法&#xff0c;需…

全网最详细中英文ChatGPT-GPT-4示例文档-从0到1快速入门关键词提取应用——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

从0到1快速入门关键词提取应用场景 Introduce 简介setting 设置Prompt 提示Sample response 回复样本API request 接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例 其它资料下载 ChatGPT是目前最先进的AI聊天机器人&#xff0c;它能够理解图片和文字&a…

马斯克的Starship,除了“大”还有什么呢?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 种种迹象表明&#xff0c;由ChatGPT引发的算力军备竞赛已经悄然而至了。 终于&#xff0c;到了检验人类最大火箭发射的时候了。 2023年4月17日&#xff0c;SpaceX将其大型深空火箭Starship发射升空&#xff0c;发射地点为Sp…

细思极恐!GPT-4太强,发明者们也不懂!智能到底是怎么突然「涌现」的?

本文来源 新智元 编辑&#xff1a;LRS 【新智元导读】不可解释的智能&#xff0c;未来该如何发展&#xff1f; 2023年至今&#xff0c;ChatGPT和GPT-4始终霸占在热搜榜上&#xff0c;一方面外行人都在惊叹于AI怎么突然如此强大&#xff0c;会不会革了「打工人」的命&#xf…

ChatGPT真的像说的那么神,什么都能做吗?

神到不至于&#xff0c;但确实给我的工作生活带来不少便利&#xff01; 我用的是LintCode刷题网里面自带的这个ChatGPT&#xff0c;不花钱就能直接用&#xff01; 像用它来解决不会的LeetCode题&#xff0c;动动手指解析秒出&#xff0c;对于我这种经常刷题的人来说就比较方便…

textarea输入换行字符提交给后台后,前台获取数据没有换行

解决方案&#xff1a; 需要提交数据库之前把textarea中的换行字符转换为<br>存储到数据库。 当读取的时候在把<br> 替换成textarea的换行符\n就好了 注意&#xff1a;使用replace 方法的时候需要用正则表达式&#xff0c;否则只能替换第一个换行 例如&#xff…

input按回车换行

需求描述&#xff1a;页面是table里面嵌入input,用户要求按回车去下一个input 之前由于用到elementUI的,用于改变许多类型&#xff0c;之后就自己用原生的input去实现 具体代码&#xff1a; <inputtype"number":ref"ipt index":class"ipt index…

enter无法换行

第一种方法&#xff1a;按住window Insert第二种方法&#xff1a;按住Fn Insert

Notepad++显示所有字符:空格换行

因项目需要&#xff0c;写了一个脚本&#xff0c;在windows下&#xff0c;可以正常运行。Push到设备后&#xff0c;报错。 经过Debug, 发现将脚本中的CRLF&#xff0c;改为LF, OK notepad 显示全字符&#xff0c;设置方法&#xff1a; 英文版&#xff1a;View -> Show Sy…

天猫精灵,还缺点啥?

我也是99买的天猫精灵&#xff0c;马大侠在下一盘大棋。也用了京东的叮咚&#xff08;感觉应该是合作开发而已&#xff0c;纯是为了应景&#xff0c;你有我有全都有而已&#xff09;&#xff0c;体验感不行&#xff0c;而且居然这个青春版还不能语音控制了&#xff0c;只能手机…

天猫精灵打开电脑 语音控制电脑

“天猫精灵” “哎&#xff0c;我在&#xff01;” “打开电脑” 上了一天班&#xff0c;回到家就想静静的玩会游戏&#xff0c;吼一句天猫精灵&#xff0c;立马帮你开机&#xff0c;多么舒服装x的体验。然而现实是骨感的&#xff0c;精灵无此功能&#xff0c;网上有人让弄个智…

亲测超好用的一款流程图制作软件(内含制图技巧分享)

什么是流程图&#xff1f;流程图是思维导图的一种图形模式&#xff0c;通过固定的流程和图形组合而成&#xff0c;通常应用于IT业、建筑业、数字统计行业中。因为思维导图慢慢热门起来&#xff0c;所以其他领域也都开始慢慢学习这款思维工具&#xff0c;并通过思维导图工具整理…

7款流程图制作软件大盘点!轻松绘制流程图

流程图可能是我们使用最广泛的一种图形图表&#xff0c;几乎在各个领域都会用到&#xff0c;诸如系统流程图、产品流程图、数据流程图……借助流程图&#xff0c;我们可以将事物的结构、任务的进程、甚至是算法的思路都有效视觉化。 流程图的广泛应用&#xff0c;也直接催生出…

如何做流程图?这几个实用的制作流程图方法分享给你

说到流程图的制作&#xff0c;相信大家都并不陌生&#xff0c;在日常的工作和学习中&#xff0c;我们都会根据需求接触到各种各样的流程图&#xff0c;有时还要自己动手绘制流程图并使用&#xff0c;但你是否会因为不会绘制流程图而感到苦恼呢&#xff1f;没关系&#xff0c;今…

ChatGPT一分钟做流程图

ChatGPT一分钟做流程图它能不能帮我们制作流程图呢&#xff1f;必须是可以的&#xff0c;今天我们再来介绍一个如何用ChatGPT快速制作流程图的方法。 下面以PowerBI分析流程为例&#xff0c;先向ChatGPT进行提问&#xff1a; 你是一个高级数据分析师&#xff0c;熟悉数据分析…

chatgpt赋能python:用Python计算球的表面积

用Python计算球的表面积 简介 球是一个三维几何体&#xff0c;它的表面积是一个重要的物理量。计算球的表面积通常需要使用高等数学公式&#xff0c;而Python可以很方便地进行数学计算&#xff0c;因此在计算球的表面积时&#xff0c;Python也是一种十分有用的工具。 本文将…

chatgpt赋能python:**Python计算s=a+aa+aaa的方法**

Python 计算 saaaaaa 的方法 Python 是一种高级编程语言&#xff0c;它的简单易学、可读性强、语法简单、运行效率高等特点受到了越来越多的程序员的关注和喜爱。在 Python 中&#xff0c;我们可以使用简单的代码计算多种复杂的数学问题。下面&#xff0c;我们将介绍如何使用 …

chatgpt赋能python:Python最大公约数计算代码

Python最大公约数计算代码 Python是一种高级编程语言&#xff0c;广泛应用于科学、工程和大数据分析领域。它具有简单易学、灵活性强、代码可读性高等优点&#xff0c;因此在软件开发和数据分析等领域得到了广泛的应用。Python不仅有丰富的库和工具&#xff0c;还有许多开发者…