01 / 导读
导读
引用
Bird, S., Klein, E., & Loper, E. (2009). Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit. O'Reilly Media. Free official edition (online version updated for Python 3 and NLTK 3): https://www.nltk.org/book/
章节概要
第0章:前言
前言从宽泛的意义上界定自然语言处理——从统计词频到"理解"话语,并把本书定位为一本基于 Python 和开源自然语言工具包(NLTK)、难度从入门到中级的实用教程。它分别向编程新手、Python 新手和有经验的 Python 用户说明阅读方式,解释各章在以语言为主线和以编程为主线的讲解之间交替进行,介绍分级练习(☼ 容易、◑ 中等、★ 困难),并给出两套课程方案:一套面向人文学科学生,一套面向理工科学生。
第1章:语言处理与 Python
第一章让读者立刻开始用计算机处理文本:加载 NLTK 的示例文本、用索引(concordance)检索、统计词汇,并把文本当作 Python 列表来处理。本章介绍频率分布、搭配与二元组、条件语句和循环,最后以非技术性的方式概述"理解"语言需要哪些能力——词义消歧、代词消解、语言生成、机器翻译、对话系统和文本蕴涵——以及自然语言处理的局限。
第2章:获取文本语料库与词汇资源
本章概览 NLTK 自带的语料库(古登堡语料库、网络与聊天文本、布朗语料库、路透社语料库、总统就职演说语料库、标注语料库和多语种语料库),并说明如何加载自己的语料库。条件频率分布被用来比较不同文体,并基于二元组生成随机文本。在 Python 方面,本章介绍文本编辑器、函数和模块。随后讨论词汇资源——词表、CMU 发音词典、对照词表、Toolbox 词典,以及 WordNet 的同义词集、层级结构、词汇关系和语义相似度。
第3章:处理原始文本
读者在这里学习如何处理来自网络和磁盘的文本:字符串、Unicode、用于查找词语模式的正则表达式、规范化(词干提取和词形还原)、用正则表达式分词、句子和词语切分以及输出格式化。本章完成了从现成语料库到杂乱的真实文本的过渡。
第4章:编写结构化程序
本章把散见于第 1—3 章的 Python 知识系统化:赋值与对象引用、序列、编程风格、函数(参数、作用域、文档字符串)、程序开发与调试、包括递归和动态规划在内的算法设计,以及若干 Python 库的介绍(绘图、NetworkX、CSV、NumPy)。
第5章:词语分类与标注
本章通过标注语料库和通用词性标记集引入词性标注,并以 Python 字典作为把词语映射到属性的数据结构。本章构建并评估自动标注器——默认标注器、正则表达式标注器、查找标注器、一元标注器以及通过回退组合起来的 n 元标注器,讨论数据稀疏问题和性能局限,介绍基于转换的(Brill)标注,并探讨语言学家如何依据形态、句法和语义线索确定词的类别。
第6章:学习文本分类
本章通过姓名性别判定、文档分类、词性标注、句子切分、对话行为类型识别和文本蕴涵识别等例子引入有监督分类,并关注特征选择和序列分类。它讨论评估方法(测试集、准确率、精确率与召回率、混淆矩阵、交叉验证),讲解决策树、朴素贝叶斯和最大熵分类器,最后探讨这类模型能告诉我们关于语言的什么。
第7章:从文本中抽取信息
信息抽取被描述为一条从切分和标注到实体检测再到关系抽取的流水线。本章的核心是组块分析:利用标记模式和正则表达式进行名词短语组块分析、"去块"(chinking)、IOB 表示法与 CoNLL-2000 语料库、基于分类器的组块分析器的训练与评估,以及构建嵌套树结构的级联组块分析器。最后讨论命名实体识别和关系抽取。
第8章:分析句子结构
本章从句子的无限可能性和普遍存在的歧义出发说明句法的必要性,接着介绍上下文无关文法、自行编写文法以及递归。它比较各种句法分析算法(递归下降、移进—归约、左角分析、合式子串表/线图分析),介绍依存语法和配价,并讨论利用树库进行文法开发、"恶性"歧义以及加权(概率)文法。
第9章:构建基于特征的文法
本章引入特征结构,以便在不增加范畴数量的情况下处理一致关系等细微区别。它解释属性—值矩阵、重入、包含与合一,并把基于特征的文法扩展到次范畴化、中心语、助动词倒装、无界依存结构以及德语的格与性。
第10章:分析句子的意义
本章从用英语查询数据库讲起,介绍命题逻辑和一阶逻辑、定理证明、模型中的真、变元赋值、量化与量词辖域歧义以及模型构建。随后说明如何利用基于特征的文法和 λ 演算组合式地构建意义表示(量化名词短语、及物动词),最后讨论话语表征理论和话语处理。
第11章:管理语言数据
最后一个技术性章节把语料库视为经过设计的对象:以 TIMIT 语料库为案例,讨论语料库的生命周期(创建情形、质量控制、维护)、从网络、文字处理文件、电子表格和数据库获取并转换数据、选择标注层和标准、处理濒危语言时的特殊考虑、使用 XML 和 ElementTree、处理 Toolbox 词典,以及用 OLAC 元数据描述资源。
第12章:后记:语言的挑战
后记对这一领域进行反思:语言处理与符号处理的对比,理性主义与经验主义、实在论与唯心论之间的当代分歧,语言学知识与统计方法各自的作用,以及 NLTK 未来发展的路线图。
核心概念
第0章:前言
- NLTK:一个开源 Python 库,提供用于自然语言处理教学和研究的软件、语料库和文档。
- 分级练习:每章末尾分为容易、中等和困难三级的练习。
第1章:语言处理与 Python
- 词例与词型:某个词的一次具体出现与不同的词形本身。
- 频率分布:统计每个项目(如每个词)出现的次数。
- 搭配:异常频繁地共同出现的词语序列。
第2章:获取文本语料库与词汇资源
- 语料库:大型、结构化的文本集合,通常按文体或主题分类。
- 条件频率分布:一组频率分布,每个条件(如文体)对应一个。
- WordNet 同义词集:表示一个词义的同义词集合,并连接成语义层级。
第3章:处理原始文本
- 分词:把文本切分为词语、标点等单位。
- 正则表达式:用于查找和处理字符串的模式语言。
- 词干提取与词形还原:把词形还原为词干或词典形式。
第4章:编写结构化程序
- 对象引用:Python 中的赋值是共享对象而不是复制对象。
- 动态规划:保存子问题结果以避免重复计算,在自然语言处理中应用广泛。
第5章:词语分类与标注
- 词性标注:为词例分配名词、动词等词类。
- 回退:在需要时从专门模型(二元标注器)退回到更一般的模型(一元标注器)。
- 数据稀疏问题:即使训练数据很多,大多数可能的上下文仍未出现过。
第6章:学习文本分类
- 有监督分类:利用带标签的训练数据,学习根据特征预测标签。
- 训练集、开发测试集与测试集:分别用于构建、调整和最终评估模型的数据。
- 精确率与召回率:衡量预测结果中有多少是正确的,以及正确项目中有多少被找到。
第7章:从文本中抽取信息
- 组块分析:切分并标注名词短语等多词例序列。
- IOB 标记:用于表示组块的 Inside/Outside/Begin 标签。
- 命名实体识别:识别对人名、机构、地点等实体的提及。
第8章:分析句子结构
- 上下文无关文法:说明各范畴短语如何分解为组成部分的产生式。
- 句法分析算法:递归下降(自顶向下)、移进—归约(自底向上)和线图方法。
- 依存语法:把结构分析为中心语与依存成分之间的关系。
第9章:构建基于特征的文法
- 特征结构:描述语法属性的属性—值对集合。
- 合一:在相容的情况下,把两个特征结构合并为包含二者信息的一个结构。
第10章:分析句子的意义
- 模型中的真:依据论域和赋值来评估逻辑公式。
- λ 演算与 β 归约:组合式构建意义表示的工具。
- 话语表征理论:表示跨句意义(包括照应)的理论。
第11章:管理语言数据
- 语料库生命周期:收集、标注、质量控制、发布以及之后的扩充。
- 元数据(OLAC):让他人能够发现语言资源的标准化描述。
第12章:后记
- 理性主义与经验主义:关于语言处理中先天知识与数据各自作用的对立观点。
评析
优点
- 在实践中学习。 正如前言所承诺,几乎每个概念都配有使用 NLTK 自带语料库的可运行代码,读者可以立即检验书中的说法;各章包含数百个示例和分级练习。
- 人文学科学生也易于上手。 前几章通过语言实例从零开始教授 Python,第 4 章再对编程知识进行系统整理,前言还为人文学科学生提供了单独的课程方案。
- 以语言学为根基。 与许多以编程为先的自然语言处理书籍不同,本书分别用整章篇幅讨论标记集设计与词类、句法与句法分析、基于特征的文法、形式语义学以及语料库管理(包括濒危语言记录和 Toolbox 数据)。
- 清晰讲解评估。 第 5—7 章反复强调区分训练数据和测试数据,介绍基线、准确率、精确率、召回率和交叉验证,并讨论结果为何可能过于乐观。
局限
- 属于神经网络之前的内容。 内容反映的是大约 2009 年之前的自然语言处理:分类器是决策树、朴素贝叶斯和最大熵模型,完全没有涉及当今实践中占主导地位的词向量、神经网络和大语言模型。
- 在线版部分尚未完善。 本书目录页标明第 5、10、11 章"仍需小幅修订";在线文本已针对 Python 3 和 NLTK 3.0 更新(假定 Python 3.2 或更高版本),部分代码在当前 NLTK 版本中可能仍需调整。
- 绑定于一个工具包。 书中很大部分在讲 NLTK 自己的类和语料库,因此这些技能向当今业界和研究中使用的其他库迁移时不够直接。
- 难度不均。 前言指出第 4 章之后节奏加快;第 9、10 章(特征文法、λ 演算)比开篇各章难得多。
在课程中的定位
在"计算语言学与语料库语言学"书单中,本书介于不涉及编程的入门读物与更偏技术的读物之间。Language and Computers 在不涉及编程的情况下解释语言技术能做什么,Doing Corpus Linguistics 介绍语料库方法;两者都是很好的第一步,之后读本书,学生就能用 Python 亲手完成这类分析。McEnery 和 Hardie 的 Corpus Linguistics: Method, Theory and Practice 一般被认为是对语料库语言学方法和理论的系统论述,可补充本书第 1—3 章和第 11 章;Gries 的 Quantitative Corpus Linguistics with R 则用 R 对类似数据进行统计分析。
Jurafsky 和 Martin 的 Speech and Language Processing 是本书之后自然的下一步:它更深入地讲解算法和模型,其当前草稿还涵盖了本书没有涉及的神经网络方法。学生可以先用 Bird、Klein 和 Loper 的书掌握词性标注、句法分析和分类的实际操作技能,再转向 Jurafsky 和 Martin 学习理论和现代方法。
如何使用本书
本书既面向没有编程背景的读者,也面向有经验的程序员,可用于自然语言处理、计算语言学、语料库语言学或文本挖掘课程。请安装 Python 3 和 NLTK,下载 NLTK 数据,边读边输入示例代码。前言中的建议课时表为人文学科课程在第 1—5 章以及第 8、9 章上各安排 2—4 次课,第 6 章几乎不占课时;理工科课程则较快地讲完第 1—4 章,把更多时间用在第 6—11 章。前言建议的另一种方案是先讲第 1—5 章,然后专攻分类(第 6—7 章)、句法(第 8—9 章)、语义(第 10 章)或数据管理(第 11 章)中的一个方向。
每章至少完成容易(☼)和中等(◑)难度的练习,并利用"延伸阅读"部分把代码与研究文献联系起来。由于该领域已有很大发展,如果课程涉及当前方法,应把第 5—7 章与关于自然语言处理中机器学习的现代论述结合起来学习。
版本与来源
本导读依据 https://www.nltk.org/book/ 上的 Natural Language Processing with Python 在线版,作者已将其更新为适用于 Python 3 和 NLTK 3(第一版于 2009 年由 O'Reilly 出版;网站说明目前没有出版第二版的计划)。本导读参考了前言(读者对象、侧重点、结构、练习、Python 3 说明和课程方案)、完整目录、第 1—11 章及后记的所有小节标题,以及各章开头提出的问题和章末小结。
