NLTK基础教程 用NLTK和Python库构建机器学习应用(txt+pdf+epub+mobi电子书下载)


发布时间:2021-02-12 22:00:13

点击下载

作者:[印度] Nitin Hardeniya 哈登尼亚

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

NLTK基础教程 用NLTK和Python库构建机器学习应用

NLTK基础教程 用NLTK和Python库构建机器学习应用试读:

前言

这是一本介绍NLTK库,以及如何将该库与其他Python库搭配运用的书。NLTK是当前自然语言处理(NLP)社区中最为流行、使用最为广泛的库之一。NLTK的设计充分体现了简单的魅力。也就是说,对于大多数复杂的NLP任务,它都可以用寥寥几行代码来实现。

本书的前半部分从介绍Python和NLP开始。在这部分内容中,你将会学到一些通用的预处理技术,例如标识化处理(tokenization)、词干提取(stemming)、停用词(stop word)去除;一些专属于NPL领域的预处理技术等,如词性标注(part-of-speech tagging);以及大多数文本相关的NLP任务都会涉及的命名实体识别(Named-entity recognition,简称NER)等技术。然后,我们会逐步将焦点转到更为复杂的NLP任务上,例如语法解析(parsing)以及其他NLP应用。

本书的后半部分则将更侧重于介绍如何构建一些NLP应用,如对于文本分类,可以用NLTK搭配scikit-learn库来进行。我们还会讨论一些其他的Python库,你应该了解一下这些与文本挖掘或自然语言处理任务相关的库。另外,也会带你看看如何从网页和社交媒体中采集数据,以及如何用NLTK进行大规模的文本处理。本书所涵盖的内容

第1章 自然语言处理简介。这一章将会涉及一些NLP中的基本概念,并对NLTK和Python做一些介绍。这一章的重点是让你快速了解NLTK,并介绍如何安装所需要的库,以便开始构建一个非常基本的单词云实例。

第2章 文本的歧义及其清理。这一章将会讨论在任何文本挖掘和NLP任务中所需的所有预处理步骤。这一章将会具体讨论断词处理、词干处理、停用词去除等技术。并且,还会为你详细介绍一些别的文本清理技术,以及如何用NLTK来简化它们的实现。

第3章 词性标注。这一章将重点对词性标注进行概述。在这一章中,我们将会为你介绍如何将NLTK运用到一些标注器中,并讨论NLTK中有哪些不同的NLP标注器可用。

第4章 文本结构解析。这一章将会带你继续深入NLP,讨论不同的语法解析方法,并介绍如何用NLTK来实现这些方法。在此过程中,我们会讨论语法解析在NLP语境中的,以及一些常见的信息提取技术(如实体提取)中的重要性。

第5章 NLP应用。这一章将会谈及各种不同的NLP应用,我们将会带领你利用一些当前已掌握的知识来构建出一个简单的NLP应用实例。

第6章 文本分类。这一章将会介绍一些机器学习领域中常见的分类方法。讨论重点将主要集中在文本语料库,以及如何用NLTK和scikit来构建管道,从而实现一个文本分类器。当然,也会讨论与文本聚类和主题模型相关的内容。

第7章 Web爬虫。这一章将讨论NLP、数据科学和数据收集中其他方面的处理任务,以及如何从最大的文本数据源之一——Web中获取相关的数据。在这里,我们将学习如何用Python库、Scrapy来建立一只运作良好的Web爬虫(crawler)。

第8章 NLTK与其他Python库的搭配运用。这一章将会谈及一些骨干的Python库,如NumPy和SciPy。另外,我们也会简单地介绍一下用于数据处理的panda和用于可视化处理的matplotlib。

第9章 Python中的社交媒体挖掘。这一章将致力于数据采集相关的内容。在这里,我们将会讨论社交媒体,以及与社交媒体相关的其他问题。当然,我们也会讨论具体应该如何收集、分析并可视化社交媒体中的数据。

第10章 大规模文本挖掘。这一章将讨论如何扩展NLTK,并配合一些别的Python库,使其适应大数据时代规模化执行的需要。我们将会给出一个简短的演示,以说明NLTK和scikit是如何与Hadoop搭配使用的。前期准备

在阅读这本书之前,我们建议你应该准备好下列软件:章所需软件自由软软件下载链接硬件技所需(版本)件/专有术指标操作软件系统通https://www.python.org/Python/1用自http://continuum.io/downloads~Anaconda、UNIX不限由软件http://www.nltk.org/NLTK打印系5统通http://scikit-learn.org/scikit-用stable/自learn、6UNIX不限https://radimrehurek.com/由软件gensim打印系gensim/统通用自Scrapyhttp://scrapy.org/7UNIX不限由软件打印系统通http://www.numpy.org/NumPy用、SciPy、http://www.scipy.org/自8UNIX不限http://pandas.pydata.org/pandas以及由软件打印系http://matplotlib.org/matplotlib统通Twitter https://dev.twitter.com/用Python API自overview/api/twitter-libraries9UNIX不限与Facebook 由软件https://developers.facebook.打印系Python APIcom统本书的适用读者

只要你是NLP和机器学习领域的爱好者,无论之前有没有文本处理方面的经验,这本书都是为你准备的。当然,这本书也非常适合那些想要快速学习一下NLTK的资深Python程序员。编写体例

在本书中,我们会用不同的文本样式来突显不同类型信息之间的区别。下面,我们就通过几个例子来介绍一下这些样式,以及它们所代表的含义。

对于正文当中所涉及的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、伪URL、用户输入以及Twitter句柄,我们将采取如下形式:“我们需要创建一个名为NewsSpider.py文件,并将其路径设置为/tutorial/spiders。”

接下来是Python代码块:>>>import nltk>>>import numpy

还有一般性的代码块:add FILE vectorizer.pkl;add FILE classifier.pkl;

另外,在第7章中,我们还将会用到Scrapy shell中的IPython 记法,其样式如下:In [1] : sel.xpath('//title/text()')Out[1]: []

最后是所有命令行输入或输出信息的样式:# cp /usr/src/asterisk-addons/configs/cdr_mysql.conf.sample /etc/asterisk/cdr_mysql.conf 提示: 这种形式表达的是一些需要读者警惕的或需要重点关注的内容。 小技巧: 这种形式所提供的是一些提示或小技巧。读者反馈

我们始终欢迎任何来自读者的反馈信息。它能让我们了解你对于这本书的看法——无论是喜欢还是不喜欢。这些反馈对于我们的选题开发来说都是至关重要的。

对于一般的反馈,你只需简单地给feedback@packtpub.com发一份电子邮件,并在邮件的标题中注明这本书的书名即可。

如果你对某一话题有专长,并且有兴趣写(或奉献)一本这方面的书,请参考我们的作者指南:www.packtpub.com/authors。客户支持

你一直都是Packt图书的主人,我们将会尽一切努力来帮助你获取最好的图书资讯。实例代码的下载

你可以在http://www.packtpub.com自己的账户页面中找到所有已购买的Packt图书,并下载相关的实例代码。如果你是在别处购买了我们的图书,也可以通过访问 http://www. packtpub.com/support注册有关文件,我们会通过电子邮件将其直接发给你。勘误

尽管我们已经尽了最大的努力来确保书中内容的正确性,但错误始终是存在的。如果你在我们的书中发现了错误——无论是关于文字的还是代码的——只要你能告诉我们,我们都将不胜感激。因为这样可以大大减少其他读者在阅读方面所遇到的困难。因此,当你发现错误时,只需要访问http://www.packtpub.com/submit-errata,选择相应的书名,然后单击“errata submission form”链接并输入相关错误的详细信息即可。一旦你提供的信息获得了确认,相关的内容就被更新到我们的网站或对应图书勘误章节下面现有的勘误表中。

如果想要查看先前已提交的勘误信息,你只需访问 https://www.packtpub.com/books/ content/support,并在其搜索域中输入相关图书的名称,所需信息就会出现在下面的勘误部分中。版权

在互联网上,版权对于所有媒介而言一直是一个很大的问题。在Packet,我们向来对于版权许可非常重视。如果你在网络上发现任何形式的我们出版过的作品,都请马上将网址或网站名称告知我们,以便于我们采取补救措施。

请将你怀疑有侵权行为的文档链接发送到:copyright@packetpub.com。

你付出的帮助是对作者权利的保护,我们也由此才能继续为你带来有价值的内容。如有疑问

如果你对本书有任何疑问,也可以通过 questions@packtpub.com 跟我们联系,我们会竭尽所能地帮你解决问题。第1章 自然语言处理简介

现在,让我们先从介绍自然语言处理(NLP)开始吧。众所周知,语言是人们日常生活的核心部分,任何与语言问题相关的工作都会显得非常有意思。希望这本书能带你领略到NLP的风采,并引起学习NLP的兴趣。首先,我们需要来了解一下该领域中的一些令人惊叹的概念,并在工作中实际尝试一些具有挑战性的NLP应用。

在英语环境中,语言处理研究这一领域通常被简称为NLP。对语言有深入研究的人通常被叫作语言学家,而“计算机语言学家”这个专用名词则指的是将计算机科学应用于语言处理领域的人。因此从本质上来说,一个计算机语言学家应该既有足够的语言理解能力,同时还可以用其计算机技能来模拟出语言的不同方面。虽然计算机语言学家主要研究的是语言处理理论,但NLP无疑是对计算机语言学的具体应用。

NLP多数情况下指的是计算机上各种大同小异的语言处理应用,以及用NLP技术所构建的实际应用程序。在实践中,NLP与教孩子学语言的过程非常类似。其大多数任务(如对单词、语句的理解,形成语法和结构都正确的语句等)对于人类而言都是非常自然的能力。但对于NLP来说,其中有一些任务就必须要转向标识化处理、语块分解、词性标注、语法解析、机器翻译及语音识别等这些领域的一部分,且这些任务有一大部分还仍是当前计算机领域中非常棘手的挑战。在本书中,我们将更侧重于讨论NLP的实用方面,因此我们会假设读者在NLP上已经有了一些背景知识。所以,读者最好在最低限度上对编程语言有一点了解,并对NLP和语言学有一定的兴趣。

在阅读完本章之后,我们希望读者能掌握以下内容。● 对NLP及其相关概念有个基本的了解。● 完成Python和NLTK及其他库的安装。● 编写一些非常基本的Python和NLTK代码片段。

如果你从来没有接触过NLP这个概念词,我们在下面给你推荐了两本书,请花一些时间阅读一下其中的任何一本——只需要看看它们的前几章即可。另外,你也应该快速浏览一下维基百科上与NLP相关的页面。●《 Speech and Language Processing》,由Daniel Jurafsky与

James H. Martin合著。●《 Statistical Natural Language Processing》,由Christopher D.

Manning与Hinrich Schütze合著。1.1 为什么要学习NLP

关于这个问题,我们可以先来看看Gartner公司新一轮的趋势报告,你可以很清晰地看到,NLP技术赫然高居榜首。目前,NLP已被认为是业界最为稀缺的技能之一。自大数据的概念问世之后,我们所面对的主要挑战是——业界需要越来越多不仅能处理结构化数据,同时也能处理半结构化或非结构化数据的人才。对于我们所生产出来的那些博客、微博、Facebook订阅、聊天信息、E-mail以及网络评论等,各公司都在致力于收集所有不同种类的数据,以便建立更好的客户针对性,形成有意义的见解。而要想处理所有的这些非结构化数据源,我们就需要掌握一些NLP技能的人员。

身处信息时代,我们甚至不能想象生活中没有Google会是什么样子。我们会因一些最基本的事情而用到Siri;我们会需要用垃圾过滤器来过滤垃圾邮件;我们会需要在自己的Word文档中用到拼写检查器等。在现实世界中所要用到的NLP应用数不胜数,如图1-1所示。图1-1

在这里,我们可以再列举一些令人惊叹的NLP应用实例。虽然你很可能已经用过它们,但未必知道这些应用是基于NLP技术的。● 拼写校正(MS Word/其他编辑器)。● 搜索引擎(Google、Bing、Yahoo!、WolframAlpha)。● 语音引擎(Siri、Google Voice)。● 垃圾邮件分类(所有电子邮件服务)。● 新闻订阅(Google、Yahoo!等)。● 机器翻译(Google翻译与其他类似服务)。[1]● IBM Watson。

构建上述这些应用都需要非常具体的技能,需要优秀的语言理解能力和能有效处理这些语言的工具。因此,这些不仅是各NLP最具优势领域的未来趋势,同时也是我们用NLP这种最独特技能所能创建的应用种类。

在实现上面提到的某些应用以及其他基本的NLP预处理时,我们有许多开源工具可用。这些工具有些是由相关组织在建立自己的NLP应用时开发的,而有些则纯粹属于开源项目。下面我们就来看一份NLP工具的小清单。● GATE。● Mallet。● Open NLP。● UIMA。● Stanford toolkit。● Genism。● Natural Language Tool Kit (NLTK)。

上述大多数工具都是用Java编写的,在功能上也都很相似。尽管这里有一些工具功能很强大,且提供了各种NLP实用工具,但如果我们考虑到易用性和其对相关概念的解释度的话,NLTK的得分就非常高了。NLTK库是一个非常易学的工具包,这得益于Python本身非常平缓的学习曲线(毕竟NLTK是用它编写的),人们学习起来会非常快。NLTK库中收纳了NLP领域中的绝大部分任务,它们都被实现得非常优雅,且易于使用。正是出于上述的这些原因,NLTK如今已成为了NLP社区最流行的库之一。

在这里,我们会假设读者已经对Python语言有了一定程度的了解。如果你还不了解的话,我们希望你先去学习一下Python。如今在互联网上可以找到大量的Python基础教程,并且能让你对该语言进行一个快速概览的图书也不在少数。当然,我们也会针对不同主题与你探讨Python的一些特性。但就目前而言,只要你掌握了基本的Python知识,如列表、字符串、正则表达式以及基本的I/O操作,就可以继续读下去了。 提示: 你可以从下列任意一网站中获取Python安装包。● https://www.python.org/downloads/。● http://continuum.io/downloads。● https://store.enthought.com/downloads/。

这里我会推荐读者选用来自Anaconda或Canopy的Python发行版。因为这些发行版本身就具备了一些捆绑库,如SciPy、numpy、scikit等,它们可用于数据分析及其他与NLP相关领域的应用。甚至,NLTK也是该发行版的一部分。 提示: 请参照下面网址中的说明来安装NLTK与NLTK数据:http://www.nltk.org/install.html。

下面,让我们来测试一下。

请在操作系统中打开终端,并运行:$ python

该命令应该会为你打开一个Python解释器:Python 2.6.6 (r266:84292, Oct 15 2013, 07:32:41)[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>>

我希望你在这里会得到一个与上面情况类似的输出。当然,你也有可能会看到一个不太一样的输出,因此理想情况下,我们应该准备最新版本的Python(建议是2.7版)、GCC编译器,以及其他操作系统的细部安排。当然,我们知道Python目前最新的版本是3.0以上,但对于其他任意的开源系统来说,我们应该保守地选择一个更稳定的版本,而不是贸然跳到最新版本。如果你已经将项目迁移到Python 3.0+,那就务必参阅下面链接中的说明,以便了解那些被添加的新特性:https://docs.python.org/3/whatsnew/3.4.html。

对于基于UNIX的系统,Python属于默认程序(无须任何设置)。而Windows用户则需要通过设置相关路径来使Python进入正常工作状态。你可以通过以下方式来确认NLTK是否已经被正确安装:>>>import nltk>>>print "Python and NLTK installed successfully"Python and NLTK installed successfully

好了,我们可以准备出发了!1.2 先从Python开始吧

虽然,我们在这里并不打算对Python进行任何太过深入的探讨,但带你快速浏览一下Python的基础要点还是很有必要的。当然,为了观众着想,我们最好将这次基础性的快速回顾之旅控制在5分钟之内。在此期间,我们将会讨论到数据结构的基本知识,一些常用函数,以及在接下来几节中将会用到的Python通用结构。 提示:  我强烈推荐你花两个小时看一下题为《Google Python class》的参考资料:https://developers.google.com/edu/ python,那对我们来说应该算是个不错的开始。当然,你还可以通过Python的官方网站https://www.python.org/来获取更多的教程及其他相关资源。1.2.1 列表

列表(list)是Python中最常用的数据结构之一。它们基本上相当于其他编程语言中的数组。下面,就让我们先从Python列表所提供的最重要的那些功能开始吧。

我们可以在Python控制台中进行如下尝试:>>> lst=[1,2,3,4]>>> # mostly like arrays in typical languages>>>print lst[1, 2, 3, 4]

当然,Python列表也可以用更为灵活的索引来进行访问。下面再来看一个例子:>>>print 'First element' +lst[0]

在这里,你会得到如下所示的错误信息:TypeError: cannot concatenate 'str' and 'int' objects

这是因为Python是一种解释型编程语言,它会在对其表达式进行计算的同时检查其中的变量类型。我们在声明这些变量时无需对其进行初始化和类型声明。在这里,我们的列表中所包含的是一些整数对象,它们不能被直接关联到这里的print函数上,后者只能接受一个String对象。出于这个原因,我们需要将该列表元素转换成字符串。这个过程也称为类型转换。>>>print 'First element :' +str(lst[0])>>>print 'last element :' +str(lst[-1])>>>print 'first three elements :' +str(lst[0:2])>>>print 'last three elements :'+str(lst[-3:])First element :1last element :4first three elements :[1, 2,3]last three elements :[2, 3, 4]1.2.2 自助功能

如果你想要详细了解Python中各种数据类型和函数,最好的方法就是调用其帮助函数,如help()和dir(lst)。

其中,我们可以通过dir(某Python对象)命令来列出指定Python对象中所有给定的属性。例如,如果我们像下面这样将一个列表对象传递给该函数,它就会列出所有我们可以用列表来做的很酷的事情:>>>dir(lst)>>>' , '.join(dir(lst))'__add__ , __class__ , __contains__ , __delattr__ , __delitem__ , __delslice__ , __doc__ , __eq__ , __format__ , __ge__ , __getattribute__, __getitem__ , __getslice__ , __gt__ , __hash__ , __iadd__ , __imul__, __init__ , __iter__ , __le__ , __len__ , __lt__ , __mul__ , __ne__ ,__new__ , __reduce__ , __reduce_ex__ , __repr__ , __reversed__ , __rmul__, __setattr__ , __setitem__ , __setslice__ , __sizeof__ , __str__ , __subclasshook__ , append , count , extend , index , insert , pop , remove, reverse , sort'

而通过help(某Python对象)命令,我们可以得到给定Python对象的详细文档,以及该对象的一些具体用例,如:>>>help(lst.index)Help on built-in function index:index(...) L.index(value, [start, [stop]]) -> integer -- return first index of value.This function raises a ValueError if the value is not present.

基本上来说,由于help和dir这两个函数可以运用在任何Python数据类型之上,因此它们是一个很好的学习函数和其他对象细节的方法。而且,它还提供了一些基本的使用范例,这在多数情况下都是非常有用的。

Python的字符串类型与其他语言非常类似,但字符串操作同时也是Python最主要的特性之一。即在Python中,处理字符串会是一件非常轻松的工作。即使是那些非常简单的操作,例如字符串的切割,你也会看到相较于Java和C的大费周章,它们在Python中是多么得简单明了。

通过之前用过的help函数,我们可以得到任何Python对象及函数的帮助信息。下面,我们就再来看一些对字符串这种数据类型来说最为常见的操作。● split():一个能基于某些分隔符来对字符串进行切割的方法。如

果你没有为其提供具体参数,它就会默认空格为其分隔符。 >>> mystring="Monty Python ! And the holy Grail ! \n" >>> print mystring.split() ['Monty', 'Python', '!', 'and', 'the', 'holy', 'Grail', '!']● strip():一个可以从字符串中删除其尾随空白符(如'\n'、'\n\r')

的方法。 >>> print mystring.strip() >>>Monty Python ! and the holy Grail !

你会注意到'\n'字符被剥离了。另外,你也可以通过rstrip()和lstrip()来选择是剥离字符串左边还是右边的尾部空白符。● upper()/lower():我们可以用这些方法来改变字符串中字母的大

小写。 >>> print mystring.upper() >>>MONTY PYTHON !AND THE HOLY GRAIL !● replace():该方法可用于替换目标字符串中的某个子串。 >>> print mystring.replace('!','''''') >>> Monty Python and the holy Grail

当然,字符串类型的函数可远不止这些。这里只是讨论了其中最常用的一些而已。 提示: 你可以通过下面的链接了解更多字符串函数及其用例:https://docs.python.org/2/library/string.html。1.2.3 正则表达式

对NLP爱好者来说,正则表达式是另一个非常重要的技能。正则表达式(regular expression)是一种能对字符串进行有效匹配的模式。我们会大量使用这种模式,以求从大量凌乱的文本数据中提取出有意义的信息。下面,我们就来整体浏览一下你将会用到哪些正则表达式。其实,我这一生至今所用过的正则表达式无非也就是以下这些。●( 句点):该表达式用于匹配除换行符\n外的任意单字符。● \w:该表达式用于匹配某一字符或数字,相当于[a-z A-Z 0-9]。● \W(大写W):该表达式用于匹配任意非单词性字符。● \s(小写s):用于匹配任意单个空白字符,包括换行、返回、制

表等,相当于[\n\r\t\f]。● \S:该表达式用于匹配单个任意非空白字符。● \t:该表达式用于匹配制表符。● \n:该表达式用于匹配换行符。● \r:该表达用于匹配返回符。● \d:该表达式用于匹配十进制数字,即[0-9]。● ^:该表达式用于匹配相关字符串的开始位置。● $:该表达式用于匹配相关字符串的结尾位置。● \:该表达式用来抵消特殊字符的特殊性。如要匹配$符号,就在

它前面加上\。

下面,我们来看一个用于查找东西的例子。在这里,myString是要进行相关模式查找的目标字符串对象。字符串的子串搜索是re模块中最常见的用例之一。我们可以来看看它是如何实现的:>>># We have to import re module to use regular expression>>>import re>>>if re.search('Python',mystring):>>> print "We found python ">>>else:>>> print "NO "

只要我们执行了以上代码,就会立即收到如下信息:We found python

我们还可以使用更多正则表达式模式来进行查找。例如,findall()就是一个常被用于对字符串进行全部模式查找的函数。它会按照给定模式对字符串进行查找,并列出其中所有匹配的对象:>>>import re>>>print re.findall('!',mystring)['!', '!']

如你所见,myString中存在着两个“!”实例,findall返回了这两个对象的列表。1.2.4 字典

字典(dictionary)也是最常用到的一种数据结构。在其他编程语言中有时也被称为关联数组/存储。字典是一种键值索引型的数据结构,其索引键可以是任意一种不可变的类型,例如字符串和数字都经常被用来充当索引键。

字典是被多种编程语言广泛用于实现诸多算法的一种非常便利的数据结构。而且,Python的字典结构还是所有的这些编程语言中最为优雅的哈希表实现之一。哈希表是一种操作起来非常容易的字典结构,其优势在于,你只需通过寥寥几段代码就可以用它建立起一个非常复杂的数据结构,而同样的任务在其他语言中可能就需要花费更多的时间、写更多的代码。很显然,程序员们应该花更多时间在算法上,而不是数据结构本身。

下面,我打算用字典结构中常见的一个用例来获取某段既定文本中各单词的出现频率分布。你可以看到,只需短短几行代码,我们就取得了各单词在文本中的出现频率。如果你再用任意其他语言来尝试一下相同的任务,就会明白Python是何等得奇妙:>>># declare a dictionary>>>word_freq={}>>>for tok in string.split():>>> if tok in word_freq:>>> word_freq [tok]+=1>>> else:>>> word_freq [tok]=1>>>print word_freq{'!': 2, 'and': 1, 'holy': 1, 'Python': 1, 'Grail': 1, 'the': 1, 'Monty':1}1.2.5 编写函数

和其他编程语言一样,Python也有自己的函数编写方式。在Python中,函数的定义通常会从关键字def开始,后面紧跟着相应的函数名和括号()。而所有类似于其他编程语言中的参数和参数类型的声明都会被放在该括号内。其实际代码部分将会从冒号(:)后面开始,代码的初始行通常会是一个文档字符串(注释),接着是代码的主体部分,最后我们会以一个return语句来结束整个函数。下面来看个实例,这个函数实例wordfreq的开头是关键字def,它没有参数,最[2]后以一个return语句作为结束。>>>import sys>>>def wordfreq (mystring):>>> '''>>> Function to generated the frequency distribution of the given text>>> '''>>> print mystring>>> word_freq={}>>> for tok in mystring.split():>>> if tok in word_freq:>>> word_freq [tok]+=1>>> else:>>> word_freq [tok]=1>>> print word_freq>>>def main():>>> str="This is my fist python program">>> wordfreq(str)>>>if __name__ == '__main__':>>> main()

如你所见,其代码主体与上一节中所写的完全相同,只不过我们这回以函数的形式使这段代码具备了可重用性和可读性。当然,用解释器风格来编写Python代码的做法也很常见,但从大型程序的编写实践来说,使用函数/类和某种成熟的编程范式是一个更佳的做法。而且,我们也希望用户能早日编写并运行自己的第一个Python程序。对此,你需要按照以下步骤来进行。

1.用你喜欢的文本编辑器创建一个空的Python文件mywordfreq.py。

2.将上面的代码写入或复制到该文件中。

3.在操作系统中打开命令行终端。

4.在该终端中执行以下命令: $ python mywordfreq,py "This is my fist python program !!" 。

5.最后,你应该会得到以下输出: {'This': 1, 'is': 1, 'python': 1, 'fist': 1, 'program': 1, 'my':1}。

现在,相信你对Python所提供的一些常见的数据结构有了一个非常基本的了解。你已经可以编写出一个完整的Python程序,并成功地执行了它。在我看来,这些Python引导知识已经足以让你面对本书最初这几章的挑战了。 提示:  你还可以通过下面网站中的一些Python教程了解更多相关的Python命令:https://wiki.python.org/moin/BeginnersGuide。1.3 向NLTK迈进

尽管在这里,我们并不打算深入探讨自然语言处理理论,但也会尽快让你实际接触一下NLTK。因此,我打算先介绍一些NLTK的基本用例,这是一个很好的机会,你可以先为今后做类似事情做一些准备。下面,我们会从一个Python程序员习惯的处理方式切入,演示如何用NLTK将该方式转换成一个更为高效、可靠、简洁的解决方案。

我们先来看一个纯文本分析的例子。这个例子是我们要从Python官方主页上摘取部分内容。>>>import urllib2>>># urllib2 is use to download the html content of the web link>>>response = urllib2.urlopen('http://python.org/')>>># You can read the entire content of a file using read() method>>>html = response.read()>>>print len(html)47020

目前,我们还没有得到任何关于该URL所讨论话题的线索,所以接下来,我们要先做一次探索性数据分析(EDA)。通常对于一段文本域而言,EDA可能包含了多重含义,但这里只会涉及其中的一个简单用例,即该文档的主体术语类型。主题是什么?它们的出现频率如何?整个分析过程还会或多或少地涉及一些预处理层面的步骤。我们会试着先用纯Python的方式来实现它,然后用NLTK再将其实现一次。

我们先要清理掉其中的html标签。一种可行的做法是只选取其中的标记,包括数字和字符。如果之前有在工作中使用过正则表达式,你应该可以轻松地将这些html字符串转换成一个标记列表:>>># Regular expression based split the string>>>tokens = [tok for tok in html.split()]>>>print "Total no of tokens :"+ str(len(tokens))>>># First 100 tokens>>>print tokens[0:100]Total no of tokens :2860[' ', '', '', ''type="text/css"', 'media="not', 'print,', 'braille,'...]

如你所见,上面列出了我们在处理文本内容时用不到的HTML标签和其他多余字符。当然,这个任务还有个更为简洁的版本:>>>import re>>># using the split function>>>#https://docs.python.org/2/library/re.html>>>tokens = re.split('\W+',html)>>>print len(tokens)>>>print tokens[0:100]5787['', 'doctype', 'html', 'if', 'lt', 'IE', '7', 'html', 'class', 'no','js', 'ie6', 'lt', 'ie7', 'lt', 'ie8', 'lt', 'ie9', 'endif', 'if','IE', '7', 'html', 'class', 'no', 'js', 'ie7', 'lt', 'ie8', 'lt', 'ie9','endif', 'if', 'IE', '8', 'msapplication', 'tooltip', 'content', 'The','official', 'home', 'of', 'the', 'Python', 'Programming', 'Language','meta', 'name', 'apple' ...]

这样看上去已经简洁多了吧?但其实它还可以更简洁一点。在这里,我们所做的努力是尽可能地去除干扰,但那些被清理的HTML标记还是会如雨后春笋般地冒出来,而且我们可能也想以单词长度为标准,删除某一特定长度的单词——如说移除像7、8这样的元素,因为在目前情况下,这些都只是干扰词。现在,我们要做的不是用NLTK来重复相同的任务,完成这些预处理步骤。因为所有的清理工[3]作都可以通过调用clean_html()函数来完成:>>>import nltk>>># http://www.nltk.org/api/nltk.html#nltk.util.clean_html>>>clean = nltk.clean_html(html)>>># clean will have entire string removing all the html noise>>>tokens = [tok for tok in clean.split()]>>>print tokens[:100]['Welcome', 'to', 'Python.org', 'Skip', 'to', 'content', '▼','Close', 'Python', 'PSF', 'Docs', 'PyPI', 'Jobs', 'Community', '▲','The', 'Python', 'Network', '≡', 'Menu', 'Arts', 'Business' ...]

很酷吧?而且,这无疑让我们的代码更简洁易行了。

下面再来看看如何获得这些术语的频率分布。当然,我们还是要从纯Python的方式做起,之后再告诉你NLTK的方式。>>>import operator>>>freq_dis={}>>>for tok in tokens:>>> if tok in freq_dis:>>> freq_dis[tok]+=1>>> else:>>> freq_dis[tok]=1>>># We want to sort this dictionary on values ( freq in this case )>>>sorted_freq_dist= sorted(freq_dis.items(), key=operator.itemgetter(1), reverse=True)>>>print sorted_freq_dist[:25][('Python', 55), ('>>>', 23), ('and', 21), ('to', 18), (',', 18), ('the',14), ('of', 13), ('for', 12), ('a', 11), ('Events', 11), ('News', 11),('is', 10), ('2014-', 10), ('More', 9), ('#', 9), ('3', 9), ('=', 8),('in', 8), ('with', 8), ('Community', 7), ('The', 7), ('Docs', 6),('Software', 6), (':', 6), ('3:', 5), ('that', 5), ('sum', 5)]

由于目标是Python的官方主页,Python和(>>>)解释器符号自然就成了最常用的术语,这也符合该网站给人的感觉。

当然,这个任务还有一个更好用、也更有效的方法,即调用NLTK中的FreqDist()函数。在此,我们可以来看看调用后前相同代码的比对:>>>import nltk>>>Freq_dist_nltk=nltk.FreqDist(tokens)>>>print Freq_dist_nltk>>>for k,v in Freq_dist_nltk.items():>>> print str(k)+':'+str(v)>>': 23, 'and': 21, ',': 18, 'to': 18, 'the':14, 'of': 13, 'for': 12, 'Events': 11, 'News': 11, ...>Python:55>>>:23and:21,:18to:18the:14of:13for:12Events:11News:11 小技巧:  下载示例代码 你在http://www.packtpub.com中登录你的账户,从中可以下载你所购买的、由Packt出版的所有书籍的示例代码。如果你在别处购得此书,也可以在http://www. packtpub.com/support上注册相关文件,我们会用E-mail将其直接发送给你。

现在,让我们来做一些更时髦的事。我们来绘制这样的一张图,如图1-2所示。>>>Freq_dist_nltk.plot(50, cumulative=False)>>># below is the plot for the frequency distributions图1-2

在图1-2中,我们可以看到累积频率的即时增长,在某些点上曲线会进入一条长长的尾巴。其中依然存在着一些干扰,有些类似于the、of、for以及=这样的词都是属于无用词,这些词有一个专用术语:停用词。如the、a、an这样的词也都属于停用词。由于冠词、代词在大多数文档中都是普遍存在的,因而对信息的识别没有帮助。在大多数NLP及信息检索任务中,人们通常都会先删除掉这些停用词。下面,让我们再次回到之前运行的那个例子中,绘制结果如图1-3所示。>>>stopwords=[word.strip().lower() for word in open("PATH/english.stop.txt")]>>>clean_tokens=[tok for tok in tokens if len(tok.lower())>1 and (tok.lower() not in stopwords)]>>>Freq_dist_nltk=nltk.FreqDist(clean_tokens)>>>Freq_dist_nltk.plot(50, cumulative=False) 提示: 如果想知道关于词云的更多信息,请访问http://www. wordle.net/advanced。图1-3

现在,代码看起来简洁多了吧!在完成这么多事后,你可以去Wordle网站上将其频率分布以CSV形式显示出来,可以得到如图1-4所示词云图。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载