哪些用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

而外README.md那个github项目暗中认可表明文件外,目录下还有四个文件,分别是数据文件sample.txt和程序源代码文件demo-extract-keyword.ipynb。

结巴分词

咱俩应用的首要性词提取工具为结巴分词

之前在《什么用Python做普通话分词?》一文中,大家早已选择过该工具为汉语语句做分词。这一次我们运用的,是它的另一项职能,即重点词提取。

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

pip install jieba

好了,软件包工具也早已准备安妥。下边大家实施

jupyter notebook

跻身到Jupyter台式机环境。

image.png

到那边,环境已经准备好了,大家下边来介绍本文使用的国语文本数据。

数据

一初步,笔者还曾为寻找现成的国语文本发愁。

网上能够找到的中文文本浩如烟海。

然而拿来做示范,是不是会有版权难点,作者就不鲜明了。万一把哪位大家之作拿来做了分析,人家恐怕就要干涉一句“那电子版你是从何地搞到的哎?”

万一再由此提议诉讼,小编可不可能对抗。

后来意识,笔者这几乎就是自己瞎着急——找外人的文件干什么?用本身要好的不就好了?

这一年多以来,作者写的稿子已有90多篇,总篇幅已经超(英文名:jīng chāo)过了27万。

image.png

自个儿尤其从中找了一篇非技术性的,以制止提取出的重中之重词全都是Python命令。

自己选用的,是二零一八年的那篇《网约车司机二三事》。

image.png

那篇文章,讲的都以些相比较好玩的小轶事。

自身从网页上选用文字,存款和储蓄到sample.txt中。

只顾,那里是很不难踩坑的地点。在夏日的二遍工作坊教学中,好几人同学因为从网上摘取汉语文本出现难题,卡住十分短日子。

这是因为不相同于乌Crane语,汉字有编码题材。分化体系都有两样的暗中同意编码,差异版本的Python接受的编码也不比。你从网上下载的文件文件,也可能与你系统的编码不统一。

image.png

不论怎么样,这几个要素都有恐怕引致您打开后的文书里,四处都是看不懂的乱码。

于是,正确的运用粤语文本数据形式,是你在Jupyter
Notebook里面,新建多少个文书文件。

image.png

接下来,会并发以下的空白文件。

image.png

把您从别处下载的文书,用随意一种能符合规律呈现的编辑器打开,然后拷贝全体内容,粘贴到那一个空白文本文件中,就能幸免编码错乱。

躲避了那么些坑,能够为您节省千千万万不供给的困扰尝试。

好了,知道了那个门槛,下边你就能安心乐意地实行第叁词提取了。

执行

回去Jupyter
Notebook的主界面,点击demo-extract-keyword.ipynb,你就能观望源码了。

image.png

对,你没看错。只供给那短小多少个语句,就能不负众望三种不相同形式(TF-idf与TextRank)的首要词提取。

本有的大家先讲解执行步骤。分裂主要词提取方法的法则,大家身处后边介绍。

率先我们从结巴分词的剖析工具箱里导入全部的重庆大学词提取功能。

from jieba.analyse import *

在对应的语句上,按下Shift+Enter组合按键,就能够执行语句,获取结果了。

下一场,让Python打开咱们的样例文本文件,并且读入个中的全体内容到data变量。

with open('sample.txt') as f:
    data = f.read()

利用TF-idf形式领取关键词和权重,并且逐一显示出来。借使您不做特殊钦点的话,暗中同意呈现数量为18个第3词。

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参数。例如你要出口十二个首要词,能够这么举行:

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篇文书档案中冒出,因而很有只怕是个关键词。

逆文书档案频率便是把那种文书档案频率取倒数。那样第2部分和第②有个别都以越高越好。二者都高,就很有恐怕是首要词了。

TF-idf讲完了,上边大家说说TextRank。

相对于TF-idf,TextRank要显示尤其错综复杂一些。它不是简约做加减乘除运算,而是依照图的计量。

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

image.png

TextRank首先会提取词汇,形成节点;然后根据词汇的涉及,建立链接。

遵从连接节点的多少,给每个节点赋予2个初步的权重数值。

接下来就从头迭代。

依据有个别词所连接全部词汇的权重,重新计算该词汇的权重,然后把重新计算的权重传递下去。直到那种变更达到均衡态,权重数值不再发生变更。那与谷歌的网页排行算法PageRank,在思想上是如出一辙的。

image.png

依照最后的权重值,取在那之中排列靠前的词汇,作为重点词提取结果。

一经您对原本文献感兴趣,请参见以下链接:

讨论

小结一下,本文探究了什么用Python对普通话文本做主要词提取。具体而言,大家独家使用了TF-idf和TextRank方法,二者提取关键词的结果可能会有分别。

您做过汉语关键词提取吗?使用的是何许工具?它的功力怎么着?有没有比本文更火速的措施?欢迎留言,把您的经验和沉思分享给我们,我们一道调换研商。

即使你对我的篇章感兴趣,欢迎点赞,并且关怀自笔者的专栏,以便接受后续文章更新通告。

比方本文只怕对您身边的亲朋有赞助,也欢迎你把本文通过搜狐或朋友圈分享给她们。让她们合伙到场到大家的座谈中来。

延伸阅读

数码科学有关文章合集(玉树芝兰)

相关文章