热门标签 | 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爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 如何使用计算机控制遥控车的步骤和电路制作方法
    本文介绍了使用计算机控制遥控车的步骤和电路制作方法。首先,需要检查发送器的连接器和跳线,以确定命令的传递方式。然后,通过连接跳线和地面,将发送器与电池的负极连接,以实现遥控车的前进。接下来,制作一个简单的电路,使用Arduino命令将连接到跳线的电线接地,从而实现将Arduino命令转化为发送器命令。最后,通过焊接晶体管和电阻,完成电路制作。详细的步骤和材料使用方法将在正文中介绍。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 这是一个愚蠢的问题,但我只是对此感到好奇.假设我在Pythonshell,我有一些我查询的数据库对象.我做:db.query(的queryString)该查询在0xffdf842c ... [详细]
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社区 版权所有