Python和NLTK自然语言处理

978-7-115-50334-3
作者: [印度] 尼天•哈登尼亚(Nitin Hardeniya)雅各布•帕金斯(Jacob Perkins) 迪蒂•乔普拉(Deepti Chopra) 尼什•斯乔希(Nisheeth Joshi) 伊提•摩突罗(Iti Mathur)
译者: 林赐
编辑: 谢晓芳

图书目录:

详情

本书是一本运用NLTK和其他Python库构建专业NLP和机器学习项目的学习指南。本书共分为三部分。第一部分是NLTK基本模块,重点是如何创建文本分割器和解析器。第二部分介绍一些简单的文本处理方法和语言处理的基本技术。第三部分将会带领读者去实现自己的NLP项目。

图书摘要

版权信息

书名:Python和NLTK自然语言处理

ISBN:978-7-115-50334-3

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [印度]尼天•哈登尼亚(Nitin Hardeniya)

     [印度]雅各布•帕金斯(Jacob Perkins)

     [印度]迪蒂•乔普拉(Deepti Chopra)

     [印度]尼什•斯乔希(Nisheeth Joshi)

     [印度]伊提•摩突罗(Iti Mathur)

译    林 赐

责任编辑 谢晓芳

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright © Packt Publishing 2016. First published in the English language under the title Natural Language Processing: Python and NLTK.

All Rights Reserved.

本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


本书旨在介绍如何通过Python和NLTK实现自然语言处理。本书包括三个模块。模块1介绍文本挖掘/NLP任务中所需的所有预处理步骤,包括文本的整理和清洗、词性标注、对文本的结构进行语法分析、文本的分类等。模块2讲述如何使用Python 3的NLTK 3进行文本处理,包括标记文本、替换和校正单词、创建自定义语料库、词性标注、提取组块、文本分类等。模块3讨论了如何通过Python掌握自然语言处理,包括统计语言模型、词语形态学、词性标注、解析、语义分析、情感分析、信息检索等。

本书适合NLP和机器学习领域的爱好者、Python程序员以及机器学习领域的研究人员阅读。


不下雪的日子,渥太华一片喧闹。2018年4月的雪刚刚化去,5月的郁金香节姗姗来迟,举目望去,大片大片的郁金香花把渥太华装点得五彩缤纷,绚烂多姿,生机盎然。在阳光的照射下,各色的郁金香花芬芳吐蕊、娇艳妩媚,令人陶醉和流连忘返。郁金香的芬芳还未散去,渥太华就迎来了“炎天暑月”的夏季,说是夏季,气温却很少超过30℃,此时,蛰伏了一个冬天的加拿大人,经受不住太阳的诱惑,蜂拥出动,三五成群地在里多运河的沙滩上玩耍嬉戏,好不自在。门户开放日(Doors Open Ottawa)、爵士音乐节、马拉松,各种活动精彩纷呈。正如鲁迅所说,越是民族的,就越是世界的。世界各地的移民带着自己家乡的文化和节日来到了渥太华。例如,中国的龙舟节成了这里的盛典,同时各个民族的人民也各自庆祝自己的节日,如夏至原住居民节等。

加拿大是个移民国家,在这里,既可以看到不同的民族着装,也可以看到迥异的服饰风格。在不同的文化中,对个性的定义也各不相同,因此即使使用同一个词来形容一个人,也具有不同的韵味。作为中国人,我的思想不偏不倚,因此对各种奇装异服也就抱着听之任之的态度。我既欣赏热情奔放,也不排斥含蓄典雅。但是,对于计算机而言,要体察到语言的深层次含义,可谓“蜀道难,难于上青天”。本书介绍了如何编写能够理解人类语言的系统。

在翻译此书时,我想起了“通天塔”(The Tower of Babel)的故事。在《旧约》中,巴比伦人(Babylonian)想建造一座通天塔,但是上帝对此感到不满,因此借由变乱了人类的语言,使他们互相不能交流,破坏了这一工程。长久以来,人们一直在寻找不同语言之间的沟通方法。在20世纪三四十年代,凭借计算机的计算能力,人们开始了机器翻译的伟大尝试。这80多年来,人们在自然语言处理方面前赴后继,各个国家你追我赶,都想在这一领域拔得头筹,再造一座通天塔。直至最近,人类才第一次看到了梦想的曙光。市面上也出现了各种机器翻译的软件,极大提高了人类译者的工作效率。这些软件具有可用性和市场价值。但是,机器翻译只是自然语言处理领域一个非常小的应用部分。自然语言处理其实包罗万象,让人眼花缭乱。其应用还包括问答系统、情感分析、图片题注、语音识别、词性标注、命名实体识别等。

自然语言处理博大精深,是一门融语言学、计算机科学、数学、统计于一体的科学。“纸上得来终觉浅,绝知此事要躬行。”要想完全掌握现在的自然语言技术,靠阅读几本书、几篇文章,是远远不够的。选择学习自然语言处理,并希望成为机器学习工程师,要经过三个阶段:实践、思考、创新。正如《荀子•儒效》中所说,“不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。学至于行止矣。”但是,“学而不思则罔,思而不学则殆。”在实践中,我们也要注重思考,寻找技术背后的原理,才能触类旁通,举一反三。作为科研工作者,仅仅成为知识的搬运工是不思进取的表现。“删繁就简三秋树,领异标新二月花。”掌握了知识之后,我们还应该学会创新,唯有这样,才可以成为社会的中流砥柱,引领技术的潮流。

在这里,我要特别感谢人民邮电出版社的领导和编辑,感谢他们对我的信任和理解,把这样一本好书交给我翻译。我也要感谢他们为本书的翻译投入了巨大的热情,可谓呕心沥血。没有他们的耐心和帮助,本书不可能顺利付梓。同时,在翻译过程中,加拿大友人Jack Liu和Connie Wang多次帮我指点迷津,才能使我为读者提供更贴切的译文。

译者才疏学浅,见闻浅薄,译稿中多有疏漏之处,还望读者谅解并不吝指正。读者如有任何意见和建议,请将反馈信息发送到邮箱cilin2046@gmail.com。本书全由林赐翻译。

林 赐  


NLTK是自然语言处理(Natural Language Processing,NLP)社区中最受欢迎和广泛使用的库之一。NLTK的优点在于其简单性,其中大多数复杂的NLP任务可以使用几行代码实现。本书主要内容包括:如何将文本标记为各个单词,如何使用WordNet语言词典,如何以及何时进行词干提取或者词形还原,如何替换单词和纠正拼写,如何创建自己的自定义文本语料库和语料库(包括MongoDB支持的语料库)读取器,如何使用词性标注器和部分词性标注单词,如何使用部分解析创建和转换分块短语树,如何进行文本分类的特征提取和情感分析,如何进行并行和分布式文本处理,以及如何在Redis中存储单词分布。

这种一边学习一边动手实践的学习方式会教你更多知识。本书有助于你成为使用NLTK进行自然语言处理的专家。

模块1讨论文本挖掘/NLP任务中所需的所有预处理步骤。该模块详细讨论标记化、词干提取、停用词删除和其他文本清理过程,以及如何在NLTK中轻松实现这些操作。

模块2解释如何使用语料库读取器和创建自定义语料库。它还介绍如何使用NLTK附带的一些语料库。它涵盖组块过程(也称为部分分析),组块过程可以识别句子中的短语和命名实体。它还解释如何训练自己的自定义组块器并创建特定的命名实体识别器。

模块3讨论如何计算单词频率和实现各种语言建模技术。它还讨论浅层语义分析(即NER)的概念和应用及使用Wordnet的TSD。

模块3有助于你理解和应用信息检索与文本摘要的概念。

在学习模块1时,需要满足的软硬件配置如下表所示。

章号

需要的软件

免费/专用

下载软件的网站

硬件规格

需要的操作系统

第1~5章

Python/Anaconda 和NLTK

免费

Python官网、continuum官网和NLTK官网

通用UNIX打印系统

任意

第6章

scikit-learn和gensim

免费

scikit-learn官网、radimrehurek官网

通用UNIX打印系统

任意

第7章

Scrapy

免费

Scrapy官网

通用UNIX打印系统

任意

第8章

NumPy、SciPy、Pandas和Matplotlib

免费

Numpy官网、Scipy官网、Pandas官网和Matplotlib官网

通用UNIX打印系统

任意

第9章

Twitter、Python API和Facebook API

免费

Twitter官网和Facabook官网

通用UNIX打印系统

任意

在学习模块2时,需要Python 3和列出的Python包。在本书中,作者使用了Python 3.3.5。要安装这些包,可以使用pip(参见Python官网)。以下是学习模块2时需要的包列表,以及编写本书时使用的版本号。

你还需要NLTK-Trainer,可在GitHub网站上获得它。

除了Python之外,还有使用MongoDB和Redis两个NoSQL的技巧。MongoDB可以在MongoDB官网下载,Redis可以在Redis官网下载。

对于模块3的所有章节,使用了Python 2.7或3.2+。NLTK 3.0必须安装在32位计算机或64位计算机上。所需的操作系统是Windows/Mac/UNIX系统。

如果你是NLP或机器学习爱好者以及想要快速掌握使用NLTK进行自然语言处理的中级Python程序员,那么本书的章节安排将为你带来很多好处。语言学和语义学分析方面的专业人士也会从本书中收益。

欢迎来自读者的反馈。让我们知道你对这本书的看法—你喜欢或不喜欢的内容。读者反馈对我们很重要,因为它可以帮助我们开发真正有用的选题。

要向我们发送一般反馈,请发送电子邮件至feedback@packtpub.com,并在你的邮件标题中包含本书的书名。

如果你精通某方面的专业知识,并且有兴趣撰写或参与撰写某本书,请参考packtpub.com网站上的作者指南。

既然你购买了Packt图书,那么还有更多配套资源可以帮助获得更大收益。

可以从你在packtpub.com网站上的账号中下载本书的示例代码文件。如果你从其他地方购买了本书,那么请你访问packtpub.com网站并注册,之后客服人员会直接通过电子邮件向你发送示例代码文件。

可以按照以下步骤下载示例代码文件。

(1)使用你的电子邮件地址和密码登录packtpub.com网站并注册。

(2)将鼠标指针悬停在顶部的SUPPORT选项卡上。

(3)单击Code Downloads&Errata按钮。

(4)在Search框中输入书名。

(5)选择你要下载示例代码文件的书名。

(6)从你已购买书目的下拉菜单中选择对应的书名。

(7)单击Code Download按钮。

还可以通过单击Packt Publishing网站上本书页面上的Code Files按钮来下载代码文件。可以通过在Search框中输入本书的书名来访问此页面。请注意,你需要登录你的Packt账户。

下载文件后,请确保使用以下最新版本的解压缩软件解压缩文件夹。

本书的代码包也托管在GitHub网站上。在GitHub网站上的书目、视频和课程目录中还提供了其他的代码包。请访问GitHub网站确认一下。

虽然我们已经尽力确保本书内容的准确性,但是错误在所难免。如果你在我们的一本书中发现了错误,可能是文字或代码中的错误,如果你能向提交勘误,我们将不胜感激。通过这样做,可以避免其他读者少走弯路,并帮助我们进一步提升本书后续版本的质量。如果你发现了任何勘误,请访问packtpub官网,选择书名,单击Errata Submission Form链接,并输入详细的勘误信息进行报告。一旦你的勘误表通过了验证,将会接受你的提交,并且将勘误信息上传到我们的网站或添加到本书勘误部分下现有的勘误表中。

要查看以前提交的勘误表,请访问packtpub官网并在Search框中输入本书的名称。所需信息将显示在Errata部分下。

盗版因特网上受版权保护的内容是所有媒体上层出不穷的问题。在Packt,我们非常重视保护我们的版权和许可。如果你在因特网发现以任何形式抄袭我们作品的行为,请立即向我们提供网络地址或网站名称,以便我们采取补救措施。

如果你发现了可疑的盗版内容,请过copyright@packtpub.com联系我们。

感谢你帮助保护作者的版权,能够为你提供有价值的内容,我们也感到非常欣慰。

如果你对本书的任何方面有疑问,欢迎通过questions@packtpub.com联系我们,我们将尽力解决问题。


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书配套资源包括书中示例的源代码。

要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意,为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。

如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


使用NLTK和其他Python库构建炫酷的NLP和机器学习应用


本书将从自然语言处理(NLP)简介开始讲述。语言是我们日常生活的核心部分,处理与语言相关的任何问题都是非常有趣的。我希望此书能够让你一嗅NLP的芬芳,激励你去了解更令人惊奇的NLP概念,并鼓励你开发一些具有挑战性的NLP应用。

研究人类语言的过程称为NLP。深入研究语言的人称为语言学家,而“计算语言学家”这个专有名词适用于应用计算研究语言处理的人。从本质上讲,计算语言学家是深入了解语言的计算机科学家,计算语言学家可以运用计算技能,对语言的不同方面进行建模。计算语言学家解决的是语言理论方面的问题,NLP只不过是计算语言学的应用。

NLP更多探讨的是应用计算机,处理不同语言的细微差别,以及使用NLP技术构建现实世界的应用。在实际情景下,NLP类似于教孩子学语言。一些最常见的任务(如理解单词和句子,形成在语法和结构上正确的句子)对人类而言是很自然。在NLP领域,把这样的一些任务转化为标记解析(tokenization)、组块(chunking)、词性标注(part of speech tagging)、解析(parsing)、机器翻译(machine translation)、语音识别(speech recognition),这些任务中的大部分依然是计算机所面临的最严峻的挑战。本书假设读者都有一些NLP方面的背景,因此更多探讨的是NLP的实践方面。本书期望读者,对编程语言有一些最基本的理解,并对NLP和语言感兴趣。

本章主要内容如下。

如果你从来没有听说过NLP这个词,那么请花一些时间来阅读这里提到的任何一本书籍,只要阅读最初几章即可。至少要快速阅读一些与NLP相关的维基百科网页。

本节从Gartner的技术成熟度曲线开始讨论,从这条曲线上,你可以清楚地看到NLP处在技术成熟度曲线的顶部。目前,NLP是行业所需的稀有技能之一。在大数据到来之后,NLP面临的主要的挑战是,NLP需要大量不但精通结构化数据而且擅长于处理半结构化或非结构化数据的技术人员。我们正在生成拍字节量级的网络博客、推特信息、脸书(Facebook)的推送信息、聊天记录、电子邮件和评论。一些公司正在收集所有这些不同种类的数据,以便更好地为客户定位,并从中得到有意义的见解。为了处理这些非结构化数据源,我们需要了解NLP的技术人员。

我们身处信息时代;我们甚至不能想象生活中没有谷歌。我们使用Siri来处理大多数基本的语音功能。我们使用垃圾邮件过滤器过滤垃圾邮件。在Word文档中,我们需要拼写检查器。在我们周围,存在许多NLP在现实世界中应用的例子。

(图片来自gartner网站)

下面也提供一些你能够使用但是没有意识它们是建立在NLP上的令人赞叹的NLP应用的示例。

构建这些应用需要一种非常特殊的技能集,你需要对语言非常了解,并具有可以有效处理语言的工具。因此,让NLP成为最具优势的领域之一的原因不是广告宣传,而是可以使用NLP创建的这种应用使得NLP成为必备的最独特技能之一。

为了实现上述的一些应用,以及其他基本的NLP预处理,我们有很多可用的开源工具。在这些工具中,有一些是某些组织为建立自己的NLP应用而开发的,而有一些是开源的。这里是一张可用的NLP工具列表。

大部分工具是用Java编写的,具有相似的功能。其中一些工具非常健壮,可以获得NLP工具的不同版本。但是,当涉及易于使用和易于解释这两个概念的时候,NLTK得分最高。由于Python(NLTK的编码语言)的学习曲线非常快,因此NLTK也是非常易于学习的工具包。NLTK已经将大部分的NLP任务纳入篮中,非常优雅,容易用于工作中。出于所有这些原因,NLTK已成为NLP界最流行的库之一。

本书假设所有读者都了解Python。如果你还不知道Python,我劝你学习Python。在网上,有很多可用的关于Python的基本教程。有很多书籍也可以让你快速浏览Python语言。本书在探讨一些不同主题的同时,也将探讨Python的一些特点。但是现在,即使你只知道Python的一些基本知识,如列表、字符串、正则表达式和基本的I/O,也应该继续阅读此书。

 提示: 

可以从以下网站下载Python:

Python网站、continuum网站和enthought网站。

建议使用Anaconda和Canopy Python的发行版本。理由是,这些版本绑定了一些库,如scipy、numpy、scikit等,你可以使用这些库进行数据分析,开发出与NLP有关的应用,以及把这些库应用于相关领域。即使NLTK也是这个发行版本的一部分。

 提示: 

请按照nltk网站的说明,安装NLTK和NLTK数据。

下面测试所有功能。

请在相应的操作系统中,启动终端。然后运行:

$ 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 linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

我希望你得到的输出与这个类似。你有可能得到一个不同的输出,但是在理想情况下,你获得了Python的最新版本(建议的版本是2.7)信息、编译器GCC的信息,以及操作系统的详细信息。Python的最新版本是3.0+,但是,与任何其他开源的系统一样,我们应该试图保持相对稳定的版本,而不是跳跃到最新版本。如果你已经使用了Python 3.0+,那么请从python网站了解新版本中又添加了哪些新特征。

基于UNIX的系统将Python作为默认程序。Windows用户可以设置路径,让Python正常运行。下面检查一下是否已经正确安装了NLTK。

>>>import nltk
>>>print "Python and NLTK installed successfully"
Python and NLTK installed successfully

我们准备好了。

本节不会深入探讨Python。然而,我们会让你快速浏览一遍Python的基本知识。同样,为了读者的利益,我认为应该来一段5分钟的Python之旅。接下来的几节将谈论数据结构的基本知识、一些常用的函数,以及Python的一般构建方式。

 提示: 

强烈推荐Google网站上为期两小时的谷歌Python课堂,这应该是一个好的开端。请浏览Python网站,查看更多教程和其他资源。

在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是一种解释性语言,我们在声明变量时,不需要初始化变量并声明变量的类型,Python只有在计算表达式时,才检查变量类型。在列表中,对象是整数类型的,因此它们不能与print函数串接。这个函数只接受字符串对象。出于这个原因,我们需要将列表元素转换为字符串。这个过程也称为强制类型转换(typecasting)。

>>>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 :1
last element :4
first three elements :[1, 2,3]
last three elements :[2, 3, 4]

了解更多不同的数据类型和函数的最佳方法是使用帮助函数,如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对象的详细文档,并且这个命令也给出一些示例,告诉我们如何使用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.

因此,在Python的任何数据类型上,都可以使用help和dir,并且这是一种非常不错的方式,可用于了解关于函数和对象的其他详细信息。这也提供了一些基本示例,供你在工作中参考,在大部分情况下,这些示例非常有用。

在Python和其他语言中,字符串都非常相似,但是对字符串的操作是Python的主要特征之一。在Python中,使用字符串非常容易。在Java/C中,即使是一些很简单的操作(例如将字符串分割),我们也需要花很大的精力才能做到。然而,在Python中,你会发现这是多么容易。

在应用任何Python对象和函数时,你都可以从先前的help函数中获得帮助。下面使用最常用的数据类型字符串给你提供更多的例子。

 >>> mystring="Monty Python ! And the holy Grail ! \n"
 >>> print mystring.split()
 ['Monty', 'Python', '!', 'and', 'the', 'holy', 'Grail', '!']
 >>> print mystring.strip()
 >>>Monty Python ! and the holy Grail !

你是否发现'\n'字符被移除了?还有其他方法(如lstrip()和rstrip())可以移除字符串左侧和右侧的尾随空格。

 >>> print (mystring.upper()
 >>>MONTY PYTHON !AND THE HOLY GRAIL !
 >>> print mystring.replace('!','''''')
 >>> Monty Python and the holy Grail

刚才谈到的是一些最常用的字符串函数,函数库中还存在大量的字符串函数。

 提示: 

要了解更多函数和示例,请浏览Python网站。

NLP发烧友的另外一个重要技能是使用正则表达式工作。正则表达式描述了字符串的有效模式匹配。我们大量使用模式提取从众多杂乱无章的文本数据中获得有意义的信息。以下是读者所需要的正则表达式。在我一生中,我所用的正则表达式都不会超过这个范围。

例如,要匹配$符号,可以在它前面加上\。

在现行的例子(即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使用一个列表,返回了这两个对象。

词典是另一种最常用的数据结构,在其他编程语言中,这也称为关联数组/关联记忆(associative array/memory)。词典是使用键(key)进行索引的数据结构,这些键可以是任何不可变的类型,如字符串和数字可以用作键。

词典是非常方便的数据结构,广泛应用于各种编程语言中来实现多种算法。在众多的编程语言中,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}

正如其他编程语言,Python也有其编写函数的方式。在Python中,函数以关键字def开始,然后是函数名和圆括号()。这与其他编程语言相似,即任何参数和参数的类型都放在圆括号内。实际的代码以冒号(:)开头。代码的初始行通常是文档字符串(注释),然后才是代码体,函数使用return语句结束。例如,在给定的例子中,函数wordfreq以def关键字开始,这个函数没有参数,并且以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命令。

无须进一步研究自然语言处理的理论,下面开始介绍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标签开始。完成这个任务的一种方式是仅仅选择包括了数字和字符的标记(token)。任何能够使用正则表达式工作的人员应该能够将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标签。在这个例子中,字长为1的单词(如7和8这样的元素)仅仅是噪声,你可能希望以字长作为标准,移除这些单词。现在,与其从头开始编写一些预处理步骤的代码,不如将目光转移到NLTK,使用NTLK执行相同的任务。有一个函数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
>>>:23
and:21
,:18
to:18
the:14
of:13
for:12
Events:11
News:11

 小技巧:下载示例代码 

在packtpub网站上,对于所有已购买的Packt出版的书籍,都可以使用自己的账户,从网站上下载示例代码文件。如果你在其他地方购买了这本书,你可以访问packtpub网站,进行注册,让文件直接通过电子邮件发送给你。

现在,让我们做一些更有趣的事情,画出这些频率分布。

>>>Freq_dist_nltk.plot(50, cumulative=False)
>>># below is the plot for the frequency distributions

可以看到,累积频率持续增长,整体上,曲线有一条长长的尾巴。一些噪声依然存在,一些单词(如the、of、for和=)是毫无用处的。对于这些单词(如the、a、an等),使用术语停用词(stop word)来称呼它们。由于在大部分文档中不定代词一般都会出现,因此这些词没有什么判别力,不能传达太多的信息。在大多数的NLP和信息检索任务中,人们通常会删除停用词。让我们再次回到当前的示例中。

>>>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)

 

 提示: 

请访问Wordle网站以获得更多词云。

现在,这看起来干净多了!在完成了这么多任务后,可以访问Wordle,将频率分布转换成CSV格式。你应该能够得到以下词云。

总之,这一章的目的概述自然语言处理。虽然本书确实假定读者有一些NLP基础知识和使用Python进行编程的背景,但是本章让读者非常快地了解Python和NLP。我们已经安装了所有相关的程序包,这样我们就可以使用NLTK进行工作。我们希望能够使用几行简单的代码,给你灌输一些使用NLTK的概念。为了在大量非结构化文本中可视化主题,我们提供一种非常棒的并且让人耳目一新的方法——词云。词云在文本分析行业中也相当流行。我认为目标是围绕着NLTK建立一切,让Python在你的系统上能够顺利工作。你应该能够编写和运行基本的Python程序。我希望读者能够感受到NLTK库的力量,并建立一个小的运行示例。这个示例涉及词云方面一个基本的应用。如果读者能够生成词云,我就认为我们成功实现了目标。

接下来的几章将从语言的角度详细讨论Python及其与处理自然语言相关的特征,并探讨一些基本的NLP预处理步骤,以及一些与NLP相关的基本概念。


相关图书

Python极客项目编程(第2版)
Python极客项目编程(第2版)
动手学自然语言处理
动手学自然语言处理
Python财务应用编程
Python财务应用编程
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
Web应用安全
Web应用安全
Python自动化测试教程
Python自动化测试教程

相关文章

相关课程