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

学习NLP的第10天——文章关键词提取:词频统计

关键词提取是词语颗粒度的信息抽取的一种重要的需求,即提取文章中重要的词语。关键词提取的常用方法包括词频统计、TF-IDF和TextRank等。其中,

关键词提取是词语颗粒度的信息抽取的一种重要的需求,即提取文章中重要的词语。

关键词提取的常用方法包括词频统计、TF-IDF和TextRank等。

其中,词频和TextRank属于单文档算法,即只需一篇文章即可提取出其中的关键词;而TF-IDF则属于多文档宣发,需要其他文档的辅助来提取当前文章的关键词。

词频统计的Python实现

词频统计的逻辑是:在一篇文章中,越重要的关键词往往会在文章中反复出现;因为为了解释关键词,作者经常会反复地提及它们。所以通过统计文章中各个词语的出现频率,即可初步地获得关键词。

但是因为齐夫定律,文章中出现频率最高的往往并不是长度较长的关键词,而是标点符号和助词等,因此在词频统计之前还需要先进行停用词过滤。

齐夫定律:一个单词的词频与它的词频排名成反比。

由此,词频统计的流程通常是中文分词、停用词过滤、词频统计。依据以上逻辑,我在Python中实现以下词频统计。(以《红楼梦·桃花行》节选为例)

from pyhanlp import HanLP
from pyhanlp import JClassdef load_from_words(*words):"""从词汇构造双数组trie树:param words: 一系列词语:return:"""map = JClass('java.util.TreeMap')() # 创建TreeMap实例for word in words:map[word] = wordreturn JClass('com.hankcs.hanlp.collection.trie.DoubleArrayTrie')(map)def remove_stopwords_termlist(termlist, trie):return [term.word for term in termlist if not trie.containsKey(term.word)]if __name__ == "__main__":# 《红楼梦·桃花行》节选article = "桃花帘外东风软,桃花帘内晨妆懒。帘外桃花帘内人,人与桃花隔不远。"# 停用词表(诗中包含的哈工大停用词表的停用词)trie = load_from_words(",", "。", "与")# 中文分词+停用词过滤termlist = HanLP.segment(article)termlist = remove_stopwords_termlist(termlist, trie) # 分词结果去除停用词print("分词结果:", termlist)# 词频统计word_frequency = dict()for word in termlist:if word not in word_frequency:word_frequency[word] = 0word_frequency[word] += 1word_frequency_sorted = sorted(word_frequency.items(), key=lambda x: x[1], reverse=True) # 词频排序for i in range(5):print(word_frequency_sorted[i][0], "词频:", word_frequency_sorted[i][1])

其中load_from_words和remove_stopwords_termlist在之前(第7天)的学习中已经掌握。

运行结果

分词结果: ['桃花', '帘', '外', '东风', '软', '桃花', '帘', '内', '晨妆', '懒', '帘', '外', '桃花', '帘', '内', '人', '人', '桃花', '隔', '不远']
桃花 词频: 4
帘 词频: 4
外 词频: 2
内 词频: 2
人 词频: 2

基于HanLP实现的词频统计

HanLP中封装了TermFrequencyCounter类用来统计文档的词频,接着我们使用这个类实现词频统计。

from pyhanlp import *TermFrequency = JClass('com.hankcs.hanlp.corpus.occurrence.TermFrequency')
TermFrequencyCounter = JClass('com.hankcs.hanlp.mining.word.TermFrequencyCounter')if __name__ == '__main__':counter = TermFrequencyCounter()counter.add("桃花帘外东风软,桃花帘内晨妆懒。帘外桃花帘内人,人与桃花隔不远。") # 第1个文档counter.add("东风有意揭帘栊,花欲窥人帘不卷。桃花帘外开仍旧,帘中人比桃花瘦。") # 第2个文档print("2篇文章的词频前5名:", counter.top(5))# 根据词频提取关键词print("第1篇文章的词频前5名:", TermFrequencyCounter.getKeywordList("桃花帘外东风软,桃花帘内晨妆懒。帘外桃花帘内人,人与桃花隔不远。", 5))

运行结果

2篇文章的词频前5名: [帘=8, 桃花=6, 外=3, 东风=2, 隔=1]
第1篇文章的词频前5名: [桃花, 帘, 外, 隔, 软]

可以看到,整体结果是相近的,HanLP去除了更多的停用词,包括“人”、“内”以及标点符号等。

用词频提取关键词存在一个缺陷,就是即使使用过滤停用词以后,高频词也并与关键词完全等价。例如在分析一个明星的相关新闻时,明星名字的出现频率可能是最高的,但是在我们希望找到每一篇文章各自的特点,而不是文章的共性,此时,我们就需要引入TF-IDF等关键词提取方法。

学习参考文献:《自然语言处理入门》(何晗):9.2.1



推荐阅读
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 本文探讨了如何利用数组来构建二叉树,并介绍了通过队列实现的二叉树层次遍历方法。通过具体的C++代码示例,详细说明了构建及打印二叉树的过程。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • 本文探讨了在Python中多线程与多进程的性能差异,特别是在处理CPU密集型任务和I/O密集型任务时的表现。由于全局解释器锁(GIL)的存在,多线程在利用多核CPU方面表现不佳,而多进程则能有效利用多核资源。 ... [详细]
  • 本文介绍了如何使用Java编程语言实现凯撒密码的加密与解密功能。凯撒密码是一种替换式密码,通过将字母表中的每个字母向前或向后移动固定数量的位置来实现加密。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
author-avatar
手机用户2602938185
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有