前言

这是一本关于自然语言处理的书。所谓“自然语言”,是指人们日常交流使用的语言,如英语,印地语,葡萄牙语等。相对于编程语言和数学符号这样的人工语言,自然语言随着一代人传给另一代人而不断演化,因而很难用明确的规则来刻画。从广义上讲,“自然语言处理”(Natural Language Processing 简称NLP)包含所有用计算机对自然语言进行的操作。举个极端的例子,它可以是简单的通过计数词出现的频率来比较不同的写作风格。另外一个极端的例子,NLP 包括完全“理解”人所说的话,至少要能达到对人的话语作出有效反应的程度。

基于NLP 的技术应用日益广泛。例如:手机和手持电脑支持输入法联想提示和手写识别;网络搜索引擎能搜到非结构化文本中的信息;机器翻译能把中文文本翻译成西班牙文;文本分析让我们能够检测推文和博客中的情感。通过提供更自然的人机界面和更复杂的存储信息获取手段,语言处理正在这个多语种的信息社会中扮演更核心的角色。

这本书提供自然语言处理领域非常方便的入门指南。它可以用来自学,也可以作为自然语言处理或计算语言学课程的教科书,或是人工智能、文本挖掘、语料库语言学课程的补充读物。本书的实践性很强,包括几百个实际可用的例子和分级练习。

本书基于Python 编程语言及其上的一个名为自然语言工具包(Natural Language Toolkit ,简称NLTK)的开源库。NLTK 包含大量的软件、数据和文档,所有这些都可以从http://nltk.org/ 免费下载。NLTK 的发行版本支持Windows、Macintosh 和Unix 平台。我们强烈建议你下载Python 和NLTk,与我们一起尝试书中的例子和练习。

读者

NLP 是科学、经济、社会和文化的一个重要因素。NLP 正在迅速成长,它的很多理论和方法在大量新的语言技术中得到应用。所以对很多行业的人来说掌握NLP 知识十分重要。在应用领域包括从事人机交互、商业信息分析、web 软件开发的人。在学术界包括从人文计算学、语料库语言学到计算机科学和人工智能领域的人。(学术界的很多人把NLP 叫称为“计算语言学”。)

本书旨在帮助所有想要学习如何编写程序分析书面语言的人,不管他们以前的编程经验如何:

初学编程?:
本书的最初几章适合没有编程经验的读者,只要你不怕应对新概念和学习新的计算机技能。遍布书中的例子和数以百计的分级练习,你都可以复制下来亲自尝试一下。如果你需要一个更一般性的关于Python 的介绍,在http://docs.python.org/ 有Python 资源列表。
初学Python?:有经验的程序员可以很快掌握书中用到的Python 代码,而专注于自然语言处理。所有涉及到的Python 的特征都经过精心解释和举例说明,你很快就会体会到Python 用在这个应用领域是多么合适。语言索引可帮助你在这本书中找到相关的讨论。
已经精通Python?:
你可以略读Python 的例子而钻研第一章开始的有趣的语言分析材料。你能很快在这个迷人的领域展现你的技能。

强调

本书是一本实用的介绍NLP 的书。你将通过例子来学习,编写真正的程序,体会到能够通过实践验证自己想法的价值。如果你没有学过编程,本书将教你编程与其他编程书籍不同的是,我们提供了丰富的来自NLP 领域的实例和练习。我们撰写本书的方法也是有原则的,无论是严谨的语言学还是计算分析学,我们不回避所涉及到的基础理论。在理论与实践之间的折中,确定它们之间的联系与区别过程中,我们偏向实用最终我们认识到只要能从中受益而感到快乐这些都是无关紧要的,所以我们竭尽所能插入了很多既有益又有趣的应用和例子,有些甚至有些异想天开。

请注意本书并不是一本工具书。本书讲述的Python 和NLP 是精心挑选的,并通过教程的形式展现的。关于参考材料,请查阅http://python.org/http://nltk.org/,那里有大量可搜索的资源。

本书也不是高深的计算机科学文章。书中的内容属于初级和中级,目标读者是那些想要学习如何使用Python 和自然语言工具包来分析文本的人。如果要了解NLTK 中实现的高级算法,可以查看http://nltk.org/ 链接中的Python 代码,并参考本书引用的其他材料。

你将学到什么?

通过钻研本书,你将学到:

根据读者知识背景和学习NLP 的动机不同,从本书中获得的技能和知识也将不同,详情见表III.1

表 III.1:

读者的目标和背景不同,阅读本书可获得的技能和知识

目标艺术和人文背景科学与工程背景
语言分析操控大型语料库,设计语言模型,验证由经验得出的假设。使用数据建模,数据挖掘和知识发现的技术来分析自然语言。
语言技术应用NLP 技术构筑健壮的系统处理语言学任务。使用健壮的语言处理软件中的语言学算法和数据结构。

篇章结构

本书前几章按照概念的难易程度编排,先是实用性很强的语言处理的入门介绍,讲述如何使用很短的Python 程序分析感兴趣的文本信息(1-3 章)。接着是结构化程序设计章节(第4 章),用来巩固散布在前面几章中的编程要点。之后,速度加快,我们用一系列章节讲述语言处理的主要内容:标注、分类和信息提取(5-7 章)。接下来的三章探索分析句子、识别句法结构和构建表示句意的方法(8-10 章)。最后一章讲述如何有效管理语言数据(第11 章)。本书结尾处的后记简要讨论了NLP 的过去和未来。

每一章中我们都在两种不同的叙述风格间切换。一种风格是以自然语言为主线。我们分析语言,探索语言学概念,并在讨论中使用编程的例子。我们经常会使用尚未系统介绍的Python 结构,这样你可以在钻研这些程序如何运作的细节之前了解它们的效能。就像学习一门外语的惯用表达一样,你能够买到好吃的糕点而不必先学会复杂的提问句型。叙述的另一种风格是以程序设计语言为主线。我们将分析程序、探索算法,而语言学例子将扮演配角。

每章结尾都有一系列分级练习,用于巩固学到的知识。练习按照如下的标准分级:☼ 初级练习:对范例代码作稍微修改等简单的练习; ◑ 中级练习:深入探索材料的一个方面,需要仔细的分析和设计;★ 高级练习:开放的任务,挑战你对材料的理解并迫使你独立思考解决的方案(新学编程的读者应该跳过这些)。

每一章都有深入阅读环节和放在http://nltk.org/ 网上的一个“额外”的小节,用来介绍更深入的材料和一些网络资源。所有实例代码都可从网上下载。

为什么使用Python?

Python 是一种简单但功能强大的编程语言,非常适合处理语言数据。Python 可以从http://python.org/免费下载。能够在各种平台上安装运行。

下面是一个的5 行Python 程序,它操作file.txt 文件,输出所有后缀是ing 的词。

>>> for line in open("file.txt"):
...     for word in line.split():
...         if word.endswith('ing'):
...             print(word)

这段程序演示了Python 的一些主要特征。首先,使用空格缩进代码,从而使if后面的代码都在前面一行for语句的范围之内;这保证了检查单词是否以ing 结尾的测试对所有单词都进行。第二,Python 是面向对象语言;每一个变量都是包含特定属性和方法的对象。例如,变量line 的值不仅仅是一个字符串序列。它是一个string 对象,包含一个用来把字符串分割成词的split() 方法(或叫操作)。我们在对象名称后面写上一个点再写上方法名称就可以调用对象的一个方法,例如line.split()第三,方法的参数写在括号内。例如,上面的例子中的word.endswith('ing')具有一个参数'ing' 表示我们需要找的是ing 结尾的词而不是别的结尾的词。最后也是最重要的,Python 的可读性如此之强以至于可以相当容易的猜出程序的功能,即使你以前从未写过一行代码。

我们选择Python 是因为它的学习曲线比较平缓,文法和语义都很清晰,具有良好的处理字符串的功能。作为解释性语言,Python 便于交互式编程。作为面向对象语言,Python 允许数据和方法被方便的封装和重用。作为动态语言,Python 允许属性等到程序运行时才被添加到对象,允许变量自动类型转换,提高开发效率。Python 自带强大的标准库,包括图形编程、数值处理和网络连接等组件。

Python 在世界各地的工业、科研、教育领域应用广泛。它因为提高了软件的生产效率、质量和可维护性而备受称赞。http://python.org/about/success/ 中列举了许多成功使用Python 的故事。

NLTK 定义了一个使用Python 进行NLP 编程的基础工具。它提供重新表示自然语言处理相关数据的基本类,词性标注、文法分析、文本分类等任务的标准接口以及这些任务的标准实现,可以组合起来解决复杂的问题。

NLTK 自带大量文档。作为本书的补充,http://nltk.org/ 网站提供的API 文档涵盖工具包中每一个模块、类和函数,详细说明了各种参数,还给出了用法示例。

Python 3和 NLTK 3

本书的这个版本已更新并支持Python 3 和NLTK 3。Python 3包括一些重大的变化︰

这些变化的更多细节请参见https://docs.python.org/dev/whatsnew/3.0.html.。有一个2to3.py 工具可以将Python 2代码转换为Python 3;关详细信息请参阅https://docs.python.org/2/library/2to3.html

NLTK 同样很多地方都有更改︰

更详细的变更列表请参见https://github.com/nltk/nltk/wiki/Porting-your-code-to-NLTK-3.0

软件安装需求

为了充分利用好本书,你应该安装一些免费的软件包。http://nltk.org/ 上有这些软件包当前的下载链接和安装说明。

Python:本书中例子假定你正在使用Python 3.2 或更高版本。(注,NLTK 3.0 也适用于 Python 2.6 和 2.7)。
NLTK:这本书中的代码示例使用NLTK 3.0 版。NLTK 的后续版本将会向后兼容NLTK 3.0。
NLTK-Data:包含本书中分析和处理的语言语料库。
NumPy:(推荐)这是一个科学计算库,支持多维数组和线性代数,在某些计算概率、标记、聚类和分类任务中用到。
Matplotlib:(推荐)这是一个用于数据可视化的2D 绘图库,本书在产生线图和条形图的程序例子中用到。
斯坦福大学NLP 工具︰
(推荐)NLTK 包括斯坦福大学NLP 工具的接口,可用于大型语言处理(见http://nlp.stanford.edu/software/)。
NetworkX:(可选)这是一个用于存储和操作由节点和边组成的网络结构的函数库。可视化语义网络还需要安装Graphviz 库。
Prover9:(可选)这是一个使用一阶等式逻辑定理的自动证明器,用于支持语言处理中的推理。

自然语言工具包 (NLTK)

NLTK 创建于2001 年,最初是宾州大学计算机与信息科学系计算语言学课程的一部分。从那以后,在数十名贡献者的帮助下不断发展壮大。如今,它已被几十所大学的课程所采纳,并作为许多研究项目的基础。VIII.1 列出了NLTK 的一些最重要的模块。

表 VIII.1

语言处理任务与相应NLTK 模块以及功能描述

语言处理任务NLTK 模块功能
访问语料库corpus语料库与词典的标准化接口
字符串处理tokenize, stem分词,分句,提取主干
搭配的发现collocationst-检验,卡方,点互信息PMI
词性标注tagn-gram, backoff, Brill, HMM, TnT
机器学习classify, cluster, tbl决策树,最大熵,贝叶斯,EM,k-means
分块chunk正则表达式,n-gram,命名实体
解析parse, ccg图表,基于特征,一致性,概率,依赖
语义解释sem, inferenceλ演算,一阶逻辑,模型检验
指标评测metrics精度,召回率,协议系数
概率和估计probability频率分布,平滑概率分布
应用app, chat图形化的语料库检索工具,分析器,WordNet 查看器,聊天机器人
语言学领域的工作toolbox处理SIL 工具箱格式的数据

NLTK 设计中的四个主要目标:

简单︰提供一个直观的框架和大量构建模块,使用户获取NLP 知识而不必陷入像标注语言数据那样繁琐的事务中
一致︰提供一个具有一致的接口和数据结构的,并且方法名称容易被猜到的统一的框架
可扩展︰提供一种结构,新的软件模块包括同一个任务中的不同的实现和相互冲突的方法都可以方便添加进来
模块化︰提供的组件可以独立使用而无需理解工具包的其他部分

相对于上述目标,我们有意回避了三个非必需但可能有用的特征。首先,虽然工具包提供了广泛的工具,但它不是面面俱全的;它是一个工具包而不是一个系统,它将会随着NLP 领域一起演化。第二,虽然这个工具包的效率足以支持实际的任务,但它运行时的性能还没有高度优化;这种优化往往涉及更复杂的算法或使用C 或C++等较低一级的编程语言来实现。这将影响工具包的可读性且更难以安装。第三,我们试图避开巧妙的编程技巧,因为我们相信清楚直白的实现比巧妙却可读性差的方法好。

教师请看

自然语言处理一般是在高年级本科生或研究生层次开设的为期一个学期的课程。很多教师都发现,在如此短的时间里涵盖理论和实践两个方面是十分困难的。有些课程注重理论而排挤实践练习,剥夺了学生编写程序自动处理语言带来的挑战和兴奋感。另一些课程仅仅教授语言学编程而不包含任何重要的NLP 内容。最初开发NLTK 就是为了解决这个问题,使在一个学期里同时教授大量理论和实践成为可能,无论学生事先有没有编程经验。

算法和数据结构在所有NLP 教学大纲中都十分重要。它们本身可能非常枯燥,而NLTK 提供的交互式图形用户界面能一步一步看到算法过程,使它们变得鲜活。大多数NLTK 组件都有一个无需用户输入任何数据就能执行有趣的任务的示范性例子。学习本书的一个有效的方法就是交互式重现书中的例子,把它们输入到Python 会话控制台,观察它们做了些什么,修改它们去探索试验或理论问题。

本书包含了数百个练习,可作为学生作业的基础。最简单的练习涉及用指定的方式修改已有的程序片段来回答一个具体的问题。另一个极端,NLTK 为研究生水平的研究项目提供了一个灵活的框架,包括所有的基本数据结构和算法的标准实现,几十个广泛使用的数据集(语料库)的接口,以及一个灵活可扩展的体系结构。NLTK 网站上还有其他资源支持教学中使用NLTK。

我们相信本书是唯一为学生提供在学习编程的环境中学习NLP 的综合性框架。各个章节和练习通过NLTK 紧密耦合,并将各章材料分割开,为学生(即使是那些以前没有编程经验的学生)提供一个实用的NLP 的入门指南。学完这些材料后,学生将准备好尝试一本更加深层次的教科书,例如《语音和语言处理》,作者是Jurafsky 和Martin (Prentice Hall 出版社,2008 年)。

本书介绍编程概念的顺序与众不同,以一个重要的数据类型字符串列表开始,然后介绍重要的控制结构如推导和条件式等。这些概念允许我们在一开始就做一些有用的语言处理。有了这样做的冲动,我们回过头来系统的介绍一些基础概念,如字符串,循环,文件等。这样的方法同更传统的方法达到了同样的效果而不必要求读者自己已经对编程感兴趣。

IX.1 列出了两个课程计划表。第一个适用于文科,第二个适用于理工科。其他的课程计划应该涵盖前5 章,然后把剩余的时间投入单独的领域,例如:文本分类(第6、7 章)、文法(第8、9 章)、语义(第10 章)或者语言数据管理(第11 章)。

表 IX.1

课程计划建议;每一章近似的课时数

章节文科理工科
第1章 语言处理与Python2-42
第2章 获得文本语料和词汇资源2-42
第3章 处理原始文本2-42
第4章 编写结构化程序2-41-2
第5章 分类和标注单词2-42-4
第6章 学习本文分类0-22-4
第7章 从文本提取信息22-4
第8章 分析句子结构2-42-4
第9章 构建基于特征的文法2-41-4
第10章 分析句子的含义1-21-4
第11章 语言学数据管理1-21-4
总计18-3618-36

本书使用的约定

本书使用以下印刷约定:

粗体 -- 表示新的术语。

斜体 -- 用在段落中表示语言学例子、文本的名称和URL,文件名和后缀名也用斜体。

等宽字体 -- 用来表示程序清单,用在段落中表示变量、函数名、语句或关键字等程序元素;也用来表示程序名。

等宽粗体 -- 表示应该由用户输入的命令或其他文本。

等宽斜体 -- 表示应由用户提供的值或上下文决定的值来代替文本中的值;也在程序代码例子中表示元变量。

此图标表示提示、建议或一般性注意事项。

警告!

此图标表示警告或重要提醒。

使用例子代码

本书是为了帮你完成你的工作的。一般情况下,你都可以在你的程序或文档中使用本书中的代码。不需要得到我们获得允许,除非你要大量的复制代码。例如,编写的程序用到书中几段代码不需要许可。销售和分发O'Reilly 书籍中包含的例子的CD-ROM 需要获得许可。援引本书和书中的例子来回答问题不需要许可。大量的将本书中的例子纳入你的产品文档将需要获得许可。

我们希望但不是一定要求被参考文献引用。一个引用通常包括标题,作者,出版者和ISBN。例如:Python 自然语言处理,Steven Bird,Ewan Klein 和Edward Loper。O'Reilly Media, 978-0-596-51649-9. 如果你觉得你使用本书的例子代码超出了上面列举的一般用途或许可,随时通过permissions@oreilly.com 联系我们。

致谢

作者感激为本书早期手稿提供反馈意见的人,他们是:Doug Arnold, Michaela Atterer, Greg Aumann, Kenneth Beesley, Steven Bethard, Ondrej Bojar, Chris Cieri, Robin Cooper, Grev Corbett, James Curran, Dan Garrette, Jean Mark Gawron, Doug Hellmann, Nitin Indurkhya, Mark Liberman, Peter Ljunglöf, Stefan Müller, Robin Munn, Joel Nothman, Adam Przepiorkowski, Brandon Rhodes, Stuart Robinson, Jussi Salmela, Kyle Schlansker, Rob Speer 和Richard Sproat。感谢许许多多的学生和同事,他们关于课堂材料的意见演化成本书的这些章节,其中包括巴西,印度和美国的NLP 与语言学暑期学校的参加者。没有nltk-dev 开发社区的成员们的努力这本书也不会存在,他们为建设和壮大NLTK 无私奉献他们的时间和专业知识,他们的名字都记录在NLTK 网站上。

非常感谢美国国家科学基金会、语言数据联盟、Edward Clarence Dyason 奖学金、宾州大学、爱丁堡大学和墨尔本大学对我们在本书相关的工作上的支持。

感谢Julie Steele、Abby Fox、Loranah Dimant 以及其他O'Reilly 团队成员,他们组织大量NLP 和Python 社区成员全面审阅我们的手稿,很高兴的为满足我们的需要定制O'Reilly 的生成工具。感谢他们一丝不苟的审稿工作。

在准备Python 3 修订版的过程中,感谢Michael Korobov 领导将NLTK 移植到Python 3,以及Antoine Trux 对第一版细致的反馈意见。

最后,我们对我们的合作伙伴欠了巨额的感情债,他们是Mimo和Jee。我们希望我们的孩子 —— Andrew, Alison、Kirsten、Leonie 和Maaike —— 能从这些页面中感受到我们对语言和计算的热情。

关于作者

Steven Bird 是在墨尔本大学计算机科学与软件工程系副教授和美国宾夕法尼亚大学的语言数据联盟的高级研究助理。他于1990 年在爱丁堡大学完成计算音韵学博士学位,由Ewan Klein 指导。后来到喀麦隆开展夏季语言学研究所主持下的Grassfields 班图语语言实地调查。最近,他作为语言数据联盟副主任花了几年时间领导研发队伍,创建已标注文本的大型数据库的模型和工具。在墨尔本大学,他建立了一个语言技术研究组,并在各级本科计算机科学课程任教。2009 年,史蒂芬成为计算语言学学会主席。

Ewan Klein是英国爱丁堡大学信息学院语言技术教授。于1978 年在剑桥大学完成形式语义学博士学位。在苏塞克斯和纽卡斯尔大学工作多年后,参加了在爱丁堡的教学岗位。他于1993 年参与了爱丁堡语言科技集团的建立,并一直与之密切联系。从2000 到2002,他离开大学作为圣克拉拉的埃迪法公司的总部在爱丁堡的自然语言的研究小组的研发经理,负责处理口语对话。Ewan 是计算语言学协会欧洲分会(European Chapter of the Association for Computational Linguistics)前任主席,并且是人类语言技术(ELSNET)欧洲卓越网络的创始成员和协调员。

Edward Loper 最近完成了宾夕法尼亚大学自然语言处理的机器学习博士学位。Edward 是Steven 在2000 年秋季计算语言学研究生课程的学生,也是教师助手和NLTK 开发的成员。除了NLTK,他帮助开发了用于文档化和测试Python 软件的两个包:epydocdoctest

版税

出售这本书的版税将被用来支持自然语言工具包的发展。

../images/authors.png

图XIV.1:Edward Loper, Ewan Klein 和Steven Bird, 斯坦福大学, 2007 年 7月

关于本文档...

针对NLTK 3.0 作出更新。本章来自于Natural Language Processing with PythonSteven Bird, Ewan KleinEdward Loper,Copyright © 2014 作者所有。本章依据Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License [http://creativecommons.org/licenses/by-nc-nd/3.0/us/] 条款,与自然语言工具包 [http://nltk.org/] 3.0 版一起发行。

本文档构建于2015 年 7 月 1 日 星期三 12:30:05 AEST