Python中文文本关键词提取教程:一步步教你从长文中提取关键词

本文逐步向您展示如何使用Python从中文文本中提取关键字。如果你需要对长文“看大纲”,不妨尝试一下。

Python中文文本关键词提取教程:一步步教你从长文中提取关键词

(由于微信公众号外部链接限制,文章中部分链接可能无法正确打开,如有需要,请点击文末“阅读原文”按钮,获取可显示外部链接的版本链接正常。)

需要

我的朋友最近对自然语言处理很感兴趣,因为他计划使用自动化方法从长文本中提取关键字来确定主题。

他问我方法,我推荐他看我的文章《如何使用Python从海量文本中提取主题?》 》。

他看完后表示很有收获,但应用场景与自己的需求有些不同。

“如何使用Python从海量文本中提取主题?” “这篇文章面对大量的文档,利用主题发现功能对文章进行聚类。他不需要处理很多文档,也不需要聚类。但是,每个需要处理的文档待处理的内容很长,他希望通过自动化的方法从长文本中提取关键词,看看它的轮廓。

我突然发现我忘记写一篇介绍单篇文本提取关键词方法的文章了。

虽然这个功能实现起来并不复杂,但是有一些陷阱需要避免。

通过这篇文章,我将一步步向大家展示如何使用Python实现中文关键词提取功能。

环境Python

第一步是安装Python运行环境。我们使用集成环境Anaconda。

请前往该网站下载最新版本的Anaconda。向下滚动页面以找到下载位置。网站会根据您当前使用的系统,自动推荐合适的版本供您下载。我使用的是 macOS,下载文件格式是 pkg。

下载页面区域左侧为Python 3.6版本,右侧为2.7版本。请选择2.7版本。

双击下载的pkg文件,根据中文提示一步步安装。

样本

我特意为大家准备了一个github项目,用于存放本文的配套源码和数据。请从此地址下载压缩包文件并解压。

解压后的目录名称为demo-keyword-extraction-master。示例目录包含以下内容:

除了github项目默认的描述文件README.md外,该目录下还有两个文件,分别是数据文件sample.txt和程序源码文件demo-extract-keyword.ipynb。

口吃分词

我们使用的关键词提取工具是结巴分词。

之前在《如何使用Python进行中文分词?》 》文章中我们就使用了这个工具来进行中文句子的分词。这次我们用到的是它的另一个功能,即关键词提取。

请进入终端,使用cd命令进入解压后的文件夹demo-keyword-extraction-master,输入以下命令:

pip install jieba

好了,打包工具也准备好了。接下来我们执行

jupyter notebook

进入Jupyter笔记本环境。

至此,环境就准备好了。我们来介绍一下本文使用的中文文本数据。

数据

一开始,我很担心找不到现成的中文文本。

网上有大量的中文文本。

但我不确定如果用它来演示会不会有版权问题。如果有人的工作被用来分析,人们可能会问,“你从哪里得到这个电子版的?”

如果再为此提起诉讼,我将无法抗拒。

后来我发现我只是自找麻烦——我为什么要去找别人的文字呢?用我自己的不是更好吗?

一年多来,我写了90多篇文章,总字数27万多字。

我特意找了一篇非技术性的文章,避免提取出全是Python命令的关键字。

我选择的是去年的文章《关于网约车司机的两三件事》。

这篇文章讲述了一些有趣的故事。

我从网页中提取文本并将其存储在sample.txt 中。

请注意,这是一个很容易陷入陷阱的地方。在暑假的一次工作坊教学中,有几个学生在从网上提取中文文本时遇到问题,卡了很长时间。

这是因为与英文不同,中文字符存在编码问题。不同的系统有不同的默认编码,不同版本的Python接受不同的编码。您从网上下载的文本文件可能与您系统的编码不一致。

不管怎样,这些因素都可能导致你打开的文本中充斥着难以理解的乱码。

因此,使用中文文本数据的正确方法是在Jupyter Notebook中创建一个新的文本文件。

然后,将出现以下空白文件。

使用任何可以正常显示的编辑器打开从其他地方下载的文本,然后复制整个内容并将其粘贴到这个空白文本文件中,以避免编码混乱。

避开这个坑将为你省去很多不必要的尝试麻烦。

好了,既然你知道了这个技巧,你就可以愉快地提取关键词了。

实施

返回Jupyter Notebook主界面,点击demo-extract-keyword.ipynb,就可以看到源码了。

是的,你没看错。只需要这四个短句,就可以通过两种不同的方式(TF-idf和TextRank)完成关键词提取。

在本节中我们首先解释执行步骤。后面我们会介绍不同关键词提取方法的原理。

首先,我们导入口吃分词分析工具箱中的所有关键词提取函数。

from jieba.analyse import *

在对应的语句上,按下Shift+Enter组合键执行该语句并获得结果。

然后,让 Python 打开我们的示例文本文件并将其全部内容读入 data 变量。

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。

它的全称是TermFrequency——逆文档频率。中间有一个连字符,左右两边都有部分,它们共同决定了某个单词的重要性。

第一部分是词频,即某个词出现的频率。

我们常说“重要的事情说三遍”。

同理,如果某个词出现的次数多了,就说明这个词的重要性可能非常高。

不过,这只是一种可能,并非绝对。

例如,现代汉语中有许多虚词“得、地、得”,古汉语中有许多句尾词“之、胡、折、也、夕”。这些词可能在文本中出现多次,但显然不是关键词。

这就是为什么我们在判断关键词的时候需要第二部分(idf)来配合。

逆文档频率首先计算某个词在每个文档中出现的频率。假设总共有 10 个文档,某个单词 A 出现在其中 10 个文档中,而另一个单词 B 只出现在其中 3 个文档中。哪个词更关键?

给你一分钟的时间思考一下,然后继续阅读。

是时候公布答案了。

答案是B更关键。

A可以是虚词,也可以是所有文档共享的关键字。而B只出现在3篇文档中,所以它很可能是一个关键词。

逆文档频率就是取这个文档频率的倒数。这样一来,第一部分和第二部分就越高越好。如果两者都高,则很可能是一个关键词。

说完了 TF-idf,我们来谈谈 TextRank。

与TF-idf相比,TextRank更为复杂。它不是简单的加减乘除,而是基于图的计算。

下图是原始文献中的示例图。

TextRank首先会提取单词形成节点;然后根据单词的关联建立链接。

根据连接节点的数量,为每个节点分配一个初始权值。

然后开始迭代。

根据与某个词相关的所有词的权重,重新计算该词的权重,然后将重新计算的权重传递下去。直到这种变化达到平衡,权重值将不再变化。这在思想上与Google的网页排名算法PageRank是一致的。

根据最终的权重值,选择排名靠前的词作为关键词提取结果。

如果您对原文文献感兴趣,请参考以下链接:

讨论

总而言之,本文探讨了如何使用 Python 从中文文本中提取关键字。具体来说,我们分别使用了TF-idf和TextRank方法,两者的关键词提取结果可能会有所不同。

你做过中文关键词提取吗?使用什么工具?效果如何?还有比本文更有效的方法吗?欢迎留言,与大家分享你的经历和想法。我们一起交流、讨论吧。

如果您对我的文章感兴趣,请点赞、关注并置顶我的微信公众号“玉树之兰”(nkwangshuyi)。

如果本文对您的亲朋好友有帮助,也欢迎您通过微博或朋友圈分享这篇文章给他们。让他们参与我们的讨论。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读