2 P Y T H O N P Y T H O N P Y T H O N P Y T H O N 自然 语言 处理中 文 翻译 作者: S t e ve n B i r d, E w a n K l e i n & E dw a r d L ope r 英文版出版社: O ' R E I L L Y 翻译:陈涛( w e i bo. c om / c he nt a o1999 ) 译者 的话 译者 的话 译者 的话 译者 的话 作为一个自然语言处理的初学者,看书看到 “ 训练模型 ” ,这模型那模型的,一直不知 道模型究竟是什么东西 。 看了这本书 , 从预处理数据到提取特征集 , 训练模型 , 测试修改等 , 一步一步实际操作了之后 , 才对模型一词有了直观的认识 ( 算法的中间结果 , 存储在计算机 中的一个个 pkl 文件 ,测试的时候直接 用,前面计算过的就省了 ) 。以后听人谈 “ 模型 ” 的 时候也有了底气。当然,模型还有很多其他含义。还有动词的 “ 配价 ” 、各种搭配、客观逻 辑对根据文法生成的句子的约束如何实现?不上机动手做做,很难真正领悟。 自然语言处理理论书籍很多 , 讲实际操作的不多 , 能讲的这么系统的更少 。 从这个角度 讲 , 本书是目前世界上最好的自然语言处理实践教程 。 初学者若在看过理论之后能精读本书 , 必定会有获益。这也是翻译本书的目的之一。 本书是译者课余英文翻译练习,抛砖引玉。书中存在很多问题,尤其是第 10 章命题逻 辑和一阶逻辑推理在自然语言处理中的应用 。 希望大家多多指教 。 可以在微博上找到我 ( w e i bo. c om / c he nt a o1999 ) 。虽然读中文翻译速度更快,但直接读原文更能了解作者的本意。 原书作者在书的最后列出了迫切需要帮助改进的条目 , 对翻译本书建议使用目标语言的 例子 , 目前本书还只能照搬英文的例子 , 希望有志愿者能加入本书的中文化进程中 , 为中文 自然语言处理做出贡献。 将本书作学习和研究之用,欢迎传播、复制、修改。山寨产品请留下译者姓名和微博 。 用于商业目的,请与原书版权所有者联系,译者不承担由此产生的责任。 译者 2012 年 4 月 7 日 3 P Y T H O N 自然 语言处 理 从输 入法联想 提示 ( p r e di c t i ve t e xt ) 、 e m a i l 过滤到自 动 文本 摘要 、 机器 翻译 , 大 量 的语 言相 关 的 技 术都 离不 开自然语言处理的支持 , 而这本书提供了自 然语言处理非常方便的入门 指南 。通过它 , 你 将学 到如 何 写能 处理 大 量非 结构 化 文本 的 P yt ho n 程序 。 你将 获得 有丰 富 标注 的 涵 盖语言学各种数据结构的数据集 , 而且你将 学到 分析书面文档内容和结构的主要算法 。 通过大量的例子和联系 , 《 P Y T H O N 自 然语言处理 》将会帮助你: � � � � 从非结构化文本 中提取信息 , 无论是猜 测主题还是识别 “ 命名实体 ” 。 � � � � 分析文本的语言 学结构 , 包括文法和语 义分析 � � � � 访问 流行的语言学数 据集,包括 Wor d Wor d Wor d Wor d N e t N e t N e t N e t 和 t r e e b an k s t r e e b an k s t r e e b an k s t r e e b an k s � � � � 整 合从 语 言 学到 人 工 智能 的 多 个领 域 的技术 通过 使用 P yt ho n 程序 设计 语言 和自然 语言工具包( N T L K )的开源函数库, 本书 将帮助你获得自然语言处理的实际经验 。 如 果你 对开发 W e b 应用 、分析 多种语 言的新 闻来源或者收集濒危语言感兴趣 , 或者仅仅 对 以程 序员 的 视角 看人 类 语言 如何 运 作好 奇, 你将发 现《 P Y T H O N 自然 语言处 理 》 不仅迷人而且极其有用。 “ 少有的一本书 , 用如此清晰的方法如 此 优 美 整 洁 的 代 码 处 理 如 此 复 杂 的 问 题 ...... 这 是一 本从 中 可以 学习 自 然语 言处 理的书 。 ” —— K e n G e t z , M C W T e c hnol ogi e s 高级顾问 S t e ve n S t e ve n S t e ve n S t e ve n B i r d B i r d B i r d B i r d 是墨尔本 大学计算机科学 和软件工程系副教授 , 宾夕法尼亚大学语言 学数据联盟高级研究助理。 E w an E w an E w an E w an K l e i n K l e i n K l e i n K l e i n 是爱丁堡 大学信息学院语 言技术教授。 E d w ar d E d w ar d E d w ar d E d w ar d L op e L op e L op e L op e r r r r 是宾夕法尼亚大学基于 机 器学 习的 自 然语 言处 理 方向 的刚 毕 业的 博士 ,现在 是波士 顿的 B B N T e c hno l og i e s 的研究员。 4 P Y T H O N 自然 语言处 理 S t e v e n B i r d , E w a n K l e i n & E d w a r d L o p e r 北京 • 剑桥 • 法纳姆 • 科隆 • 塞瓦斯托波尔 • 台北 • 东京 5 P y t h o n P y t h o n P y t h o n P y t h o n 自然 语言处理 by Steven Bird, Ewan Klein, and Edward Loper C opyr i ght © 2009 S t e ve n B i r d, E w a n K l e i n, a nd E dw a r d L ope r A l l r i ght s r e s e r ve d. P r i nt e d i n t he U ni t e d S t a t e s of A m e r i c a O ’ R e i l l y M e di a , I nc 出版 , 1005 G r a ve ns t e i n H i ghw a y N or t h, S e ba s t opol , C A 95472. 可以购买 O ’ R e i l l y 出版的书用于教育 、 商业或者销售推广使用 。 大多数图书都有网络 版( ht t p: / / m y. s a f a r i boo ks onl i ne c om ) 。更多的信息请联系我们的企业 / 机构销售部门: ( 800) 998- 9938 or c or por a t e @ or e i l l y. c om 。 编辑: J ul i e S t e e l e 制作编辑: L or a na h D i m a nt 拷贝编辑: G e ne vi e ve d ’ E nt r e m ont 校对: L or a na h D i m a nt 索引编者: E l l e n T r out m a n Z a i g 封面设计: K a r e n M ont gom e r y 内页设计: D a vi d F ut a t o 插画: R obe r t R om a no 版本说明: 2009 年六月:第一版 N ut s he l l H a ndbook, t he N ut s he l l H a ndbook 标志 , 以及 O ’ R e i l l y 标志 是 O ’ R e i l l y M e di a , I nc 的注册商标 。 《 P Y T H O N 自然语言处理 》 , 露脊鲸图案以及相关的商品外观是 O ’ R e i l l y M e di a , I nc 的商标。 制造商 和经销商为 了区分他们 的产品而声 明一些名称 为商标。这 些名称也出 现在本书 中, O ’ R e i l l y M e di a , I nc 知道这是商标,使用盖帽或者小的盖帽来印刷。 在本书编写过程中已经采取一切可能的预防措施 , 所以出版商和作者对书中的错误和遗 漏以及使用此书包含的信息所造成的损害不承担责任。 I S B N : 978- 0- 596- 51649- 9 [ M ] 1244726609 6 目录 P Y T H O N 自然语言处理中文翻译 2 译者的话 2 P Y T H O N 自然语言处理 3 目录 6 前言 15 读者 15 强调 16 你将学到什么? 16 篇章结构 16 为什么使用 P yt hon ? 17 软件安装需求 18 自然语言工具包( N L T K ) 18 教师请看 19 本书使用的约定 20 使用例 子 代码 20 S a f a r i ® 联机丛书 21 如何联系我们 21 致谢 22 版税 22 第 1 章 语言处理与 P yt hon 23 1. 1 语言计算:文本和单词 23 P yt hon 入门 23 N L T K 入门 24 搜索文本 26 计数词汇 28 1. 2 近观 P yt hon :将文本 当做 词链表 30 链表 30 索引列表 32 变量 34 字符串 35 1. 3 计算语言:简单的统计 36 频率分布 36 细粒度的选择词 38 词语搭配和双连词( bi gr a m s ) 39 计数其他东西 39 1. 4 回到 P yt hon: 决策 与 控制 41 条件 41 对每个元素进行操作 42 嵌套代码块 43 7 条件循环 44 1. 5 自动理解自然语言 45 词意 消歧 46 指代 消解 46 自动生成语言 46 机器翻译 47 人机 对话系统 48 文本的含义 49 N L P 的局限性 49 1. 6 小 结 50 1. 7 深入阅读 50 1. 8 练习 51 第 2 章 获得 文本语料和词汇资源 54 2. 1 获取 文本语料库 54 古腾堡语料库 54 网络和聊天文本 56 布朗语料库 57 路透社语料库 59 就职演说语料库 59 标注文本语料库 60 在其他语言的语料库 62 文本语料库的结构 64 载入你自己的语料库 65 2. 2 条件频率分布 66 条件和事件 66 按文体计数词汇 66 绘制分布图和分布表 67 使用双连词生成随机文本 68 2. 3 更多关于 P yt hon :代码重用 70 使用文本编辑器创建程序 70 函数 70 模块 71 2. 4 词典 资源 72 词汇列表语料库 73 发音的词典 75 比较词表 78 2. 5 W or dN e t 79 意义与同义词 79 W or dN e t 的层次结构 81 更多的词汇关系 82 语义相似度 83 2. 6 小结 84 2. 7 深入阅读 85 2. 8 练习 85 8 第 3 章 加工原料文本 88 3. 1 从网络和硬盘访问文本 88 电子书 88 处理的 H T M L 90 处理搜索引擎的结果 91 读取本地文件 92 从 P D F 、 M S W or d 及其他二进制格式中提取文本 93 捕获用户输入 93 N L P 的流程 93 3. 2 字符串:最底层的文本处理 94 字符串的基本操作 95 输出字符串 96 访问单个字符 97 访问子字符串 98 更多的字符串操作 99 链表与字符串的差异 99 3. 3 使用 U ni c ode 进行文字处理 100 什么是 U ni c ode ? 100 从文件中提取已编码文本 101 在 P yt hon 中使用本地编码 103 3. 4 使用正则表达式检测词组搭配 104 使用基本的元字符 104 范围与闭包 105 3. 5 正则表达式的有益应用 107 提取字符块 107 在字符块上做更多事情 108 查找词干 109 搜索已分词文本 110 3. 6 规范化文本 11 1 词干提取器 112 词形归并 113 3. 7 用正则表达式为文本分词 113 分词的简单方法 114 N L T K 的正则表达式分词器 115 分词的进一步问题 116 3. 8 分割 116 断句 116 分词 117 3. 9 格式化:从链表到字符串 120 从链表到字符串 120 字符串与格式 120 排列 122 将结果写入文件 123 文本换行 124 9 3. 10 小结 124 3. 1 1 深入阅读 125 3. 12 练习 126 第 4 章 编写结构化程序 131 4. 1 回到基础 131 赋值 131 等式 133 条件语句 133 4. 2 序列 134 序列类型上的操作 135 合并不同类型的序列 136 产生器表达式 138 4. 3 风格的问题 138 P yt hon 代码风格 138 过程风格与声明风格 139 计数器的一些合理用途 141 4. 4 函数:结构化编程的基础 142 函数的输入和输出 142 参数传递 143 变量的作用域 144 参数类型检查 145 功能分解 145 文档说明函数 147 4. 5 更多关于函数 148 作为参数的函数 148 累计函数 149 高阶函数 150 参数的命名 150 4. 6 程序开发 152 P yt hon 模块的结构 152 多模块程序 153 误差源头 154 调试技术 155 防御性编程 156 4. 7 算法设计 157 递归 157 权衡空间与时间 159 动态规划 161 4. 8 P yt hon 库的样例 163 M a t pl ot l i b 绘图工具 163 N e t w or kX 165 C S V 166 N um P y 166 其他 P yt hon 库 167 10 4. 9 小结 167 4. 10 深入阅读 168 4. 1 1 练习 168 第 5 章 分类和标注词汇 172 5. 1 使用词性标注器 172 5. 2 标注语料库 173 表示已标注的标识符 173 读取已标注的语料库 174 简化的词性标记集 175 名词 176 动词 177 形容词和副词 178 未简化的标记 178 探索已标注的语料库 179 5. 3 使用 P yt hon 字典映射词及其属性 181 索引链表 V S 字典 181 P yt hon 字典 182 定义字典 184 默认字典 184 递增地更新字典 185 复杂的键和值 187 颠倒字典 187 5. 4 自动标注 188 默认标注器 189 正则表达式标注器 189 查询标注器 190 评估 192 5. 5 N - gr a m 标注 192 一元标注( U ni gr a m T a ggi ng ) 192 分离训练和测试数据 193 一般的 N - gr a m 的标注 193 组合标注器 194 标注生词 195 存储标注器 195 性能限制 196 跨句子边界标注 197 5. 6 基于转换的标注 197 5. 7 如何确定一个词的分类 199 形态学线索 199 句法线索 199 语义线索 200 新词 200 词性标记集中的形态学 200 5. 8 小结 201 11 5. 9 深入阅读 201 5. 10 练习 202 第六章 学习分类文本 206 6. 1 有监督分类 206 性别鉴定 207 选择正确的特征 208 文档分类 211 探索上下文语境 213 序列分类 214 其他序列分类方法 216 6. 2 有监督分类的更多例子 216 句子分割 216 识别对话行为类型 217 识别文字蕴含 218 扩展到大型数据集 219 6. 3 评估 219 测试集 220 准确度 220 精确度和召回率 221 混淆矩阵 222 交叉验证 222 6. 4 决策树 223 熵和信息增益 224 6. 5 朴素贝叶斯分类器 225 潜在概率模型 227 零计数和平滑 227 非二元特征 228 独立的朴素 228 双重计数的原因 228 6. 6 最大熵分类器 229 最大熵模型 229 熵的最大化 230 生成式分类器对比条件式分类器 231 6. 7 为语言模式建模 231 模型告诉我们什么? 232 6. 8 小结 232 6. 9 进一步阅读 232 6. 10 练习 233 第七章 从文本提取信息 235 7. 1 信息提取 235 信息提取结构 236 7. 2 分块 237 名词短语分块 237 标记模式 238 12 用正则表达式分块 239 探索文本语料库 239 加缝隙 240 块的表示:标记与树 241 7. 3 开发和评估分块器 242 读取 I O B 格式与 C oN L L 2000 分块语料库 242 简单评估和基准 243 训练基于分类器的分块器 245 7. 4 语言结构中的递归 249 用级联分块器构建嵌套结构 249 树 250 树遍历 251 7. 5 命名实体识别 252 7. 6 关系抽取 254 7. 7 小结 255 7. 8 进一步阅读 256 7. 9 练习 256 第 8 章 分析句子结构 259 8. 1 一些语法困境 259 语言数据和无限可能性 259 普遍存在的歧义 260 8. 2 文法有什么用? 262 超越 n- gr a m s 262 8. 3 上下文无关文法 264 一种简单的文法 264 写你自己的文法 266 句法结构中的递归 267 8. 4 上下文无关文法分析 268 递归下降分析 268 移进 - 归约分析 270 左角落分析器 271 符合语句规则的子串表 271 8. 5 依存关系和依存文法 274 配价与词汇 276 扩大规模 277 8. 6 文法开发 278 树库和文法 278 有害的歧义 279 加权文法 281 8. 7 小结 283 8. 8 进一步阅读 283 8. 9 练习 284 第 9 章 建立基于特征的文法 287 9. 1 文法特征 287 13 句法协议 288 使用属性和约束 290 术语 293 9. 2 处理特征结构 295 包含 和统一 297 9. 3 扩展基于特征的文法 300 子类别 300 核心词回顾 302 助动词与 倒装 303 无限制依赖成分 304 德语中的格和性别 307 9. 4 小结 310 9. 5 进一步阅读 310 9. 6 练习 311 第 10 章 分析句子的意思 314 10. 1 自然语言理解 314 查询数据库 314 自然语言、语义和逻辑 317 10. 2 命题逻辑 319 10. 3 一阶逻辑 321 句法 322 一阶定理证明 324 一阶逻辑语言总结 325 真值模型 325 独立变量和赋值 327 量化 328 量词范围歧义 329 模型的建立 330 10. 4 英语句子的语义 332 基于特征的文法中的合成语义学 332 λ 演算 333 量化的 N P 335 及物动词 336 再述量词歧义 338 10. 5 段落语义层 341 段落表示理论 341 段落处理 343 10. 6 小结 345 10. 7 进一步阅读 345 10. 8 练习 346 第 11 章 语言数据管理 349 11. 1 语料库结构:一个案例研究 349 T I M I T 的结构 349 主要设计特点 351 14 基本数据类型 352 11. 2 语料库生命周期 353 语料库创建的三种方案 353 质量控制 353 维护与演变 354 11. 3 数据采集 355 从网上获取数据 355 从字处理器文件获取数据 356 从电子表格和数据库中获取数据 357 转换数据格式 358 决定要包含的标注层 359 标准和工具 359 处理濒危语言时特别注意事项 360 11. 4 使用 X M L 362 语言结构中使用 X M L 362 X M L 的作用 363 E l e m e nt T r e e 接口 364 使用 E l e m e nt T r e e 访问 T ool box 数据 366 格式化条目 368 11. 5 使用 T ool box 数据 368 为每个条目添加一个字段 368 验证 T ool box 词汇 369 11. 6 使用 O L A C 元数据描述语言资源 372 元数据是什么? 372 O L A C :开放语言档案社区 372 11. 7 小结 373 11. 8 进一步阅读 374 11. 9 练习 374 后记:语言的挑战 376 语言处理与符号处理 376 当代哲学划分 377 N L T K 的路线图 378 E nvoi 379 参考文献 380 N L T K 索引 380 一般索引 380 关于作者 381 书的末页 382 前言 这是一本关于自然语言处理的书。所谓 “ 自然语言 ” ,是指人们日常交流使用的语言 , 如英语 , 印地语 , 葡萄牙语等 。 相对于编程语言和数学符号这样的人工语言 , 自然语言随着 一代人传给另一代人而不断演化,因而很难用明确的规则来刻画。从广义上讲 , “ 自然语言 处理 ” ( N a t ur a l L a ngua ge P r oc e s s i ng 简称 N L P ) 包含所有用计算机对自然语言进行的操作 , 从最简单的通过计数词出现的频率来比较不同的写作风格 , 到最复杂的完全 “ 理解 ” 人所说 的话,至少要能达到对人的话语作出有效反应的程度。 基于 N L P 的技术应用日益广泛。例如:手机和手持电脑支持输入法联想提示和手写识 别 ; 网络搜索引擎能搜到非结构化文本中的信息;机器翻译能把中文文本翻译成西班牙文 。 通过提供更自然的人机界面和更复杂的存储信息获取手段 , 语言处理正在这个多语种的信息 社会中扮演更核心的角色。 这本书提供自然语言处理领域非常方便的入门 指南 。 它可以用来自学 , 也可以作为自然 语言处理或计算语言学课程的教科书 , 或是人工智能 、 文本挖掘 、 语料库语言学课程的补充 读物。本书的实践性很强,包括几百个实际可用的例子和分级练习。 本书基于 P yt hon 编程语言 及 其上的一个名为自然语言工具包 ( N a t ur a l L a ngua ge T ool k i t , 简称 N L T K ) 的开源库 。 N L T K 包含 大量的软件 、 数据和文档 , 所有这些都可以从 ht t p: / / w w w n l t k. or g/ 免费下载 。 N L T K 的发行版本支持 W i ndow s 、 M a c i nt os h 和 U ni x 平台 。 我们强 烈建议你下载 P yt hon 和 N L T k , 与 我们一起尝试书中的例子和练习。 读者 读者 读者 读者 N L P 是科学、经济、 社会和文化的一个重要因素。 N L P 正在迅速成长, 它的很多理论 和方法在大量新的语言技术中得到应用 。 所以对很多行业的人来说掌握 N L P 知识十分重要 。 在应用领域包括从事人机交互 、 商业信息分析 、 w e b 软件开发的人 ; 在学术界包括从人文计 算学、 语料库语言 学到计算机 科学和人工 智能领域的 人 。 (学术 界的很多人 把 N L P 叫 称为 “ 计算语言学 ” 。 ) 本书旨在帮助所有想要学习如何编写程序分析书面语言的人 , 不管他们以前的编程经验 如何 : 初学编程? 本书的最初几章适合没有编程经验的读者 , 只要你不怕应对新概念和学习新的计算机技 能 。 遍布书中的例子和数以百计的分级练习 , 你都可以复制下来亲自 尝试 一下 。 如果你需要 一个更一般性的关于 P yt hon 的介绍,在 ht t p: / / doc s pyt hon. or g/ 有 P yt hon 资源列表。 初学 P y t hon ? 有经验的程序员可 以很快掌握书中用到的 P yt hon 代码,而专注于自 然语言处理。所有 涉及到的 P yt hon 的 特征都经过精心解释和举例说明 , 你很快就会体会到 P yt hon 用在这个应 用领域是多么合适。 已经精通 P y t hon ? 你可以略读 P yt hon 的例子而钻研第一 章一开始就有的有趣的语言分析材 料。你能很快 在这个迷人的领域展现你的技能。 16 强调 强调 强调 强调 本书是一本 实用 的介绍 N L P 的书。你将通过例子 来 学习,编写真正的程序,体会到能 够通过实践验证自己想法的价值 。 如果你没有学过编程 , 本书将教你 如何 编程 。 与其他编程 书籍不同的是,我们提供了丰富的来自 N L P 领域的实例和练习。我们撰写本书的方法也是 讲究 原则和条理 的 , 无论是严谨的语言学还是计算分析学 , 我们不回避所涉及到 的 基础理论 。 我们曾经试图在理论与实践之间寻求 折中 , 确定它们之间的联系与边界 。 最终我们认识到只 要能从中受益而感到 快乐 这些 都是 无关紧要 的 , 所以我们竭尽所能插入了很多既有益又有趣 的应用和例子,有些甚至有些异想天开。 请注意本书并不是一本工具书 。 本书讲述的 P yt hon 和 N L P 是精心挑选的 , 并通过教程 的形式展现的 。 关于参考材料 , 请查阅 ht t p: / / pyt hon. or g/ 和 ht t p: / / w w w nl t k. or g/ , 那里有大量 可搜索的资源。 本书也不是高深的计算机科学文章 。 书中的内容属于初级和中级 , 目标读者是那些想要 学习如何使用 P yt hon 和自然语言分析包来分析文本的人。 你将 学到 什么? 你将 学到 什么? 你将 学到 什么? 你将 学到 什么? 通过钻研本书,你将学到: � 十分简单的程序如何就能帮你处理和分析语言数据,以及如何写这些程序 � N L P 与语言学的关键概念是如何用来描述和分析语言的 � N L P 中的数据结构和算法是怎样的 � 语言数据是如何存储为标准格式,以及如何使用数据来评估 N L P 技术的性能 根据读者知识背景和学习 N L P 的动机不同,从本书中获得的技能和知识也将不同,详 情见表 P - 1 : 表 P - 1. 读者的目标和背景不同,阅读本书可获得的技能和知识 目标 艺术人文背景 理工背景 语言分析 操控大型语料库,设计语言模型 , 验 证由经验得出的假设。 使用数据建模 , 数据挖掘和知识发现的 技术来分析自然语言。 语言技术 应用 N L P 技术构 筑健壮的系 统处理 语言学任务。 使 用健壮 的语 言处 理软 件中 的语 言学 算法和数据结构 篇章 结构 篇章 结构 篇章 结构 篇章 结构 本书前几章按照概念的难易程度编排 。 先是实用性很强的语言处理的入门介绍 , 讲述如 何使用很短的 P yt hon 程序分析感兴趣的文本信息 ( 1 - 3 章 ) 。 接着是结构化程序设计章节 ( 第 4 章 ) ,用来巩固散布 在前面几章中的编程要点。之后 , 速度加快,我们 用一系列章节讲述 语言处理 的主要内容: 标注 、分类和 信息提取( 5- 7 章 ) 。接下来 的三章探索分析 句子、识 别句法结构和构建 表示 句意的方法( 8- 10 章 ) 。最后一章讲述如 何有效管理语言数据(第 1 1 章 ) 。本书结尾处的后记简要讨论了 N L P 的过去和未来。 每一章中我们都在两种不同的叙述风格间切换 。 一种风格是以自然语言为主线 。 我们分 析语言 , 探索语言学概 ; 在讨论中使用编程的例子 。 我们经常会使用尚未系统介绍的 P yt ho n 结构 , 这样你可以在钻研这些程序如何运作的细节之前了解 它们 的效能 。 就像学习一门外 语的惯用表达一样 , 你能够买到好吃的糕点而不必先学会复杂的提问句型 。 叙述的另一种风 17 格是以程序设计语言为主线。我们将分析程序、探索算法,而语言学例子将扮演配角。 每章结尾都有一系列分级练习 , 用于巩固学到的知识 。 练习按照如下的标准分级 : ○ 初 级练习:对范例代码作稍微修改等简单的练习; ◑ 中级练习:深入探索材料的一个方面 , 需 要仔细的分析和设计 ; ● 高级练习 : 开放的任务 , 挑战你对材料的理解并迫使你独立思考解 决的方案(新学编程的读者应该跳过这些 ) 。 每一章都有深入阅读环节和放在 ht t p: / / w w w nl t k. or g/ 网上的一个 “ 额外 ” 环节,用来介 绍更深入的材料和一些网络资源。所有实例代码都可从网上下载。 为什 么使 用 为什 么使 用 为什 么使 用 为什 么使 用 P y t h o n P y t h o n P y t h o n P y t h o n ? ? ? ? P yt hon 是一种简单但功能强大的编程语言,非常适合处理语言数据。 P yt hon 可以从 ht t p: / / w w w pyt hon. or g/ 免费下载,能够在各种平台上安装运行。 下面的 4 行 P yt hon 程序就可以操作 f i l e t x t 文件 ,输出 所有后缀是 “ i ng ” 的词。 > > > f or l i ne i n ope n( " f i l e t xt " ) : f or w or d i n l i ne s pl i t ( ) : i f w or d. e nds w i t h( ' i ng' ) : pr i nt w or d 这段程序演示了 P yt hon 的一些主要特征。首先,使用空白符号缩进代码,从而使 i f 后 面的代码都在前面一行 f or 语句的范围之内 ; 这保证了检查单词是否以 “ i ng ” 结尾的测试对 所有单词 都进行。第二, P yt hon 是面向对 象语言。每一个变 量都是包含特定 属性和方法的 对象 。例如:变量 “ l i ne ” 的值不仅仅是一行 字符串,它是一个 s t r i ng 对象,包含用来把 字 符串分割 成词的 s pl i t ( ) 方法(或 叫操作、函数 ) 。我们在 对象名称后面写句 号(点)再写方 法 名称 就可以调用对象的一个方法,即 l i ne s pl i e ( ) 。第三,方法的参数写 在 括号内。例如 : 上面的例子中的 w or d. e nds w i t h( ' i ng' ) , 参数 “ i ng ” 表示我们需要找的是 “ i ng ” 结尾的词而不 是别的结 尾的词。最后也是 最重要的, P yt hon 的可读性 如此之强以至于可 以相当容易的猜 出程序的功能 , 即使你以前从未写过一行代码。 我们选择 P yt hon 是 因为它 的 学习曲线比较平缓 , 文法 和语义都很清晰, 具有良好的处 理字符 串的功能。 作为解释性 语言, P yt hon 便于交 互式编程。 作为面向对 象语言, P yt ho n 允许数据 和方法被方便的封 装和重用。作为 动态语言, P yt hon 允许属性 等到程序运行时才 被添加到 对象,允许变量自 动类型转换,提 高开发效率。 P yt hon 自带强大 的标准库,包括 图形编程、数值处理和网络连接等组件。 P yt hon 在世界各地的工业 、 科研 、 教育领域应用广泛 。 它因为提高了软件的生产效率 、 质量和可维护性而备受称赞 。 ht t p: / / w w w pyt hon. or g/ a bout / s uc c e s s / 中列举了许多成功使用 P yt hon 的故事。 N L T K 定义了一个使用 P yt hon 进行 N L P 编程的基础工具。它提供重新表示自然语言处 理相关数据的基本类 , 词性标注 、 文法分析 、 文本分类等任务的标准接口以及这些任务的标 准实现 , 可以组合起来解决复杂的问题。 N L T K 自带大量 文档。作为本书的 补充, ht t p: / / w w w nl t k. or g/ 网站提供 的 A P I 文档涵盖 工具包中每一个模块 、 类和函数 , 详细说明了各种参数 , 还给出了用法示例 。 该网站还为广 大用户 、 开发人员和导师提供 了 很多 包含 大量的例子和测试用例 的 H O W T O 。 18 软件 安装 需求 软件 安装 需求 软件 安装 需求 软件 安装 需求 为了充分利用好 本书,你应该安装一些免费的软件 包。 ht t p: / / w w w nl t k or g/ 上有这些软 件包当前的下载链接和安装说明。 P y t hon 本书的例子都假定你正在使用 P yt hon 2. 4 或 2. 5 版本。一旦 N L T K 的依赖库支持 P yt ho n3. 0 ,我们将把 N L T K 移植到 P yt hon 3. 0 。 N L T K 本书的代码示例使用 N L T K 2. 0 版本。 N L T K 的后续版本将是兼容的。 N L T K - D at a 包含本书中分析和处理的语言语料库。 N um P y (推荐) 这是一个科学计算库 , 支持多维数组和线性代数 , 在某些计算概率 、 标记 、 聚类和分类 任务中用到。 M at pl ot l i b (推荐) 这是一个用于数据可视化的 2D 绘图库,本书 在 产生线图和条形图的程序例子中用到 。 N e t w or k X (可选) 这是一个用于存储和操作由节点和边组成的网络结构的函数库 。 可视化语义网络还需要 安装 G r a phvi z 库。 P r ov e r 9 (可选) 这是一个使用一阶等式逻辑定理 的 自动证明器,用于支持语言处理中的推理。 自然 语言 工具包 ( 自然 语言 工具包 ( 自然 语言 工具包 ( 自然 语言 工具包 ( N L T K N L T K N L T K N L T K ) ) ) ) N L T K 创建于 2001 年 , 最初是宾州大学计算机与信息科学系计算语言学课程的一部分 。 从那以后 , 在数十名贡献者的帮助下不断发展壮大 。 如今 , 它已被几十所大学的课程所采纳 , 并作为许多研究项目的基础。表 P - 2 列出了 N L T K 的一些最重要的模块。 表 P - 2. 语言处理任务与相应 N L T K 模块以及功能描述 语言处理任务 N L T K N L T K N L T K N L T K 模块 功能描述 获取和处理语料库 nl t k. c or pus 语料库和词典的标准化接口 字符串处理 nl t k. t oke ni z e , nl t k. s t e m 分词,句子分解提取主干 搭配发现 nl t k. c ol l oc a t i ons t - 检验,卡方,点互信息 P M I 词性 标识符 nl t k. t a g n- gr a m , ba c kof f , B r i l l , H M M , T nT 分类 nl t k. c l a s s i f y, nl t k. c l us t e r 决策树 , 最大熵 , 贝叶斯 , E M , k- m e a ns 分块 nl t k. c hunk 正则表达式, n- gr a m ,命名实体 解析 nl t k. pa r s e 图表,基于特征,一致性,概率,依赖 语义解释 nl t k. s e m , nl t k. i nf e r e nc e λ 演算,一阶逻辑,模型检验 指标评测 nl t k. m e t r i c s 精度,召回率,协议系数 概率与估计 nl t k. pr oba bi l i t y 频率分布,平滑概率分布 应用 nl t k. a pp, nl t k. c ha t 图形化的关键词排序,分析器, W or dN e t 查看器,聊天机器人 语言学领域的工作 nl t k. t ool box 处理 S I L 工具箱格式的数据 N L T K 设计中的四个主要目标: 19 简易性 提供一个直观的框架和大量模块,使用户获取 N L P 知识而不必陷入像标注语言数据那 样繁琐的 事务 中。 一致性 提供一个 具有一致的 接口和数据结构并且方法名称容易被猜到的统一的框架。 可扩展性 提供一种结构 , 新的软件模块包括同一个任务中的不同的实现和相互冲突的方法都可以 方便添加进来。 模块化 提供可以独立使用而与工具包的其他部分无关的组件。 对比上述目标 , 我们回避了工具包的潜在实用性 。 首先 , 虽然工具包提供了广泛的工具 , 但它不是面面俱全的。它是一个工具包而不是一个系统,它将会随着 N L P 领域一起演化。 第二,虽然这个工具包的效率足以支持实际的任务,但它运行时的性能还没有高度优化 。 这 种优化往往涉及 更复杂的算法或使用 C 或 C + + 等较低一级的编 程语言来实现。这将影响工 具包的可读性且更难以安装 。 第三 , 我们试图避开巧妙的编程技巧 , 因为我们相信清楚直白 的实现比巧妙却可读性差的方法好。 教师 请看 教师 请看 教师 请看 教师 请看 自然语言处理一般是在本科或研究生层次的高年级开设的为期一个学期的课程 。 很多教 师都发现 , 在如此短的时间里涵盖理论和实践 两 个方面是十分困难的 。 有些课程注重理论而 排挤 实践练习 , 剥夺了学生编写程序自动处理语言 带来的 挑战和兴奋 感 。 另一些课程仅仅教 授语言学编程而不包含任何重要的 N L P 内容。最初开发 N L T K 就是为了解决这个问题,使 在一个学期里同时教授大量理论和实践成为可能,无论 学生 事先 有没有编程经验。 算法和数据结构在所有 N L P 教学大纲中都十分重要。它们本身可能非常枯燥,而 N L T K 提供 的交互式 图形用户 界面能一 步一步 看到算法 过程,使 它们变得 鲜活。 大多说 N L T K 组件都有一个无需用户输入任何数据就能执行有趣的任务的示范性例子 。 学习本书的一个有 效的方法就是交互 式重现书中的例子,把它们输入到 P yt hon 会话控制台,观察 它们做了些 什么,修改它们去探索试验或理论问题。 本书包含了数百个练习 , 可作为学生作业的基础 。 最简单的练习涉及用指定的方式修改 已有的程序片段来回答一个具体的问题 。 另一个极端 , N L T K 为研究生水平的研究项目提供 了一个灵活的框架 , 包括所有的基本数据结构和算法的标准实现 , 几十个广泛使用的数据集 (语料库 ) 的接口 , 以及一个灵活可扩展的体系结构 。 N L T K 网站上还有其他资源支持教学 中使用 N L T K 。 我们相信本书是唯一为学生提供在学习编程的环境中学习 N L P 的综合性框架。各个章 节和练习 通过 N L T K 紧密耦合 ,并将各章材料 分割开,为学生( 即使是那些以前 没有编程 经验的学生)提供一个实用的 N L P 的入门指南。学完这些材料后,学生将准备好尝试一本 更加深层次的教 科书,例如 : 《语音和语言处 理 》 ,作者是 J ur a f s ky 和 M a r t i n ( P r e nt i c e H a l l 出版社, 2008 年 ) 。 本书介绍编程概念的顺序与众不同 。 以一个重要的数据类型 : 字符串列表 ( 链表 ) 开始 , 然后介绍重要的控制结构如推导和条件式等 。 这些概念允许我们在一开始就做一些有用的语 言处理。有了这样做的冲动,我们回过头来系统的介绍一些基础概念,如字符串,循环 , 文 件等。 这样的方法 同更传统的 方法达到了 同样的效果 而不必要求 读者自己已 经对编程感 兴 趣。 20 表 P - 3 列出了两个课程计划表。第一个适用于艺术人文专业,第二个适用于理工科 。 其 他的课程计划应该涵盖前 5 章 , 然后把剩余的时间投入单独的领域 , 例如 : 文本分类 ( 第 6 、 7 章 ) 、文法(第 8 、 9 章 ) 、语义(第 10 章)或者语言数据管理(第 11 章 ) 。 表 P - 3. 课程计划建议;每一章近似的课时数 章节 艺术人文专业 理工科 第 1 章,语言处理与 P yt hon 2- 4 2 第 2 章 , 获得文本语料和词汇资源 2- 4 2 第 3 章,处理原始文本 2- 4 2 第 4 章,编写结构化程序 2- 4 1- 2 第 5 章,分类和标注单词 2- 4 2- 4 第 6 章,学习本文分类 0- 2 2- 4 第 7 章,从文本提取信息 2 2- 4 第 8 章,句子结构分析 2- 4 2- 4 第 9 章,构建基于特征的文法 2- 4 1- 4 第 10 章,分析句子的意义 1- 2 1- 4 第 11 章,语言学数据管理 1- 2 1- 4 总计 18- 36 18- 36 本书 使用 的约定 本书 使用 的约定 本书 使用 的约定 本书 使用 的约定 本书使用以下印刷约定: 黑体 表示新的术语。 斜体 用在段落中表示语言学例子、文本的名称和 U R L ,文件名和后缀名也用斜体。 等宽字体 用来表示程序清单 , 用在段落中表示变量 、 函数名 、 语句或关键字等程序元素 。 也用来 表示程序名。 等宽斜体 表示应由用户提供的值或上下文决定的值来代替文本中的值 , 也在程序代码例子中表示 元变量。 使用 例 使用 例 使用 例 使用 例 子 子 子 子 代码 代码 代码 代码 本书是为了帮你完成你的工作 的 。 一般情况下 , 你都可以在你的程序或文档中使用本书 此图标表示警告或重要提醒。 此图标表示提示、建议或一般性注意事项。