Python 实战 | 文本分析之文本关键词提取
Python教学专栏,旨在为初学者提供系统、全面的Python编程学习体验。通过逐步讲解Python基础语言和编程逻辑,结合实操案例,让小白也能轻松搞懂Python!
>>>点击此处查看往期Python教学内容
本文目录
一、前言
二、实现工具——jieba
三、TF-IDF 算法
1. 算法原理
2. 代码实现
3. 优缺点分析
四、TextRank 算法
1. 算法思想
2. 代码实现
3. 优缺点概述
五、结束语
六、相关推荐
本文共6704个字,阅读大约需要20分钟,欢迎指正!
Part1前言
自然语言处理中最基本的任务就是文本词频统计和关键词提取,在过去的文章中,我们已经详细介绍了使用 Python 对文本进行词频统计的方法,通过统计词频,我们可以大致了解文章构成,并且在一定程度上了解文章的重点内容。而文本关键词提取工作则可以让我们更加直观地了解文章的主题思想,也可以用来做一些情感分析、内容摘要、文本分类聚类等文本分析工作,这也是很多学者关心的问题。关键词提取技术中有很多优异算法,本文我们将介绍如何使用 Python 基于 TF-IDF 和 TextRank 这两种算法实现中文长文本(文章)的关键词提取。
Part2实现工具——jieba
Python 第三方库 jieba 是一个开源的,用于中文分词以及简单文本处理的工具包,不仅提供了基础的分词功能,还附带词性标注、实体识别以及关键词提取功能。基本的分词功能以及优化分词的方法,已经在上文链接指向的文章中详细说明过,本文则主要介绍如何使用 jieba 库进行关键词提取。jieba 库内置了两种关键词提取算法,正是上文中提到的 TF-IDF 和 TextRank 算法,它们都是最为经典和常用的关键词提取算法。
当然,除了 jieba 库,Python 中很多自然语言处理相关的第三方库也提供了关键词提取功能,例如 hanlp、Scikit-learn 等,但相对而言 jieba 的使用更加简单,易上手,因此本文主要使用的工具是 jieba,不过后续文章也有可能介绍其他更强的工具库。
Part3TF-IDF 算法
1算法原理
TF-IDF(Term Frequency–Inverse Document Frequency,词频-逆文档频率)是信息检索中衡量一个词语重要程度的统计指标,广泛应用于文本分析领域。
逆文档频率
(IDF 值)。也就是说提取一篇文章的关键词,需要用到成百上千篇其他不同的文章,这使得该算法的实现相当不容易,所以 jieba 库的开发者使用了大量的文本(据说是人民日报)作为语料事先训练得到四十多万个词语的 IDF 值,并将他们保存在 jieba 库的文件中,如下图所示。这样一来,使用 jieba 库提取文本关键词只需要提供要提取关键词的文档就可以了。
2代码实现
如果你还没有安装 jieba 库,那么首先需要在 Python 中安装它
pip install jieba
GitHub 地址:https://github.com/fxsjy/jieba
下面是使用 jieba 提取新闻《人民热评:“鲶鱼”终于带出大鱼,潜伏再深也难逃捕捞!》中前 10 关键词的代码。
import jieba.analyse
# 从文本文件中读取文本内容,并作简单清洗
with open('新闻文本.txt', 'r', encoding='utf-8') as file:
# 去除换行符,使文本连续
TEXT = file.read().replace('\n', '')
# 使用 jieba 进行 TF-IDF 算法提取文本关键词
keywords = jieba.analyse.extract_tags(
sentence=TEXT, # 文本内容
topK=10, # 提取的关键词数量
allowPOS=['n','nz','v', 'vd', 'vn', 'ns', 'nr'], # 允许的关键词的词性
withWeight=True, # 是否附带词语权重
withFlag=True, # 是否附带词语词性
)
# 输出提取到的关键词
keywords
# 输出内容如下
"""
[(pair('钟庚赐', 'nr'), 0.564398728854661),
(pair('鲶鱼', 'n'), 0.5130897535042374),
(pair('北极', 'ns'), 0.41047180280338985),
(pair('大鱼', 'n'), 0.2565448767521187),
(pair('事件', 'n'), 0.2565448767521187),
(pair('退休', 'v'), 0.2565448767521187),
(pair('通报', 'n'), 0.20523590140169493),
(pair('违法', 'vn'), 0.20523590140169493),
(pair('问题', 'n'), 0.20523590140169493),
(pair('违规', 'vn'), 0.20523590140169493)]
"""
在 jieba 中,使用jieba.analyse.extract_tags()
函数就可以基于 TF-IDF 算法提取文章的关键词,其中参数allowPOS
的作用是限制关键词的词性,jieba 分词常见词性的对照可以参考下图。
3优缺点分析
通过上述代码可以发现,使用 jieba 库基于 TF-IDF 算法的关键词提取,其效果算不上优秀,但也不是很差,与人工提取还有一定差异,毕竟这项工作本身就是一个见仁见智的问题。
先说缺点,提取效果一般,一些特殊场景下的专有词汇或者新词汇没有被提取出来,例如“北极鲶鱼”显然可以作为一个关键词,但由于 jieba 的词库中没有这个词,因此“北极鲶鱼”被分词器分开为“北极”和“鲶鱼”,所以尽管“北极鲶鱼”多次出现,关键词也只能是“北极”和“鲶鱼”。这个特性导致该工具只在一部分文本的关键词提取中表现良好,对于特定领域的文本处理则相对平庸。另外,jieba 库 0.42.1 版本自 2020 年发布,到现在已经有三年多没有更新,内置的各种词库也随着时间推进越来越落后。
再说优点,上述算法/代码最大的优点就是实现起来非常简单,几乎没有什么难度,非常亲民,即便没有大量文本做支撑,也可以方便的实现 TF-IDF 算法,而且还可以限制关键词的词性,并且给出各个关键词的权重。如果你有更高的要求,那么就需要根据算法原理手搓代码了,这一步还涉及到词库的开发、文本语料库的选择与处理等等,比现有代码复杂许多,这里就不深入讨论了。
Part4TextRank 算法
1算法思想
TextRank 算法的前身是 Google 用于网页排序的 PageRank 算法。它将互联网看作有向图,互联网上的网页看作节点,一个网页可能被其他网页链接,也可能链接其他网页。当一个网页经常被其他网页链接,那么有理由认为这个网页比较重要,但一个网页的每一个外链(每一次被链接)并不是同等重要。正所谓物以类聚,如果一个网页频繁被垃圾网站链接,那么这个网页往往也是垃圾网站,但如果一个网站被另一个重要的网站链接,则说明这个网站也很重要。而且外链的权重也与外链的数量有关系,例如一个网页连接了很多其他网页,那么每一个链接的权重都不会高,如果只链接一个网页,这个链接的权重就会提高不少。PageRank 给每一个网页赋予同样的初始权重,然后以迭代的方式更新每一个网页的权重,直到所有网页的权重值都不再变化,那么就能给这些网页做出重要性排序了。
而 TextRank 算法其实就是 PageRank 算法在文本上的应用。首先,将要处理的文本进行分词,把所有的单词作为候选关键词。然后,根据单词之间的某种关系,例如共现关系,构建一张图,图中的节点表示候选关键词,边表示这两个词之间的关系。在图上运行 TextRank 算法,进行迭代,直到达到稳定的状态。最后,每个节点(单词)都会被赋予一个权重,权重越高,该单词作为关键词的可能性越大。
2代码实现
jieba 库同样也内置了 TextRank 算法来提取关键词,下面我们依旧以上文中的新闻文本为例,使用 TextRank 提取排名前十的关键词。
import jieba.analyse
# 从文本文件中读取文本内容,并作简单清洗
with open('新闻文本.txt', 'r', encoding='utf-8') as file:
# 去除换行符,使文本连续
TEXT = file.read().replace('\n', '')
# 使用 jieba 进行 TF-IDF 算法提取文本关键词
keywords = jieba.analyse.textrank(
sentence=TEXT, # 文本内容
topK=10, # 提取的关键词数量
allowPOS=['n','nz','v', 'vd', 'vn', 'ns', 'nr'], # 允许的关键词的词性
withWeight=True, # 是否附带词语权重
withFlag=True, # 是否附带词语词性
)
# 输出提取到的关键词
keywords
# 输出内容如下
"""
[(pair('钟庚赐', 'nr'), 1.0),
(pair('鲶鱼', 'n'), 0.7769707000291773),
(pair('北极', 'ns'), 0.6686246005812482),
(pair('事件', 'n'), 0.5126830875120408),
(pair('违法', 'vn'), 0.44885458849077187),
(pair('通报', 'n'), 0.4358104933456967),
(pair('违规', 'vn'), 0.3890063023078582),
(pair('应该', 'v'), 0.3501519458778275),
(pair('退休', 'v'), 0.32187418179123195),
(pair('部门', 'n'), 0.31891706852131835)]
"""
从提取结果来看,该算法和 TF-IDF 算法都还算可以。
3优缺点概述
由于 TextRank 算法从原理上来说不需要依赖其他文本集合,仅需一篇文章就可以完成解析,所以相比于 TF-IDF 算法,它在任何主题的文本中的表现应该都不会很差,这一点优于 TF-IDF。不足之处在于算法原理比较抽象,即便想根据原理手写代码也会发现比较困难,不过好在现在这些算法都可以被直接调用,没有什么开发成本。
Part5结束语
💡 jieba 是 Python 文本分析中最基础和通用的工具库,如果你读完本文后仍存疑问,或者在 Python 或 jieba 使用方面遇到问题,那么不妨留言提问,笔者会根据情况提供帮助哦~
另外,如果你也有关键词提取/文本分析实操经验,欢迎留言交流你所使用的方法或工具,说不定笔者会单独加一期文章来印证您的方法,让我们一起探索更多技术!
如果你想学习各种 Python 编程技巧,提升个人竞争力,那就加入我们的数据 Seminar 交流群吧,欢迎大家在社群内交流、探索、学习,一起进步!同时您也可以分享通过数据 Seminar 学到的技能以及得到的成果。
长按扫码,加入数据seminar-Python交流学习群
Part6相关推荐
Python教学
Python 教学 | 学习 Python 第一步——环境安装与配置 Python 教学 | Python 基本数据类型 Python 教学 | Python 字符串操作(上) Python 教学 | Python 字符串操作(下) Python 教学 | Python 变量与基本运算 Python 教学 | 组合数据类型-列表 Python 教学 | 组合数据类型-集合(内含实例) Python 教学 | 组合数据类型 - 字典&元组 Python 教学 | Python 中的分支结构(判断语句) Python 教学 | Python 中的循环结构(上) Python 教学 | Python 中的循环结构(下) Python 教学 | Python 函数的定义与调用 Python 教学 | Python 内置函数 Python 教学 | 最常用的标准库之一 —— os Python 教学 | 盘点 Python 数据处理常用标准库 Python 教学 | “小白”友好型正则表达式教学(一) Python 教学 | “小白”友好型正则表达式教学(二) Python 教学 | “小白”友好型正则表达式教学(三) Python 教学 | 数据处理必备工具之 Pandas(基础篇) Python 教学 | 数据处理必备工具之 Pandas(数据的读取与导出) Python 教学 | Pandas 数据索引与数据选取 Python 教学 | Pandas 妙不可言的条件数据筛选 Python 教学 | Pandas 缺失值与重复值的处理方法 Python 教学 | Pandas 表格数据行列变换 Python 教学 | Pandas 表格字段类型精讲(含类型转换) Python 教学 | Pandas 数据合并(含目录文件合并案例) Python 教学 | Pandas 数据匹配(含实操案例) Python 教学 | Pandas 函数应用(apply/map)【上】 Python 教学 | Pandas 函数应用(apply/map)【下】 Python 教学 | Pandas 分组聚合与数据排序 Python 教学 | Pandas 时间数据处理方法 Python 教学 | 列表推导式 & 字典推导式 Python 教学 | 一文搞懂面向对象中的“类和实例” Python 教学 | Python 学习路线+经验分享,新手必看!
Python实战
Python实战 | 如何使用 Python 调用 API Python 实战 | 使用正则表达式从文本中提取指标 大数据分析 | 用 Python 做文本词频分析 数据治理 | 从“今天中午吃什么”中学习Python文本相似度计算 数据治理 | 省下一个亿!一文读懂如何用python读取并处理PDF中的表格(赠送本文所用的PDF文件) 数据治理 | 还在人工识别表格呢?Python 调用百度 OCR API 又快又准 数据治理 | 如何用 Python 批量压缩/解压缩文件 案例分享:使用 Python 批量处理统计年鉴数据(上) 案例分享:使用 Python 批量处理统计年鉴数据(下) Python 实战 | ChatGPT + Python 实现全自动数据处理/可视化 ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙
数据可视化
星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!
点击搜索你感兴趣的内容吧
往期推荐
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
文 | 《社科领域大数据治理实务手册》
欢迎扫描👇二维码添加关注