解读:如何用Python提取中文关键词?
优采云 发布时间: 2020-09-02 07:24如何使用Python提取中文关键字?
本文将逐步向您展示如何使用Python从中文文本中提取关键字. 如果您需要“看长篇文章的粗略内容”,不妨尝试一下.
2017-12-07-20-38-22-7-426487.png
要求
我的朋友最近对自然语言处理很感兴趣,因为他计划使用自动方法从长文本中提取关键字来确定主题.
他问我有关方法的问题,我建议他阅读“如何从Python大量文本中提取主题?”. “.
阅读后,他说这是非常有益的,但是应用场景与他自己的需求有所不同.
“如何使用Python从大量文本中提取主题?”这篇文章面对大量文档,使用主题发现功能对文章进行了聚类. 而且他不需要处理大量文档,也不需要进行聚类,但是每个需要处理的文档都非常长,他希望通过自动化方法从长文本中提取关键字以查看大纲
突然发现我忘了写一篇文章,并介绍了提取单个文本关键字的方法.
尽管此功能实现起来并不复杂,但其中存在一些陷阱,应该避免.
通过本文,我将逐步向您展示如何使用Python提取中文关键字.
环境Python
第一步是安装Python运行时环境. 我们使用集成环境Anaconda.
请访问此网站以下载最新版本的Anaconda. 向下滚动页面以找到下载位置. 根据您当前使用的系统,网站将自动推荐适合的版本供您下载. 我正在使用macOS,下载文件格式为pkg.
2017-12-03-22-19-31-2-856072.png
下载页面区域的左侧是Python 3.6版本,右侧是2.7版本. 请选择2.7版.
双击下载的pkg文件并根据中文提示逐步安装.
2017-12-03-22-19-31-2-856170.jpeg
样品
我专门为您准备了一个github项目,用于存储本文的支持源代码和数据. 请从该地址下载压缩包文件并解压缩.
解压缩目录的名称为demo-keyword-extraction-master,示例目录收录以下内容:
2017-12-7_21-24-56_snapshots-01.jpg
除了github项目README.md的默认描述文件外,目录中还有两个文件,即数据文件sample.txt和程序源代码文件demo-extract-keyword.ipynb.
口吃分词
我们使用的关键字提取工具是断断续续的细分.
先前在“如何使用Python进行中文分词?”中,我们已经使用此工具对中文句子进行了细分. 这次我们使用它的另一个功能,即关键字提取.
请输入终端,使用cd命令进入解压缩的文件夹demo-keyword-extraction-master,然后输入以下命令:
pip install jieba
好的,软件包工具也已准备就绪. 下面我们执行
jupyter notebook
进入Jupyter笔记本环境.
image.png
至此,环境已经准备就绪,让我们介绍本文中使用的中文文本数据.
数据
一开始,我担心要查找现成的中文文本.
在互联网上可以找到大量的中文文本.
但是如果用于演示,我不确定是否会出现版权问题. 如果将您的任何作品用于分析,人们可能会问: “您从何处获得此电子版本?”
如果我一次又一次提起诉讼,我将无法抗衡.
后来,我发现我只是在自找麻烦-为什么我要找到别人的文字?用我自己的会更好吗?
在过去的一年中,我写了90多篇文章文章,总计超过270,000字.
image.png
为了避免从Python命令中提取所有关键字,我特意找到了一个非技术性的关键字.
我选择了去年的“关于在线租车司机的两三件事”.
image.png
这篇文章文章讲述了一些有趣的故事.
我从网页中提取文本并将其存储在sample.txt中.
注意,这是一个易于踩踏的地方. 在夏季的一次讲习班教学中,由于从互联网上提取中文文本时遇到问题,一些学生长时间陷入困境.
这是因为与英语不同,汉字存在编码问题. 不同的系统具有不同的默认编码,并且不同版本的Python接受不同的编码. 您从Internet下载的文本文件可能与系统的编码不一致.
image.png
无论如何,这些因素都可能导致您打开的文本中到处出现乱码.
因此,使用中文文本数据的正确方法是在Jupyter Notebook中创建一个新的文本文件.
image.png
然后,将出现以下空白文件.
image.png
使用可以正常显示的任何编辑器打开从其他位置下载的文本,然后复制全部内容并将其粘贴到此空白文本文件中,以避免编码混乱.
避开这个坑可以为您节省很多不必要的麻烦.
好的,知道了这个技巧之后,您就可以快乐地执行关键字提取了.
执行
返回Jupyter Notebook主界面,单击demo-extract-keyword.ipynb,您可以看到源代码.
image.png
是的,您没看错. 以两种不同的方式(TF-idf和TextRank)提取关键字只需要4个短句子.
在这一部分中,我们首先说明执行步骤. 稍后将介绍不同关键字提取方法的原理.
首先,我们从口吃分词的分析工具箱中导入所有关键字提取功能.
from jieba.analyse import *
在相应的语句上,按Shift + Enter组合键执行该语句并获取结果.
然后,让Python打开示例文本文件,并将所有内容读入数据变量.
with open('sample.txt') as f:
data = f.read()
使用TF-idf提取关键字和权重并按顺序显示它们. 如果未指定,则默认显示数量为20个关键字.
for keyword, weight in extract_tags(data, withWeight=True):
print('%s %s' % (keyword, weight))
在显示内容之前,会有一些提示,不用担心.
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/8s/k8yr4zy52q1dh107gjx280mw0000gn/T/jieba.cache
Loading model cost 0.547 seconds.
Prefix dict has been built succesfully.
然后列表出现:
优步 0.280875594782
司机 0.119951947597
乘客 0.105486129485
师傅 0.0958888107815
张师傅 0.0838162334963
目的地 0.0753618512886
网约车 0.0702188986954
姐姐 0.0683412127766
自己 0.0672533110661
上车 0.0623276916308
活儿 0.0600134354214
天津 0.0569158056792
10 0.0526641740216
开优步 0.0526641740216
事儿 0.048554456767
李师傅 0.0485035501943
天津人 0.0482653686026
绕路 0.0478244723097
*敏*感*词* 0.0448480260748
时候 0.0440840298591
我看了一下,觉得关键字提取相对可靠. 当然,其中也混入了10,幸运的是,它是无害的.
如果需要修改关键字的数量,则需要指定topK参数. 例如,如果要输出10个关键字,则可以这样执行:
for keyword, weight in extract_tags(data, topK=10, withWeight=True):
print('%s %s' % (keyword, weight))
让我们尝试另一种关键字提取方法-TextRank.
for keyword, weight in textrank(data, withWeight=True):
print('%s %s' % (keyword, weight))
关键字提取结果如下:
优步 1.0
司机 0.749405996648
乘客 0.594284506457
姐姐 0.485458741991
天津 0.451113490366
目的地 0.429410027466
时候 0.418083863303
作者 0.416903838153
没有 0.357764515052
活儿 0.291371566494
上车 0.277010013884
绕路 0.274608592084
转载 0.271932903186
出来 0.242580745393
出租 0.238639889991
事儿 0.228700322713
单数 0.213450680366
*敏*感*词* 0.212049665481
拉门 0.205816713637
跟着 0.20513470986
请注意,此提取的结果与TF-idf的结果不同. 至少,那个非常突然的“ 10”消失了.
但这是否意味着TextRank方法必须比TF-idf更好?
这个问题留作反思问题. 我希望您在仔细阅读了它的原理后可以独立回答它.
如果只需要使用此方法来解决实际问题,则请跳过原理部分,直接进行讨论.
原理
我们简要介绍上一篇文章TF-idf和TextRank中出现的两种不同的关键字提取方法的基本原理.
为了不让每个人都感到无聊,请不要在这里使用数学公式. 稍后我将提供相关材料的链接. 如果您对细节感兴趣,请按照图片查找并学习.
首先谈谈TF-idf.
其全名是术语频率与文档频率成反比. 中间有一个连字符,左右两侧是每个部分的一部分,结合起来确定单词的重要性.
第一部分是术语频率(术语频率),它是单词出现的频率.
我们经常说“把重要的事情讲三遍”.
出于相同的原因,某个单词出现的频率更高,这意味着该单词的重要性可能很高.
但是,这只是一种可能性,而不是绝对的.
例如,现代汉语中有许*敏*感*词*词“的,地,得”,而古代汉语中有许多结尾词“之,胡,者,也,兮”. 这些单词可能在文本中出现很多次,但显然不是关键字.
这就是为什么在判断关键字时需要第二部分(idf)进行合作的原因.
反文档频率(反文档频率)首先计算单词在每个文档中出现的频率. 假设总共有10个文档,则某个单词A出现在其中10个文档中文章,而另一个单词B仅出现在其中3个文档中. 哪个词更重要?
请花一点时间考虑一下,然后继续阅读.
发布答案的时间.
答案是B更重要.
A可以是功能词,也可以是所有文档共享的主题词. 而且B仅出现在3个文档中,因此它很可能是关键字.
文档频率的倒数就是该文档频率的倒数. 这样,第一部分和第二部分越高,越好. 如果两者都很高,则很可能是关键字.
TF-idf已经结束,让我们谈谈TextRank.
与TF-idf相比,TextRank更为复杂. 它不仅仅是执行加,减,乘,除运算,而是基于图的计算.
下面的图像是原创文档中的示例图像.
image.png
TextRank首先提取词汇表并形成节点;然后根据词汇的关联建立链接.
根据连接的节点数,为每个节点提供初始权重值.
然后迭代.
根据连接到一个单词的所有单词的权重,重新计算该单词的权重,然后传递重新计算的权重. 在此变化达到平衡状态之前,权重值不再变化. 这与Google的PageRank算法一致.
image.png
根据最终的权重值,将其中的最高单词作为关键词提取结果.
如果您对原创文献感兴趣,请参考以下链接:
讨论
总而言之,本文讨论如何使用Python从中文文本中提取关键字. 具体来说,我们分别使用了TF-idf和TextRank方法,两者之间提取关键字的结果可能会有所不同.
您完成了中文关键词提取吗?使用什么工具?效果如何?有没有比本文更有效的方法?欢迎留言,与大家分享您的经验和想法,让我们一起交流和讨论.
如果您喜欢,请喜欢. 您也可以在微信“ Yushu Zhilan”(nkwangshuyi)上关注并固定我的公共帐户.
如果您对数据科学感兴趣,则不妨阅读我的系列教程索引标签“如何有效地开始使用数据科学?”. “,还有更多有趣的问题和解决方案.