如何用Python提取中文关键词?

本文一步步为你演示,如何用Python从中文文本中提取关键词。如果你需要对长文“观其大略”,不妨尝试一下。

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

需求

好友最近对自然语言处理感兴趣,因为他打算利用自动化方法从长文本里提取关键词,来确定主题。

他向我询问方法,我推荐他阅读我的那篇《如何用Python从海量文本提取主题?》。

看过之后,他表示很有收获,但是应用场景和他自己的需求有些区别

《如何用Python从海量文本提取主题?》一文面对的是大量的文档,利用主题发现功能对文章聚类。而他不需要处理很多的文档,也没有聚类的需求,但是需要处理的每篇文档都很长,希望通过自动化方法从长文提取关键词,以观其大略。

我突然发现,之前居然忘了写文,介绍单一文本关键词的提取方法。

虽然这个功能实现起来并不复杂,但是其中也有些坑,需要避免踩进去的。

通过本文,我一步步为你演示如何用Python实现中文关键词提取这一功能。

环境

Python

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

请到这个网址 下载最新版的Anaconda。下拉页面,找到下载位置。根据你目前使用的系统,网站会自动推荐给你适合的版本下载。我使用的是macOS,下载文件格式为pkg。

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

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

样例

我专门为你准备了一个github项目,存放本文的配套源代码和数据。请从这个地址下载压缩包文件,然后解压。

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

除了README.md这个github项目默认说明文件外,目录下还有两个文件,分别是数据文件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,你就能看到源码了。

对,你没看错。只需要这短短的4个语句,就能完成两种不同方式(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呢?

这个问题,留作思考题,希望在你认真阅读了后面的原理部分之后,能够独立做出解答。

如果你只需要应用本方法解决实际问题,那么请跳过原理部分,直接看讨论吧。

原理

我们简要讲解一下,前文出现的2种不同关键词提取方式——TF-idf和TextRank的基本原理。

为了不让大家感到枯燥,这里咱们就不使用数学公式了。后文我会给出相关的资料链接。如果你对细节感兴趣,欢迎按图索骥,查阅学习。

先说TF-idf。

它的全称是 Term Frequency - inverse document frequency。中间有个连字符,左右两侧各是一部分,共同结合起来,决定某个词的重要程度。

第一部分,就是词频(Term Frequency),即某个词语出现的频率。

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

同样的道理,某个词语出现的次数多,也就说明这个词语重要性可能会很高。

但是,这只是可能性,并不绝对。

例如现代汉语中的许多虚词——“的,地,得”,古汉语中的许多句尾词“之、乎、者、也、兮”,这些词在文中可能出现许多次,但是它们显然不是关键词。

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

逆文档频率(inverse document frequency)首先计算某个词在各文档中出现的频率。假设一共有10篇文档,其中某个词A在其中10篇文章中都出先过,另一个词B只在其中3篇文中出现。请问哪一个词更关键?

给你一分钟思考一下,然后继续读。

公布答案时间到。

答案是B更关键。

A可能就是虚词,或者全部文档共享的主题词。而B只在3篇文档中出现,因此很有可能是个关键词。

逆文档频率就是把这种文档频率取倒数。这样第一部分和第二部分都是越高越好。二者都高,就很有可能是关键词了。

TF-idf讲完了,下面我们说说TextRank。

相对于TF-idf,TextRank要显得更加复杂一些。它不是简单做加减乘除运算,而是基于图的计算。

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

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

依照连接节点的多少,给每个节点赋予一个初始的权重数值。

然后就开始迭代。

根据某个词所连接所有词汇的权重,重新计算该词汇的权重,然后把重新计算的权重传递下去。直到这种变化达到均衡态,权重数值不再发生改变。这与Google的网页排名算法PageRank,在思想上是一致的。

根据最后的权重值,取其中排列靠前的词汇,作为关键词提取结果。

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

  • TF-idf原始文献链接。

  • TextRank原始文献链接。

讨论

小结一下,本文探讨了如何用Python对中文文本做关键词提取。具体而言,我们分别使用了TF-idf和TextRank方法,二者提取关键词的结果可能会有区别。

你做过中文关键词提取吗?使用的是什么工具?它的效果如何?有没有比本文更高效的方法?欢迎留言,把你的经验和思考分享给大家,我们一起交流讨论。

如果你对我的文章感兴趣,欢迎点赞,并且微信关注和置顶我的公众号“玉树芝兰”(nkwangshuyi)。

如果本文可能对你身边的亲友有帮助,也欢迎你把本文通过微博或朋友圈分享给他们。让他们一起参与到我们的讨论中来。


如果喜欢我的文章,请微信扫描下方二维码,关注并置顶我的公众号“玉树芝兰”。

如果你希望支持我继续输出更多的优质内容,欢迎微信识别下方的赞赏码,打赏本文。感谢支持!

欢迎微信扫码加入我的“知识星球”圈子。第一时间分享给你我的发现和思考,优先解答你的疑问。


nkwshuyi
关注 关注
  • 30
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
使用jieba进行关键字抽取
12-12
Python那些事——如何用Python抽取中文关键词。jieba使用
中文文本提取关键词关键词组、关键句(textrank4zh使用)--python学习
IWBE的专栏
09-26 1万+
textrank学习链接 #-*- encoding:utf-8 -*- from textrank4zh import TextRank4Keyword,TextRank4Sentence import codecs file = r"C:\Users\Administrator\Desktop\02.txt" text = codecs.open(file,'r','utf-8').re
使用 python 在多个word文件中提取关键字
vip88886666的博客
06-20 4357
使用 python 在多个word文件中提取关键字
常用的Python3关键词提取方法
诸神缄默不语的博客
06-25 9120
本文将介绍一些简单的使用Python3实现关键词提取的算法。
Python 从单个文本中提取关键字的四种超棒的方法
AbnerAI的博客
02-22 3790
本文关键字:关键字提取、关键短语提取Python、NLP、TextRank、Rake、BERT在我之前的文章中,我介绍了使用 Python 和 TFIDF 从文本中提取关键词,TFIDF 方法依赖于语料库统计来对提取的关键字进行加权,因此它的缺点之一是不能应用于单个文本。为了说明每种关键字提取方法(Rake、Yake、Keybert 和 Textrank)的实现原理,将使用已发表的文章[1]的摘要以及主题指定的关键字,并通过检查哪些方法的提取关键词与作者设置的关键词更接近,来检验每种方法。
利用Python实现中文文本关键词抽取的三种方法
最新发布
weixin_73004416的博客
01-22 4052
一篇文档的关键词等同于最能表达文档主旨的N个词语,即对于文档来说最重要的词,因此,可以将文本关键词抽取问题转化为词语重要性排序问题,选取排名前TopN个词语作为文本关键词。本文总结了三种常用的抽取文本关键词的方法:TF-IDF、TextRank和Word2Vec词向量聚类,并做了原理、流程以及代码的详细描述。
python结巴分词去掉虚词_自然语言处理 | 中文分词器JIEBA分词练习
weixin_39540018的博客
12-09 1452
1.JIEBA简介jieba是基于Python中文分词工具,支持繁体分词、自定义词典和三种分词模式:精确模式,试图将句子最精确地切开,适合文本分析;全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。算法原理:基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的...
文本分析-使用Python做词频统计分析
热门推荐
m0_64336780的博客
06-23 2万+
前面我们已经介绍了文本分析中的中文分词和去除停用词,这篇文章将详细介绍分词后如何进行词频统计分析。
Python】模糊匹配搜索
Lynqwest的博客
11-19 2万+
1. 概述 利用python库:fuzzywuzzy及difflib,两个库均可实现词粒度的模糊匹配,同时可设定模糊阈值,实现关键词提取、地址匹配、语法检查等 2. fuzzywuzzy pip install fuzzywuzzy from fuzzywuzzy import process from fuzzywuzzy import fuzz 2.1 fuzzy模块 (1)模糊匹配方法 ratio()——简单匹配,使用纯Levenshtein Distance进行匹配。 parti
python模糊搜索列表对象_模糊搜索Python
weixin_39931101的博客
02-10 590
以下是不理想的,但它应该让你开始。它使用nltk首先将文本拆分为单词,然后生成一个包含所有单词词干的集合,过滤任何停止词。它对示例文本和示例查询都是这样做的。在如果两个集合的交集包含查询中的所有单词,则将其视为匹配项。在import nltkfrom nltk.stem import PorterStemmerfrom nltk.tokenize import word_tokenizefrom ...
python提取内容关键词的方法
12-24
本文实例讲述了python提取内容关键词的方法。分享给大家供大家参考。具体分析如下: 一个非常高效的提取内容关键词python代码,这段代码只能用于英文文章内容,中文因为要分词,这段代码就无能为力了,不过要加上...
python多进程提取处理大量文本的关键词方法
09-20
今天小编就为大家分享一篇python多进程提取处理大量文本的关键词方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
python TF-IDF算法实现文本关键词提取
09-19
主要为大家详细介绍了python TF-IDF算法实现文本关键词提取,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
中英文关键词提取方法与Python示例
09-12
本文将介绍针对中文和英文文本的不同关键词提取方法,并通过Python示例代码演示如何实现这些方法。无论您是进行文本分析、信息检索还是文本摘要,本文都将为您提供有用的指导和工具。让我们一起探讨如何从文本中提取...
基于Python实现中文文本关键词抽取的三种方法.zip
06-22
本文总结了三种常用的抽取文本关键词的方法:TF-IDF、TextRank和Word2Vec词向量聚类,并做了原理、流程以及代码的详细描述。另外,本文的实验目的主要在于讲解三种方法的思路和流程,实验过程中的某些细节仍然可以...
python示例代码提取文本中的关键词
weixin_35755188的博客
12-21 1820
Python提取文本中的关键词可以使用第三方库来实现。 一种常用的库是 jieba。使用这个库,你可以使用 jieba.analyse.extract_tags 函数来提取文本中的关键词。 例如: import jieba import jieba.analyse text = '这是一段文本,我们想要从中提取关键词' # 提取关键词,设置数量为 3 keywords = jieba....
python语言处理初探——分词、词性标注、提取名词
一杯原谅绿茶的博客
04-13 4233
这个教程里我们只需要调库,不需要了解原理,很简单的 参考文档: 参考:Python NLTK 自然语言处理入门与例程 参考1:NLP入门学习1——分词、词性标注 - CSDN博客 参考2:使用nltk进行分词、词性标注、词性提取 - 知乎 介绍和安装: 可以直接下这个压缩包 文章代码下载:蓝奏云链接 NLTK是最受欢迎的英文自然语言处理库 其包含了两部分,pip里带有的库,和它另外要下载的扩展库(大概700M) 首先我们要用python官方安装器pip安装ntkl库,并用ntkl的函数安装它的扩展库 新.
python提取关键词
06-13
您可以使用Python中的第三方库jieba来提取关键词,具体步骤如下: 1. 安装jieba库,可以使用pip命令进行安装: ``` pip install jieba ``` 2. 导入jieba库: ```python import jieba ``` 3. 加载停用词列表,停用词列表中包含了一些无意义的词汇,不应该被当做关键词输出: ```python stop_words = set() with open('stop_words.txt', 'r', encoding='utf-8') as f: for line in f: stop_words.add(line.strip()) ``` 4. 对文本进行分词: ```python text = "这是一段需要进行关键词提取的文本" words = jieba.cut(text) ``` 5. 去除停用词: ```python words_without_stopwords = [word for word in words if word not in stop_words] ``` 6. 统计词频并排序: ```python word_count = {} for word in words_without_stopwords: if word not in word_count: word_count[word] = 1 else: word_count[word] += 1 sorted_word_count = sorted(word_count.items(), key=lambda x: x[1], reverse=True) ``` 7. 输出关键词: ```python for item in sorted_word_count: print(item[0], item[1]) ``` 需要注意的是,jieba库只能提取中文文本的关键词,如果需要处理英文文本,可以使用nltk库或者spaCy库等。另外,还可以使用TF-IDF算法来提取关键词,使用方法可以参考sklearn库中的TfidfVectorizer类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 如何用Python爬数据?(一)网页抓取 210730
  • 如何用iPad运行Python代码? 45917
  • 如何用VOSviewer分析CNKI关键词共现? 39255
  • 如何用Python批量提取PDF文本内容? 34423
  • 如何用Python提取中文关键词? 32659

分类专栏

  • 机器学习 1篇
  • 深度学习 1篇
  • python 1篇

最新评论

  • 文献回顾与文献综述的区别是什么?

    CSDN-Ada助手: Python入门 技能树或许可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python

  • 如何用 Open Interpreter 帮你自动做数据可视化?

    chenxia89: 王老师,为啥文章都是只有一半啊

  • 如何用 GPT-4 全模式(All Tools)帮你高效学习和工作?

    The_kisses: 那五个模式怎么集齐呀

  • 如何用 ChatGPT 帮你自动分析数据?

    单翼天使S: 演示数据集能分享一下吗

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 什么是 AI Agent ?
  • 如何用「竞争」与「作品」助力成长?读《工作的心智》有感
  • 如何通过少量样本复刻高级提示词?
2024年29篇
2023年32篇
2022年36篇
2021年45篇
2020年26篇
2019年32篇
2018年59篇
2017年17篇

目录

目录

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司成都企业网站制作多少钱上海网站推广方案公司滨州网站改版亳州网页设计哪家好南宁关键词按天扣费多少钱佛山英文网站建设价格林芝网站优化推广价格吉安百度seo价格海南网页设计哪家好抚州百度爱采购开封网络推广报价湘潭优秀网站设计坪地模板网站建设价格定西百姓网标王推广哪家好荆门模板制作推荐玉溪seo网站推广哪家好新乡营销网站报价桂林网站优化排名推荐通辽建站报价上饶企业网站制作多少钱长葛企业网站制作哪家好吕梁seo网站优化多少钱肇庆网站搭建多少钱朝阳seo网站优化哪家好文山seo网站推广报价延安网站搭建公司重庆网站优化三明百度关键词包年推广推荐滨州网站优化按天扣费德州网站优化软件哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化