Python提取字母,python提取英文字符串中的字母
本文将一步步向您展示如何使用Python从中文文本中提取关键词。如果需要“看提纲”一篇长文,可以试试。
2017-12-07-20-38-22-7-426487.png
要求
最近朋友对自然语言处理感兴趣,因为他打算用自动化的方法从长文本中提取关键词来确定话题。
他问我方法,我推荐他看我的文章《如何用Python从海量文本提取主题?》。
他看了之后说很有收获,但是应用场景和自己的需求有些出入。
文章755-79000面对大量文档,利用话题发现功能对文章进行聚类。但是他不需要处理很多文档,也不需要聚类,但是他需要处理的每个文档都很长。他希望用自动的方法从长文本中提取关键词,从而得到一个大概的想法。
突然发现之前忘了写一篇文字,介绍单个文字关键词的提取方法。
虽然这个功能实现起来并不复杂,但是其中也有一些需要避免的坑。
通过这篇文章,我将一步步向你展示如何使用Python来实现中文关键词抽取的功能。
环境
计算机编程语言
第一步是安装Python运行时环境。我们使用集成环境Anaconda。
请到这个网站下载Anaconda的最新版本。下拉页面,找到下载位置。根据你目前使用的系统,网站会自动推荐合适的版本给你下载。我用的是macOS,下载文件格式是pkg。
2017-12-03-22-19-31-2-856072.png
Python版在下载页面区域的左侧,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 _快照-01.jpg
除了github项目默认的指令文件README.md,目录中还有两个文件,分别是数据文件sample.txt和程序源代码文件demo-extract-keyword.ipynb。
绊脚石分词
我们用的关键词提取工具是口吃。
在之前的文章《如何用Python从海量文本提取主题?》中,我们用这个工具对中文句子进行了切分。我们这次用的是它的另一个功能,即关键词提取。
请进入终端,使用cd命令进入解压文件夹demo-keyword-extraction-master,输入以下命令:
pip安装街霸
好了,打包工具准备好了。下面我们来执行一下。
jupyter笔记本
进入Jupyter笔记本环境。
image.png
这里,环境已经准备好了。下面介绍一下本文使用的中文文本数据。
数据
起初,我担心找不到现成的中文文本。
互联网上有大量的中文文本。
但我不确定用来演示会不会有版权问题。万一有人的作品被分析,人们可能会问,‘你从哪里得到这个电子版的?"
万一再打官司,我就受不了了。
后来发现,我根本就是在自找麻烦。为什么我会发现别人的短信?你为什么不用我自己的?
一年来,我写了90多篇文章,总字数超过27万。
image.png
我特意找了一个非技术性的,避免提取的关键词都是Python命令。
我选的是去年的文章《如何用Python做中文分词?》。
image.png
这篇文章讲了一些有趣的小故事。
我从网页中提取了文本并存储在sample.txt中
注意这是一个容易踩坑的地方。在暑期的一次工作坊教学中,有几个学生因为从网上检索中文文本出现问题而卡了很久。
这是因为,与英语不同,汉字有编码问题。不同的系统有不同的默认代码,不同版本的Python接受不同的代码。您从互联网上下载的文本文件可能与您的系统编码不一致。
image.png
在任何情况下,这些因素都可能导致你打开的文本中到处都是难以辨认的代码。
所以中文文本数据的正确使用方法是在Jupyter笔记本中新建一个文本文件。
image.png
然后,将出现以下空白文件。
image.png
用任何可以正常显示的编辑器打开你从其他地方下载的文本,然后将所有内容复制粘贴到这个空白文本文件中,这样可以避免编码混乱。
避开这个坑可以省去你很多不必要的尝试麻烦。
好了,现在知道这一招了,可以愉快地提取关键词了。
执行
回到Jupyter笔记本主界面,点击demo-extract-keyword.ipynb,就可以看到源代码了。
image.png
是的,你是对的。只需要这短短的四句话,就可以用两种不同的方式(TF-idf和TextRank)完成关键词提取。
在这一部分,我们将首先解释执行步骤。后面我们会介绍不同关键词提取方法的原理。
首先,我们从口吃分词的分析工具箱中导入所有的关键词提取功能。
来自jieba.analyse import *
在相应的语句上,按Shift Enter组合键执行语句并获得结果。
然后,让Python打开我们的示例文本文件,并将其所有内容读入数据变量。
用open(sample.txt )作为f:
data=f.read()
用TF-idf提取关键词和权重,依次显示。如果没有指定任何内容,默认显示的数字是20个关键字。
对于关键字,extract_tags中的权重(data,withWeight=True):
打印( %s %s %(关键字,权重))
在显示内容之前,会有一些提示。别管它。
从默认字典构建前缀字典.
从缓存/var/folders/8s/k8yr 4 zy 52 q1dh 107 gjx 280 MW 0000 gn/T/jieba . cache加载模型
加载模型花费了0.547秒。
前缀字典已成功构建。
然后名单出来了:
优步0.20058686881
驱动程序0.119951947597
乘客0。59860 . 68888888861
主人,0。59860 . 68888888861
井然有序的天空0 . 48860 . 48888888861
目的地0.5800000000001
在网上,大约是0。48660 . 66868686861
姐妹,0.5 . 50000000001
自我-0 . 20000 . 00000000001
上公共汽车0.00000000001
工作0.500000000001
中国天津市天津市。38660.88868888686
10 0.0526641740216
打开优步0.40000000001
事物0 . 50000 . 38686886861
李师傅0.40000000001
天津人是0.5%。50600.86868686861
绕道走!40800.000000000005
出租车:0.40000000001
时间为0.04482985881
我看了一下,觉得关键词提取比较靠谱。当然,有个数字10混在里面,但无伤大雅。
如果需要修改关键字的数量,需要指定topK参数。例如,如果您想输出10个关键字,可以这样执行:
对于关键字,extract_tags中的权重(data,topK=10,withWeight=True):
打印( %s %s %(关键字,权重))
我们试试另一种关键词提取方法,——TextRank。
对于关键字,textrank中的权重(data,withWeight=True):
打印( %s %s %(关键字,权重))
关键词提取结果如下:
优步1.0
司机:0。59860 . 68868886861
乘客:0。50000 . 00000000001
姐妹,0.40000000001
天津0.451349366
目的地0.400000000005
时间0.4188386363365
作者0.40586868686
编号0.357764515052
工作0 . 56867 . 88888888681
上公共汽车0。58860 . 68868888861
绕道而行0 . 54860 . 38686868661
转载0.271932903186
出来0 . 20460 . 386888868675
租金0.386988991
事物0 . 56860 . 88888888881
单数0.213450680366
出租车:0.2049665481
拉着门0 . 54850 . 58686868661
接下来是0.20513470986
请注意,此提取的结果不同于TF-idf的结果。至少,突兀的‘10’没有了。
但是,这是否意味着TextRank方法一定优于TF-idf?
这个问题留作思考题,希望你在认真看完下面的原理部分后能独立回答。
如果只需要应用这种方法解决实际问题,请跳过原理部分,直接进入讨论。
原则
先简单解释一下前面出现的——TF-idf和TextRank两种不同的关键词提取方法的基本原理。
为了不让大家觉得无聊,这里就不用数学公式了。稍后我会给出相关的信息链接。如果对细节感兴趣,欢迎大家按图索骥,咨询学习。
先说TF-idf。
它的全称是词频——逆文档频。中间有连字符,左右两边有部分,组合在一起决定一个词的重要程度。
第一部分是词频,也就是某个词出现的频率。
我们常说‘重要的事情说三遍’。
同理,某个词出现的次数说明这个词的重要性可能很高。
但是,这只是一种可能性,不是绝对的。
例如,现代汉语中的许多虚词,如的,的,的,以及古代汉语中的许多尾词,如之,乎,者,也,,可能在文本中出现多次,但它们显然不是关键词。
这就是为什么我们在判断关键词的时候需要第二部分(idf)的配合。
逆文档频率首先计算一个词在每个文档中出现的频率。假设有10个文档,其中一个单词A在所有10篇文章中首先出现,另一个单词B只在3篇文章中出现。请问哪个词比较关键?
给你一分钟考虑一下,然后继续读下去。
是时候公布答案了。
答案是B更关键。
a可以是虚词,也可以是所有文档共享的主题词。b只出现在三个文档中,所以很可能是关键词。
逆文档频率取此文档频率的倒数。使得第一部分和第二部分尽可能高。两者都高,所以很可能是关键词。
TF-idf完了。再来说说TextRank。
与TF-idf相比,TextRank更加复杂。它不是简单的加减乘除运算,而是基于图形的计算。
下图是原始文献中的一个例子。
image.png
TextRank会先提取单词,形成节点;然后,根据单词的联想,建立链接。
根据连接节点的数量,每个节点被赋予一个初始权重值。
然后开始迭代。
根据连接到一个单词的所有单词的权重,重新计算该单词的权重,然后传递重新计算的权重。在这种变化达到平衡状态之前,权重值不再变化。这和Google的网页排名算法PageRank在思想上是一致的。
image.png
根据最终权重值,取前几个词作为关键词提取结果。
如果您对原始文献感兴趣,请参考以下链接:
讨论
综上所述,本文讨论了如何使用Python从中文文本中抽取关键词。具体来说,我们分别使用TF-idf和TextRank方法,两者之间的关键词提取结果可能会有所不同。
你做过中文关键词抽取吗?用什么工具?它是如何工作的?有没有比这篇文章更高效的方法?请留言,把你的经验和想法分享给大家,我们一起交流探讨。
请喜欢。也可以在微信关注并置顶我的微信官方账号‘nkwangshuyi’。
如果你对数据科学感兴趣,不妨看看我的系列教程索引贴《网约车司机二三事》,里面有更多有趣的问题和解决方法。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。