logo资料库

perl 语言实战.pdf

第1页 / 共139页
第2页 / 共139页
第3页 / 共139页
第4页 / 共139页
第5页 / 共139页
第6页 / 共139页
第7页 / 共139页
第8页 / 共139页
资料共139页,剩余部分请下载后查看
EasyThingsshouldbeeasy,andhardthingsshould
实战Perl——语言信息处理利器
荀恩东黄志娥饶高琦谢佳莉
第一篇基础篇
1Perl!Perl!Perl!——什么是Perl
1.1Perl是什么?——珍珠、骆驼还是羊驼?
1.2为什么要学Perl?——“让程序跑一会儿”
1.3搭建Perl语言的运行环境
1.4“HelloWorld!”——我的第一个Perl程序
2勿在浮沙建高塔——Perl语言基础
2.1Perl语言基础
2.1.1什么是变量?
2.1.2字符串中的转义字符
2.1.3简单变量的操作符
2.2条件判断
2.3循环结构
2.3.1while循环
2.3.2for循环结构
3弹夹能装很多“蛋”——数组、哈希表、文件与函数
3.1数组——“排排坐,吃果果”
3.1.1数组的赋值
3.1.2两个“错误”操作
3.1.3访问数组成员
3.1.4遍历数组
3.1.5关于数组你肯定还会用到这些操作
3.1.6数组实例
3.2哈希表(杂凑表)——好吃还是大杂烩
3.2.1哈希表的赋值
3.2.2访问哈希表中的成员
3.2.3遍历哈希表
3.2.4其他一些有用的操作
3.2.4.1查找
3.2.4.2删除
3.2.4.3取键和值
3.2.5哈希实例
3.3文件操作
3.3.1打开文件
3.3.2读文件
3.3.3写文件
3.3.4打开一个目录(文件夹)
3.4“重复的代码是灾难!”——函数
3.4.1什么是函数
3.4.2变量的作用范围——“爱恨交融”
3.4.3传递变量的值
4“燃烧吧,我的小Perl!”——用Perl实现几个简单任务
4.1统计文件词频
4.2合并两个词表
4.3求两个词表词的交集
4.4实现查字典
4.5汉语分词
第二篇提高篇
5不用正则,枉学Perl——正则表达式
5.1什么是正则表达式
5.2正则表达式语法
5.2.1表示一个字符的集合符号
5.2.1.1“[]”符号
5.2.1.2“[^]”符号
5.2.1.3“.”符号
5.2.1.4“|”符号
5.2.1.5“\”符号
5.2.2字符范围转义
5.2.2.1“\S”与“\s”符号
5.2.2.2“\D”与“\d”符号
5.2.2.3“\W”与“\w”符号
5.2.3表示字符出现次数的符号
5.2.3.1“?”符号
5.2.3.2“*”符号
5.2.3.3“+”符号
5.2.3.4“{}”符号
5.2.4表示锚点符号
5.2.4.1“/^/”符号
5.2.4.2“/$/”符号
5.2.5几个开关项
5.2.5.1“/g”开关
5.2.5.2“/i”开关
5.2.5.3“/s”开关
5.2.5.4“/x”开关
5.2.6字符串的“替换操作”
5.3用正则表达式解决问题方式
5.3.1判断子串是否存在
5.3.2提取子串
5.3.3进行字符串转化
5.4典型文件格式处理
5.4.1词表
5.4.2HTML与XML格式
5.4.3标注语料库
6鸟枪换大炮——使用引用构造复杂数据结构
6.1数据结构与编程
6.2引用——“连接刀柄和毒镖的弹簧!“
6.2.1引用的概念
6.2.2取得的“引用”
6.2.3通过引用访问数据
6.3用引用构造复杂数据结构
6.3.1值为数组的数组——“套娃的艺术I”
6.3.2值为哈希表的哈希表——“套娃的艺术II”
6.3.3采用引用构造值为数组的哈希——“好吃的小杂烩!”
6.3.4采用引用构造混合数据结构——“超级大杂烩!”
6.4用复杂数据结构封装数据——“包子皮儿里三鲜馅儿”
6.4.1词典
6.4.2标注语料库
7再战词典阵!——几个典型NLP任务的高级实现
7.1任务1:合并两个词典表
7.2任务2:从英汉词典生成汉英词典
7.3任务3:词性语料库统计
7.4任务4:拼音标注语料库统计
第一篇 基础篇..................................................................................................7 1 Perl! Perl! Perl!——什么是 Perl.......................................................... 7 1.1 Perl 是什么?——珍珠、骆驼还是草泥马..................................... 7 1.2 为什么要学 Perl?——“让子弹飞一会儿”................................. 8 1.3 搭建 Perl 语言的运行环境............................................................. 10 1.4 “Hello World!”——我的第一个 Perl 程序...............................15 2 勿在浮沙建高塔——Perl 语言基础.......................................................... 17 2.1 Perl 语言基础................................................................................. 17 2.1.1 什么是变量?........................................................................17 2.1.2 字符串中的转义字符............................................................ 18 2.1.3 简单变量的操作符............................................................... 19 2.2 条件判断.......................................................................................... 24 2.3 循环结构.......................................................................................... 26 2.3.1 while 循环............................................................................26 2.3.2 for 循环结构........................................................................28 3 弹夹能装很多“蛋”——数组、哈希表、文件与函数.............................29 3.1 数组——“排排坐,吃果果”........................................................30 3.1.1 数组的赋值...........................................................................30 3.1.2 两个“错误”操作............................................................... 30 3.1.3 访问数组成员....................................................................... 31 3.1.4 遍历数组...............................................................................31 3.1.5 关于数组你肯定还会用到这些操作.................................... 32 3.1.6 数组实例...............................................................................32 3.2 哈希表(杂凑表)——好吃还是大杂烩........................................ 33 3.2.1 哈希表的赋值....................................................................... 33 3.2.2 访问哈希表中的成员........................................................... 34 3.2.3 遍历哈希表...........................................................................34 3.2.4 其他一些有用的操作........................................................... 35 3.2.4.1 查找...........................................................................35 3.2.4.2 删除...........................................................................35 3.2.4.3 取键和值................................................................... 35 3.2.5 哈希实例...............................................................................36 3.3 文件操作.......................................................................................... 36 3.3.1 打开文件...............................................................................37
3.3.2 读文件.................................................................................. 38 3.3.3 写文件.................................................................................. 39 3.3.4 打开一个目录(文件夹)....................................................39 3.4 “重复的代码是灾难!”——函数..................................................40 3.4.1 什么是函数...........................................................................40 3.4.2 变量的作用范围——“爱恨交融”.................................... 41 3.4.3 传递变量的值....................................................................... 42 4 “燃烧吧,我的小 Perl!”——用 Perl 实现几个简单任务.................... 43 4.1 统计文件词频.................................................................................. 43 4.2 合并两个词表.................................................................................. 44 4.3 求两个词表词的交集....................................................................... 45 4.4 实现查字典...................................................................................... 45 4.5 汉语分词.......................................................................................... 46 第二篇 提高篇................................................................................................ 48 5 不用正则,枉学 Perl——正则表达式.......................................................48 5.1 什么是正则表达式...........................................................................48 5.2 正则表达式语法...............................................................................50 5.2.1 表示一个字符的集合符号....................................................50 5.2.1.1 “[ ]”符号............................................................. 50 5.2.1.2 “[^ ]”符号........................................................... 51 5.2.1.3 “.”符号................................................................. 52 5.2.1.4 “|”符号................................................................. 53 5.2.1.5 “ ”符号................................................................. 53 5.2.2 字符范围转义....................................................................... 53 5.2.2.1 “\S”与“\s”符号................................................54 5.2.2.2 “\D”与“\d”符号................................................54 5.2.2.3 “\W”与“\w”符号................................................54 5.2.3 表示字符出现次数的符号....................................................55 5.2.3.1 “?”符号................................................................. 55 5.2.3.2 “*” 符号............................................................... 55 5.2.3.3 “+”符号................................................................. 56 5.2.3.4 “{}” 符号............................................................. 56 5.2.4 表示锚点符号....................................................................... 57 5.2.4.1 “/^ /”符号........................................................... 57
5.2.4.2 “/ $/” 符号......................................................... 58 5.2.5 几个开关项...........................................................................59 5.2.5.1 “/g”开关............................................................... 59 5.2.5.2 “/i”开关............................................................... 60 5.2.5.3 “/s”开关............................................................... 60 5.2.5.4 “/x”开关............................................................... 61 5.2.6 字符串的“替换操作”........................................................61 5.3 用正则表达式解决问题方式........................................................... 63 5.3.1 判断子串是否存在............................................................... 64 5.3.2 提取子串...............................................................................64 5.3.3 进行字符串转化................................................................... 66 5.4 典型文件格式处理...........................................................................67 5.4.1 词表...................................................................................... 67 5.4.2 HTML 与 XML 格式.................................................................. 69 5.4.3 标注语料库...........................................................................71 6 鸟枪换大炮——使用引用构造复杂数据结构............................................ 74 6.1 数据结构与编程...............................................................................74 6.2 引用..................................................................................................75 6.2.1 引用的概念——“连接刀柄和毒镖的弹簧!“................. 75 6.2.2 取得的“引用”................................................................... 75 6.2.3 通过引用访问数据............................................................... 77 6.3 用引用构造复杂数据结构............................................................... 79 6.3.1 值为数组的数组——“套娃的艺术 I”..............................80 6.3.2 值为哈希表的哈希表——“套娃的艺术 II”.................... 82 6.3.3 采用引用构造值为数组的哈希——“好吃的小杂烩!”..83 6.3.4 采用引用构造混合数据结构——“超级大杂烩!”......... 84 6.4 用复杂数据结构封装数据——“包子皮儿里三鲜馅儿”............. 86 6.4.1 词典...................................................................................... 86 6.4.2 标注语料库...........................................................................88 7 再战词典阵!—— 几个典型 NLP 任务的高级实现................................... 91 7.1 任务 1:合并两个词典表................................................................ 91 7.2 任务 2:从英汉词典生成汉英词典.................................................94 7.3 任务 3:词性语料库统计................................................................ 97 7.4 任务 4:拼音标注语料库统计........................................................ 99
第三篇 应用篇.............................................................................................. 101 8 手里有“料”,编程不慌——语料库处理................................................101 8.1 多文件语料的处理方法.................................................................. 101 8.1.1 利用@ARGV 接收外部文件名...............................................102 8.1.2 制作批处理的 Perl 代码....................................................103 8.1.2.1 利用 dir 得到待处理的语料文件列表................... 104 8.1.2.2 利用 system 函数,生成批处理代码..................... 105 8.2 Unicode 编程................................................................................. 106 8.2.1 Perl 内部字符串两种形式.................................................107 8.2.2 Perl 处理 Unicode 模块和函数......................................... 108 8.2.3 Perl Unicode 编程常见问题处理..................................... 109 8.3 Unicode 编程实例.........................................................................111 8.3.1 gb2312、utf-8 相互转化...................................................111 8.3.2 中文语料断字处理及字频统计.......................................... 112 8.3.3 实现语料断句处理............................................................. 115 8.3.4 提取复合语言模式的语料..................................................116 8.3.5 对语料库分词处理............................................................. 117 9 夜观天象,心算“词性”——基于隐马尔科夫模型的自动词性标注....119 9.1 基于 HMM 的词性标注..................................................................... 120 9.2 计算模型参数.................................................................................121 9.3 解码算法........................................................................................ 126 9.3.1 Viterbi 算法...................................................................... 126 9.3.2 读入概率数据..................................................................... 128 9.3.3 算法中需要用到的三个函数.............................................. 129 9.3.4 建立 Viterbi 搜索网格......................................................131 9.3.5 Viterbi 网格节点概率计算...............................................132 9.3.6 利用回退指针得到标注结果.............................................. 132 9.3.7 Viterbi 完整代码.............................................................. 133 10 “站在牛人的肩膀上”——Perl 常用扩展模块................................... 139 10.1 Perl 扩展模块..............................................................................139 10.2 Perl 模块安装..............................................................................140 10.3 几个常用模块...............................................................................141 10.3.1 自动下载 web 页面........................................................... 141 10.3.2 web 页面的解析................................................................ 142
10.3.3 信息检索............................................................................144 附录............................................................................................................... 146 第一篇“练一练”答案.................................................................................146 ASCII 码表.....................................................................................................147 隐马尔科夫模型............................................................................................ 150
easy, should bebebebe easy, should Things EasyEasyEasyEasy Things easy, andandandand hardhardhardhard Things should easy, Things should should bebebebe possible. should things possible. things should possible. things should things possible. 实战 PerlPerlPerlPerl——语言信息处理利器 荀恩东 黄志娥 饶高琦 谢佳莉
第一篇第一篇第一篇第一篇 基础篇基础篇基础篇基础篇 如果你还是手无寸铁的一介“菜鸟”,那么第一篇将教给你,在计算机江湖 中的第一件兵器如何使用。而对于有使用其他语言编程经验和基础的读者,可以 选择轻松浏览本篇中第二章和第三章里的表格,体会 Perl 语言和其他编程语言 的异同。不过殊途同归,在第四章中,我们将通过几个简单任务一起操练 Perl 语言的基本语法和功能。本篇的各个章节中还散落着一些“练一练”,这些小规 模的编程题目旨在练习知识点,促进大家思考,请读者认真解答。 好啦,行动起来吧!看!“内存在颤抖,仿佛主板在燃烧,Perl 就要来了! 1” Perl! Perl! Perl! 1111 Perl! Perl!————————什么是什么是什么是什么是 PerlPerlPerlPerl Perl! Perl! Perl! Perl! Perl! Perl! Perl! 这里是 Perl 的开始! 是什么?————————珍珠、骆驼还是羊驼? 是什么? 珍珠、骆驼还是羊驼? 是什么? 珍珠、骆驼还是羊驼? 1.1 Perl 是什么? 珍珠、骆驼还是羊驼? 这个故事发生在并不是很久很久以前…… 那还是 1987 年 10 月 18 日,加拿大邓肯市的第一场雪姗姗来迟,一个叫 Larry Wall 的语言学家上午从教堂礼拜归来后,在等待他从事神职工作长达 35 年的妻 子慢腾腾的准备午饭。于是他懒洋洋得向互联网上上传了这样一个包(你可以理 解为一种类似于压缩包的东西),名字叫脚本语言Pearl 1.0。 故事的主角出场啦!咦……不对吧!?不是 Perl 吗?怎么成 Pearl 了?我们 想凡事总得想个好听的名字,Larry 一开始也是这样想的。一种语言叫“珍珠 (Pearl)”不是很好嘛……至于至于后来为什么在程序的不断传播中少了一个 a,却至今都是江湖中的一个谜…… 好啦,这就是 Perl 诞生的故事。现在你可以开始慢慢把它忘记了,不过斜 体加粗的两个关键词却很重要。首先 Larry Wall 是一个“语言学家”,为了写书 和各种文本处理的需要,才发明了 Perl 语言。所以你现在不难想象为什么我们 1 改编自前南斯拉夫电影《桥》中的经典台词:“空气在颤抖,仿佛天空在燃烧,暴风雨就要来了!”
说 Perl 语言是一种语言信息处理的利器了吧。另外,如果你是文科背景或者非 计算机背景的读者,相信你已经从这个关键词中获得了莫大的鼓励,加油!在后 面你还会发现 Larry 老兄对 Perl 的设计还是充分的体谅广大“非计算机酷爱者” 的需求的。著名的 O’Reilly 出版集团曾“挟持”Larry 本人编写了两本极其不 适合“非计算机酷爱者”的繁复教材,封面便是下图……而自那之后 Perl 在计 算机界有时也被称作“骆驼语言”,在美国商标局则被注册了羊驼标志2。 第二个关键词“脚本语言”。它是相对于“编译语言”而存在的一个概念。 形象的说,就是后者会让计算机把你敲进电脑中的代码统统“背下来”之后,再 按着电脑自己的记忆来进行运算(你不用担心它背错任何一个字),包括大名鼎 鼎的 C、C++两兄弟和独行侠 Pascal 之流。而前者则省去了这个“背诵”的步骤, 计算机看着你敲进去的代码,看一行,运算一行,直到结束。其代表就是我们的 Perl 语言。 现在我们是不是能够对本节的问题进行一个简短回答了?Perl 是什么? 答:一个语言学家发明的一种尤其擅长语言信息处理的脚本语言。 让程序跑一会儿 为什么要学 Perl????——“——“——“——“让程序跑一会儿 为什么要学 让程序跑一会儿”””” 为什么要学 让程序跑一会儿 1.2 为什么要学 话说计算机编程领域里的大侠可绝不在少数,什么“紫青双剑”PHP、HTML, 独行侠 Pascal、潇洒哥 Java……我必须说,对于语言信息处理的任务,或者任 何相类似的任务(DNA 碱基组、大规模文本数据处理等等),使用任何一种编程 语言,都可以完成。道理很简单,就如同一草一木皆可杀人,刀枪剑戟都是兵刃。 但作为“非大侠”,面对对手(任务),是选择徒手双拳(自己敲进去 0101……), 2 在 Pearl 被简化为 Perl 之后,官方对 Perl 四个字母的解释为 Practical Extraction Report Language,即“实用抽象报表语言”。
分享到:
收藏