提交 558e532a 编写于 作者: W wizardforcel

2020-12-29 14:40:20

上级 d69eaae8
......@@ -509,7 +509,7 @@ IV[SEM=<\x.bark(x)>] -> 'barks'
## 4.2 λ演算
3中,我们指出数学集合符号对于制定我们想从文档中选择的词的属性 P 很有用。我们用[(31)](./ch10.html#ex-set-comprehension-math2)说明这个,它是“所有 w 的集合,其中 w 是 V(词汇表)的元素且 w 有属性 P”的表示。
3 中,我们指出数学集合符号对于制定我们想从文档中选择的词的属性 P 很有用。我们用[(31)](./ch10.html#ex-set-comprehension-math2)说明这个,它是“所有 w 的集合,其中 w 是 V(词汇表)的元素且 w 有属性 P”的表示。
```py
>>> read_expr = nltk.sem.Expression.fromstring
......
......@@ -80,7 +80,7 @@ TIMIT 的第四个特点是语料库的层次结构。每个句子 4 个文件
## 2.1 语料库创建的三种方案
语料库的一种类型是设计在创作者的探索过程中逐步展现。这是典型的传统“领域语言学”模式,即来自会话的材料在它被收集的时候就被分析,明天的想法往往基于今天的分析中产生的问题。。在随后几年的研究中产生的语料不断被使用,并可能用作不确定的档案资源。计算机化明显有利于这种类型的工作,以广受欢迎的程序 Shoebox 为例,它作为 Toolbox 重新发布,现在已有超过二十年的历史(见4)。其他的软件工具,甚至是简单的文字处理器和电子表格,通常也可用于采集数据。在下一节,我们将着眼于如何从这些来源提取数据。
语料库的一种类型是设计在创作者的探索过程中逐步展现。这是典型的传统“领域语言学”模式,即来自会话的材料在它被收集的时候就被分析,明天的想法往往基于今天的分析中产生的问题。。在随后几年的研究中产生的语料不断被使用,并可能用作不确定的档案资源。计算机化明显有利于这种类型的工作,以广受欢迎的程序 Shoebox 为例,它作为 Toolbox 重新发布,现在已有超过二十年的历史(见 4)。其他的软件工具,甚至是简单的文字处理器和电子表格,通常也可用于采集数据。在下一节,我们将着眼于如何从这些来源提取数据。
另一种语料库创建方案是典型的实验研究,其中一些精心设计的材料被从一定范围的人类受试者中收集,然后进行分析来评估一个假设或开发一种技术。此类数据库在实验室或公司内被共享和重用已很常见,经常被更广泛的发布。这种类型的语料库是“共同任务”的科研管理方法的基础,这在过去的二十年已成为政府资助的语言技术研究项目。在前面的章节中,我们已经遇到很多这样的语料库;我们将看到如何编写 Python 程序实践这些语料库发布前必要的一些任务。
......@@ -259,7 +259,7 @@ sleep: wake
发布的语料库中所包含的信息的丰富性差别很大。语料库最低限度通常会包含至少一个声音或字形符号的序列。事情的另一面,一个语料库可以包含大量的信息,如句法结构、形态、韵律、每个句子的语义、加上段落关系或对话行为的标注。标注的这些额外的层可能正是有人执行一个特定的数据分析任务所需要的。例如,如果我们可以搜索特定的句法结构,找到一个给定的语言模式就更容易;如果每个词都标注了意义,为语言模式归类就更容易。这里提供一些常用的标注层:
* 分词:文本的书写形式不能明确地识别它的词符。分词和规范化的版本作为常规的正式版本的补充可能是一个非常方便的资源。
* 断句:正如我们在3中看到的,断句比它看上去的似乎更加困难。因此,一些语料库使用明确的标注来断句。
* 断句:正如我们在 3 中看到的,断句比它看上去的似乎更加困难。因此,一些语料库使用明确的标注来断句。
* 分段:段和其他结构元素(标题,章节等)可能会明确注明。
* 词性:文档中的每个单词的词类。
* 句法结构:一个树状结构,显示一个句子的组成结构。
......@@ -272,7 +272,7 @@ sleep: wake
一个用途广泛的语料库需要支持广泛的格式。然而,NLP 研究的前沿需要各种新定义的没有得到广泛支持的标注。一般情况下,并没有广泛使用的适当的创作、发布和使用语言数据的工具。大多数项目都必须制定它们自己的一套工具,供内部使用,这对缺乏必要的资源的其他人没有任何帮助。此外,我们还没有一个可以胜任的普遍接受的标准来表示语料库的结构和内容。没有这样的标准,就不可能有通用的工具——同时,没有可用的工具,适当的标准也不太可能被开发、使用和接受。
针对这种情况的一个反应就是开拓未来开发一种通用的能充分表现捕获多种标注类型(见8的例子)的格式。NLP 的挑战是编写程序处理这种格式的泛化。例如,如果编程任务涉及树数据,文件格式允许任意有向图,那么必须验证输入数据检查树的属性如根、连通性、无环。如果输入文件包含其他层的标注,该程序将需要知道数据加载时如何忽略它们,将树数据保存到文件时不能否定或抹杀这些层。
针对这种情况的一个反应就是开拓未来开发一种通用的能充分表现捕获多种标注类型(见 8 的例子)的格式。NLP 的挑战是编写程序处理这种格式的泛化。例如,如果编程任务涉及树数据,文件格式允许任意有向图,那么必须验证输入数据检查树的属性如根、连通性、无环。如果输入文件包含其他层的标注,该程序将需要知道数据加载时如何忽略它们,将树数据保存到文件时不能否定或抹杀这些层。
另一种反应一直是写一个一次性的脚本来操纵语料格式;这样的脚本将许多 NLP 研究人员的文件夹弄得乱七八糟。在语料格式解析工作应该只进行一次(每编程语言)的前提下,NLTK 中的语料库阅读器是更系统的方法。
......@@ -340,7 +340,7 @@ sleep: wake
['anicular', 'inocular', 'nucellar', 'nuclear', 'unocular', 'uniocular', 'unicolor']
```
这仅仅是一个演示,其中一个简单的程序就可以方便的访问语言书写系统可能不规范或语言的使用者可能拼写的不是很好的上下文中的词汇数据。其他简单的 NLP 在这个领域的应用包括:建立索引以方便对数据的访问,从文本中拾取词汇表,构建词典时定位词语用法的例子,在知之甚少的数据中检测普遍或特殊模式,并在创建的数据上使用各种语言的软件工具执行专门的验证。我们将在5返回到其中的最后一个。
这仅仅是一个演示,其中一个简单的程序就可以方便的访问语言书写系统可能不规范或语言的使用者可能拼写的不是很好的上下文中的词汇数据。其他简单的 NLP 在这个领域的应用包括:建立索引以方便对数据的访问,从文本中拾取词汇表,构建词典时定位词语用法的例子,在知之甚少的数据中检测普遍或特殊模式,并在创建的数据上使用各种语言的软件工具执行专门的验证。我们将在 5 返回到其中的最后一个。
## 4 使用 XML
......@@ -475,7 +475,7 @@ Act 5 Scene 1 Speech 32: No better a musician than the wren.
('GRATIANO', 48), ('LORENZO', 47)]
```
我们也可以查看对话中谁跟着谁的模式。由于有 23 个演员,我们需要首先使用3中描述的方法将“词汇”减少到可处理的大小。
我们也可以查看对话中谁跟着谁的模式。由于有 23 个演员,我们需要首先使用 3 中描述的方法将“词汇”减少到可处理的大小。
```py
>>> from collections import defaultdict
......@@ -499,7 +499,7 @@ SHYL 15 15 2 26 21 0
## 4.4 使用 ElementTree 访问 Toolbox 数据
4中,我们看到了一个访问 Toolbox 数据的简单的接口,Toolbox 数据是语言学家用来管理数据的一种流行和行之有效的格式。这一节中,我们将讨论以 Toolbox 软件所不支持的方式操纵 Toolbox 数据的各种技术。我们讨论的方法也可以应用到其他记录结构化数据,不必管实际的文件格式。
4 中,我们看到了一个访问 Toolbox 数据的简单的接口,Toolbox 数据是语言学家用来管理数据的一种流行和行之有效的格式。这一节中,我们将讨论以 Toolbox 软件所不支持的方式操纵 Toolbox 数据的各种技术。我们讨论的方法也可以应用到其他记录结构化数据,不必管实际的文件格式。
我们可以用`toolbox.xml()`方法来访问 Toolbox 文件,将它加载到一个`elementtree`对象中。此文件包含一个巴布亚新几内亚罗托卡特语的词典。
......
......@@ -108,7 +108,7 @@ NLTK 包含古腾堡项目(Project Gutenberg)电子文本档案的经过挑
## 1.2 网络和聊天文本
虽然古腾堡项目包含成千上万的书籍,它代表既定的文学。考虑较不正式的语言也是很重要的。NLTK 的网络文本小集合的内容包括 Firefox 交流论坛,在纽约无意听到的对话,*加勒比海盗*的电影剧本,个人广告和葡萄酒的评论:
虽然古腾堡项目包含成千上万的书籍,它代表既定的文学。考虑较不正式的语言也是很重要的。NLTK 的网络文本小集合的内容包括 Firefox 交流论坛,在纽约无意听到的对话,《加勒比海盗》的电影剧本,个人广告和葡萄酒的评论:
```py
>>> from nltk.corpus import webtext
......@@ -123,7 +123,7 @@ singles.txt 25 SEXY MALE, seeks attrac older single lady, for discreet encoun...
wine.txt Lovely delicate, fragrant Rhone wine. Polished leather and strawb...
```
还有一个即时消息聊天会话语料库,最初由美国海军研究生院为研究自动检测互联网幼童虐待癖而收集的。语料库包含超过 10,000 张帖子,以“UserNNN”形式的通用名替换掉用户名,手工编辑消除任何其他身份信息,制作而成。语料库被分成 15 个文件,每个文件包含几百个按特定日期和特定年龄的聊天室(青少年、20 岁、30 岁、40 岁、再加上一个通用的成年人聊天室)收集的帖子。文件名中包含日期、聊天室和帖子数量,例如`10-19-20s_706posts.xml`包含 2006 年 10 月 19 日从 20 多岁聊天室收集的 706 个帖子。
还有一个即时消息聊天会话语料库,最初由美国海军研究生院为研究自动检测互联网幼童虐待癖而收集的。语料库包含超过 10,000 张帖子,以`UserNNN`形式的通用名替换掉用户名,手工编辑消除任何其他身份信息,制作而成。语料库被分成 15 个文件,每个文件包含几百个按特定日期和特定年龄的聊天室(青少年、20 岁、30 岁、40 岁、再加上一个通用的成年人聊天室)收集的帖子。文件名中包含日期、聊天室和帖子数量,例如`10-19-20s_706posts.xml`包含 2006 年 10 月 19 日从 20 多岁聊天室收集的 706 个帖子。
```py
>>> from nltk.corpus import nps_chat
......@@ -170,11 +170,11 @@ can: 94 could: 87 may: 93 might: 38 must: 53 will: 389
注意
我们需要包包含`结束 = ' '`以让 print 函数将其输出放在单独的一行。
我们需要包包含`end=' '`以让`print`函数将其输出放在单独的一行。
注意
**轮到你来**:选择布朗语料库的不同部分,修改前面的例子,计数包含 wh 的词,如:what, when, where, who 和 why
**轮到你来**:选择布朗语料库的不同部分,修改前面的例子,计数包含`wh`的词,如:`what`, `when`, `where`, `who``why`
下面,我们来统计每一个感兴趣的文体。我们使用 NLTK 提供的带条件的频率分布函数。在第 2 节中会系统的把下面的代码一行行拆开来讲解。现在,你可以忽略细节,只看输出。
......@@ -195,11 +195,11 @@ science_fiction 16 49 4 12 8 16
humor 16 30 8 8 9 13
```
请看,新闻文体中最常见的情态动词是 will,而言情文体中最常见的情态动词是 could。你能预言这些吗?这种可以区分文体的词计数方法将在[chap-data-intensive](./ch06.html#chap-data-intensive)中再次谈及。
请看,新闻文体中最常见的情态动词是`will`,而言情文体中最常见的情态动词是`could`。你能预言这些吗?这种可以区分文体的词计数方法将在第六章中再次谈及。
## 1.4 路透社语料库
路透社语料库包含 10,788 个新闻文档,共计 130 万字。这些文档分成 90 个主题,按照“训练”和“测试”分为两组;因此,fileid 为`'test/14826'`的文档属于测试组。这样分割是为了训练和测试算法的,这种算法自动检测文档的主题,我们将在[chap-data-intensive](./ch06.html#chap-data-intensive)中看到。
路透社语料库包含 10,788 个新闻文档,共计 130 万字。这些文档分成 90 个主题,按照“训练”和“测试”分为两组;因此,`fileid``'test/14826'`的文档属于测试组。这样分割是为了训练和测试算法的,这种算法自动检测文档的主题,我们将在第六章中看到。
```py
>>> from nltk.corpus import reuters
......@@ -211,7 +211,7 @@ science_fiction 16 49 4 12 8 16
'cotton', 'cotton-oil', 'cpi', 'cpu', 'crude', 'dfl', 'dlr', ...]
```
与布朗语料库不同,路透社语料库的类别是有互相重叠的,只是因为新闻报道往往涉及多个主题。我们可以查找由一个或多个文档涵盖的主题,也可以查找包含在一个或多个类别中的文档。为方便起见,语料库方法既接受单个的 fileid 也接受 fileids 列表作为参数。
与布朗语料库不同,路透社语料库的类别是有互相重叠的,只是因为新闻报道往往涉及多个主题。我们可以查找由一个或多个文档涵盖的主题,也可以查找包含在一个或多个类别中的文档。为方便起见,语料库方法既接受单个的`fileid`也接受`fileids`列表作为参数。
```py
>>> reuters.categories('training/9865')
......@@ -241,7 +241,7 @@ science_fiction 16 49 4 12 8 16
## 1.5 就职演说语料库
在第 1 章,我们看到了就职演说语料库,但是把它当作一个单独的文本对待。图[fig-inaugural](./ch01.html#fig-inaugural)中使用的“词偏移”就像是一个坐标轴;它是语料库中词的索引数,从第一个演讲的第一个词开始算起。然而,语料库实际上是 55 个文本的集合,每个文本都是一个总统的演说。这个集合的一个有趣特性是它的时间维度:
在第 1 章,我们看到了就职演说语料库,但是把它当作一个单独的文本对待。图 [inaugural](./ch01.html#fig-inaugural) 中使用的“词偏移”就像是一个坐标轴;它是语料库中词的索引数,从第一个演讲的第一个词开始算起。然而,语料库实际上是 55 个文本的集合,每个文本都是一个总统的演说。这个集合的一个有趣特性是它的时间维度:
```py
>>> from nltk.corpus import inaugural
......@@ -253,7 +253,7 @@ science_fiction 16 49 4 12 8 16
请注意,每个文本的年代都出现在它的文件名中。要从文件名中获得年代,我们使用`fileid[:4]`提取前四个字符。
让我们来看看词汇 America 和 citizen 随时间推移的使用情况。下面的代码使用`w.lower()`❶将就职演说语料库中的词汇转换成小写,然后用`startswith()`❶检查它们是否以“目标”词汇`america``citizen`开始。因此,它会计算如 American's 和 Citizens 等词。我们将在第 2 节学习条件频率分布,现在只考虑输出,如图 1.1 所示。
让我们来看看词汇`America``citizen`随时间推移的使用情况。下面的代码使用`w.lower()`❶将就职演说语料库中的词汇转换成小写,然后用`startswith()`❶检查它们是否以“目标”词汇`america``citizen`开始。因此,它会计算如`American's``Citizens`等词。我们将在第 2 节学习条件频率分布,现在只考虑输出,如图 1.1 所示。
```py
>>> cfd = nltk.ConditionalFreqDist(
......@@ -292,7 +292,7 @@ NLTK 中的一些语料库和语料库样本:关于下载和使用它们,请
['Saben', 'umat', 'manungsa', 'lair', 'kanthi', 'hak', ...]
```
这些语料库的最后,`udhr`,是超过 300 种语言的世界人权宣言。这个语料库的 fileids 包括有关文件所使用的字符编码,如`UTF8`或者`Latin1`。让我们用条件频率分布来研究`udhr`语料库中不同语言版本中的字长差异。图 1.2 中所示的输出(自己运行程序可以看到一个彩色图)。注意,`True``False`是 Python 内置的布尔值。
这些语料库的最后,`udhr`,是超过 300 种语言的世界人权宣言。这个语料库的`fileids`包括有关文件所使用的字符编码,如`UTF8`或者`Latin1`。让我们用条件频率分布来研究`udhr`语料库中不同语言版本中的字长差异。图 1.2 中所示的输出(自己运行程序可以看到一个彩色图)。注意,`True``False`是 Python 内置的布尔值。
```py
>>> from nltk.corpus import udhr
......@@ -311,7 +311,7 @@ NLTK 中的一些语料库和语料库样本:关于下载和使用它们,请
注意
**轮到你来**:在`udhr.fileids()`中选择一种感兴趣的语言,定义一个变量`raw_text = udhr.raw(`_Language-Latin1_`)`。使用`nltk.FreqDist(raw_text).plot()`画出此文本的字母频率分布图。
**轮到你来**:在`udhr.fileids()`中选择一种感兴趣的语言,定义一个变量`raw_text = udhr.raw('Language-Latin1')`。使用`nltk.FreqDist(raw_text).plot()`画出此文本的字母频率分布图。
不幸的是,许多语言没有大量的语料库。通常是政府或工业对发展语言资源的支持不够,个人的努力是零碎的,难以发现或重用。有些语言没有既定的书写系统,或濒临灭绝。(见第 7 节有关如何寻找语言资源的建议。)
......@@ -345,7 +345,7 @@ NLTK 中定义的基本语料库函数:使用`help(nltk.corpus.reader)`可以
## 1.9 加载你自己的语料库
如果你有自己收集的文本文件,并且想使用前面讨论的方法访问它们,你可以很容易地在 NLTK 中的`PlaintextCorpusReader`帮助下加载它们。检查你的文件在文件系统中的位置;在下面的例子中,我们假定你的文件在`/usr/share/dict`目录下。不管是什么位置,将变量`corpus_root`❶的值设置为这个目录。`PlaintextCorpusReader`初始化函数❷的第二个参数可以是一个如`['a.txt', 'test/b.txt']`这样的 fileids 列表,或者一个匹配所有 fileids 的模式,如`'[abc]/.*\.txt'`(关于正则表达式的信息见 3.4 节)。
如果你有自己收集的文本文件,并且想使用前面讨论的方法访问它们,你可以很容易地在 NLTK 中的`PlaintextCorpusReader`帮助下加载它们。检查你的文件在文件系统中的位置;在下面的例子中,我们假定你的文件在`/usr/share/dict`目录下。不管是什么位置,将变量`corpus_root`❶的值设置为这个目录。`PlaintextCorpusReader`初始化函数❷的第二个参数可以是一个如`['a.txt', 'test/b.txt']`这样的`fileids`列表,或者一个匹配所有`fileids`的模式,如`'[abc]/.*\.txt'`(关于正则表达式的信息见 3.4 节)。
```py
>>> from nltk.corpus import PlaintextCorpusReader
......@@ -398,7 +398,7 @@ NLTK 中定义的基本语料库函数:使用`help(nltk.corpus.reader)`可以
## 2.2 按文体计数词汇
1中,我们看到一个条件频率分布,其中条件为布朗语料库的每一节,并对每节计数词汇。`FreqDist()`以一个简单的列表作为输入,`ConditionalFreqDist()`以一个配对列表作为输入。
1 中,我们看到一个条件频率分布,其中条件为布朗语料库的每一节,并对每节计数词汇。`FreqDist()`以一个简单的列表作为输入,`ConditionalFreqDist()`以一个配对列表作为输入。
```py
>>> from nltk.corpus import brown
......@@ -499,7 +499,7 @@ German_Deutsch 0 171 263 614 717 894 1013 1110 1213 1275
## 2.4 使用双连词生成随机文本
我们可以使用条件频率分布创建一个双连词表(词对)。(我们在3中介绍过。)`bigrams()`函数接受一个单词列表,并建立一个连续的词对列表。记住,为了能看到结果而不是神秘的"生成器对象",我们需要使用`list()`函数︰
我们可以使用条件频率分布创建一个双连词表(词对)。(我们在 3 中介绍过。)`bigrams()`函数接受一个单词列表,并建立一个连续的词对列表。记住,为了能看到结果而不是神秘的"生成器对象",我们需要使用`list()`函数︰
```py
>>> sent = ['In', 'the', 'beginning', 'God', 'created', 'the', 'heaven',
......@@ -546,7 +546,7 @@ print('Monty Python')
假设你正在分析一些文本,这些文本包含同一个词的不同形式,你的一部分程序需要将给定的单数名词变成复数形式。假设需要在两个地方做这样的事,一个是处理一些文本,另一个是处理用户的输入。
比起重复相同的代码好几次,把这些事情放在一个函数中会更有效和可靠。一个函数是命名的代码块,执行一些明确的任务,就像我们在1中所看到的那样。一个函数通常被定义来使用一些称为参数的变量接受一些输入,并且它可能会产生一些结果,也称为返回值。我们使用关键字`def`加函数名以及所有输入参数来定义一个函数,接下来是函数的主体。这里是我们在1看到的函数(对于 Python 2,请包含`import`语句,这样可以使除法像我们期望的那样运算):
比起重复相同的代码好几次,把这些事情放在一个函数中会更有效和可靠。一个函数是命名的代码块,执行一些明确的任务,就像我们在 1 中所看到的那样。一个函数通常被定义来使用一些称为参数的变量接受一些输入,并且它可能会产生一些结果,也称为返回值。我们使用关键字`def`加函数名以及所有输入参数来定义一个函数,接下来是函数的主体。这里是我们在 1 看到的函数(对于 Python 2,请包含`import`语句,这样可以使除法像我们期望的那样运算):
```py
>>> from __future__ import division
......@@ -613,7 +613,7 @@ fen
## 4 词汇资源
词典或者词典资源是一个词和/或短语以及一些相关信息的集合,例如:词性和词意定义等相关信息。词典资源附属于文本,通常在文本的帮助下创建和丰富。例如:如果我们定义了一个文本`my_text`,然后`vocab = sorted(set(my_text))`建立`my_text`的词汇,同时`word_freq = FreqDist(my_text)`计数文本中每个词的频率。`vocab``word_freq`都是简单的词汇资源。同样,如我们在1中看到的,词汇索引为我们提供了有关词语用法的信息,可能在编写词典时有用。4.1 中描述了词汇相关的标准术语。一个词项包括词目(也叫词条)以及其他附加信息,例如词性和词意定义。两个不同的词拼写相同被称为同音异义词。
词典或者词典资源是一个词和/或短语以及一些相关信息的集合,例如:词性和词意定义等相关信息。词典资源附属于文本,通常在文本的帮助下创建和丰富。例如:如果我们定义了一个文本`my_text`,然后`vocab = sorted(set(my_text))`建立`my_text`的词汇,同时`word_freq = FreqDist(my_text)`计数文本中每个词的频率。`vocab``word_freq`都是简单的词汇资源。同样,如我们在 1 中看到的,词汇索引为我们提供了有关词语用法的信息,可能在编写词典时有用。4.1 中描述了词汇相关的标准术语。一个词项包括词目(也叫词条)以及其他附加信息,例如词性和词意定义。两个不同的词拼写相同被称为同音异义词。
![Images/1b33abb14fc8fe7c704d005736ddb323.jpg](Images/1b33abb14fc8fe7c704d005736ddb323.jpg)
......@@ -822,7 +822,7 @@ P-T pait pat pate patt peart peat peet peete pert pet pete pett piet piett...
P-UW1 peru peugh pew plew plue prew pru prue prugh pshew pugh...
```
我们可以通过查找特定词汇来访问词典,而不必遍历整个词典。我们将使用 Python 的词典数据结构,在3节我们将系统的学习它。通过指定词典的名字后面跟一个包含在方括号里的关键字(例如词`'fire'`)来查词典❶。
我们可以通过查找特定词汇来访问词典,而不必遍历整个词典。我们将使用 Python 的词典数据结构,在 3 节我们将系统的学习它。通过指定词典的名字后面跟一个包含在方括号里的关键字(例如词`'fire'`)来查词典❶。
```py
>>> prondict = nltk.corpus.cmudict.dict()
......@@ -863,7 +863,7 @@ KeyError: 'blog'
'few', 'other', 'one', 'two', 'three', 'four', 'five', 'big', 'long', 'wide', ...]
```
我们可以通过在`entries()`方法中指定一个语言列表来访问多语言中的同源词。更进一步,我们可以把它转换成一个简单的词典(我们将在3学到`dict()`函数)。
我们可以通过在`entries()`方法中指定一个语言列表来访问多语言中的同源词。更进一步,我们可以把它转换成一个简单的词典(我们将在 3 学到`dict()`函数)。
```py
>>> fr2en = swadesh.entries(['fr', 'en'])
......@@ -1218,7 +1218,7 @@ WordNet 原始描述是[(Fellbaum, 1998)](./bibliography.html#fellbaum1998)。
16. ◑ 写一个程序,生成一个词汇多样性得分表(例如词符/词型的比例),如我们在 1.1 所看到的。包括布朗语料库文体的全集 (`nltk.corpus.brown.categories()`)。哪个文体词汇多样性最低(每个类型的标识符数最多)?这是你所期望的吗?
17. ◑ 写一个函数,找出一个文本中最常出现的 50 个词,停用词除外。
18. ◑ 写一个程序,输出一个文本中 50 个最常见的双连词(相邻词对),忽略包含停用词的双连词。
19. ◑ 写一个程序,按文体创建一个词频表,以1节给出的词频表为范例。选择你自己的词汇,并尝试找出那些在一个文体中很突出或很缺乏的词汇。讨论你的发现。
19. ◑ 写一个程序,按文体创建一个词频表,以 1 节给出的词频表为范例。选择你自己的词汇,并尝试找出那些在一个文体中很突出或很缺乏的词汇。讨论你的发现。
20. ◑ 写一个函数`word_freq()`,用一个词和布朗语料库中的一个部分的名字作为参数,计算这部分语料中词的频率。
21. ◑ 写一个程序,估算一个文本中的音节数,利用 CMU 发音词典。
22. ◑ 定义一个函数`hedge(text)`,处理一个文本和产生一个新的版本在每三个词之间插入一个词`'like'`
......
......@@ -406,7 +406,7 @@ Monty Python and the Holy Grail
### 访问单个字符
正如我们在2看到的列表,字符串也是被索引的,从零开始。当我们索引一个字符串时,我们得到它的一个字符(或字母)。一个单独的字符并没有什么特别,它只是一个长度为`1`的字符串。
正如我们在 2 看到的列表,字符串也是被索引的,从零开始。当我们索引一个字符串时,我们得到它的一个字符(或字母)。一个单独的字符并没有什么特别,它只是一个长度为`1`的字符串。
```py
>>> monty[0]
......@@ -985,7 +985,7 @@ la la; lovely lol lol love; lol lol lol.; la la la; la la la
**轮到你来**:巩固你对正则表达式模式与替换的理解,使用`nltk.re_show(`_p, s_`)`,它能标注字符串 *s* 中所有匹配模式 *p* 的地方,以及`nltk.app.nemo()`,它能提供一个探索正则表达式的图形界面。更多的练习,可以尝试本章尾的正则表达式的一些练习。
当我们研究的语言现象与特定词语相关时建立搜索模式是很容易的。在某些情况下,一个小小的创意可能会花很大功夫。例如,在大型文本语料库中搜索 x and other ys 形式的表达式能让我们发现上位词(见5):
当我们研究的语言现象与特定词语相关时建立搜索模式是很容易的。在某些情况下,一个小小的创意可能会花很大功夫。例如,在大型文本语料库中搜索 x and other ys 形式的表达式能让我们发现上位词(见 5):
```py
>>> from nltk.corpus import brown
......@@ -1232,7 +1232,7 @@ WordNet 词形归并器只在产生的词在它的词典中时才删除词缀。
断句是困难的,因为句号会被用来标记缩写而另一些句号同时标记缩写和句子结束,就像发生在缩写如 U.S.A.上的那样。
断句的另一种方法见2节。
断句的另一种方法见 2 节。
### 分词
......@@ -1470,7 +1470,7 @@ Unexpected indentation.
'accuracy for 9375 words: 34.1867%'
```
格式化字符串的一个重要用途是用于数据制表。回想一下,在1中,我们看到从条件频率分布中制表的数据。让我们自己来制表,行使对标题和列宽的完全控制,如 3.11 所示。注意语言处理工作与结果制表之间是明确分离的。
格式化字符串的一个重要用途是用于数据制表。回想一下,在 1 中,我们看到从条件频率分布中制表的数据。让我们自己来制表,行使对标题和列宽的完全控制,如 3.11 所示。注意语言处理工作与结果制表之间是明确分离的。
```py
def tabulate(cfdist, words, categories):
......
......@@ -480,7 +480,7 @@ True
## 4.4 函数:结构化编程的基础
函数提供了程序代码打包和重用的有效途径,已经在3中解释过。例如,假设我们发现我们经常要从 HTML 文件读取文本。这包括以下几个步骤,打开文件,将它读入,规范化空白符号,剥离 HTML 标记。我们可以将这些步骤收集到一个函数中,并给它一个名字,如`get_text()`,如 4.2 所示。
函数提供了程序代码打包和重用的有效途径,已经在 3 中解释过。例如,假设我们发现我们经常要从 HTML 文件读取文本。这包括以下几个步骤,打开文件,将它读入,规范化空白符号,剥离 HTML 标记。我们可以将这些步骤收集到一个函数中,并给它一个名字,如`get_text()`,如 4.2 所示。
```py
import re
......@@ -857,7 +857,7 @@ Python 提供一些具有函数式编程语言如 Haskell 标准特征的高阶
'AliceAliceAliceAliceAlice'
```
这些被称为关键字参数。如果我们混合使用这两种参数,就必须确保未命名的参数在命名的参数前面。必须是这样,因为未命名参数是根据位置来定义的。我们可以定义一个函数,接受任意数量的未命名和命名参数,并通过一个就地的参数列表`*args`和一个就地的关键字参数字典`**kwargs`来访问它们。(字典将在3中讲述。)
这些被称为关键字参数。如果我们混合使用这两种参数,就必须确保未命名的参数在命名的参数前面。必须是这样,因为未命名参数是根据位置来定义的。我们可以定义一个函数,接受任意数量的未命名和命名参数,并通过一个就地的参数列表`*args`和一个就地的关键字参数字典`**kwargs`来访问它们。(字典将在 3 中讲述。)
```py
>>> def generic(*args, **kwargs):
......@@ -1265,7 +1265,7 @@ def bar_chart(categories, words, counts):
### NetworkX
NetworkX 包定义和操作被称为图的由节点和边组成的结构。它可以从`https://networkx.lanl.gov/`得到。NetworkX 可以和 Matplotlib 结合使用可视化如 WordNet 的网络结构(语义网络,我们在5介绍过)。4.15 中的程序初始化一个空的图❸,然后遍历 WordNet 上位词层次为图添加边❶。请注意,遍历是递归的❷,使用在 4.7 讨论的编程技术。结果显示在 4.16。
NetworkX 包定义和操作被称为图的由节点和边组成的结构。它可以从`https://networkx.lanl.gov/`得到。NetworkX 可以和 Matplotlib 结合使用可视化如 WordNet 的网络结构(语义网络,我们在 5 介绍过)。4.15 中的程序初始化一个空的图❸,然后遍历 WordNet 上位词层次为图添加边❶。请注意,遍历是递归的❷,使用在 4.7 讨论的编程技术。结果显示在 4.16。
```py
import networkx as nx
......
......@@ -495,7 +495,7 @@ sleep: V
'N'
```
最初,`pos['sleep']`给的值是`'V'`。但是,它立即被一个新值`'N'`覆盖。换句话说,字典中只能有`'sleep'`的一个条目。然而,有一个方法可以在该项目中存储多个值:我们使用一个列表值,例如`pos['sleep'] = ['N', 'V']`。事实上,这就是我们在4中看到的 CMU 发音字典,它为一个词存储多个发音。
最初,`pos['sleep']`给的值是`'V'`。但是,它立即被一个新值`'N'`覆盖。换句话说,字典中只能有`'sleep'`的一个条目。然而,有一个方法可以在该项目中存储多个值:我们使用一个列表值,例如`pos['sleep'] = ['N', 'V']`。事实上,这就是我们在 4 中看到的 CMU 发音字典,它为一个词存储多个发音。
## 3.3 定义字典
......@@ -807,7 +807,7 @@ Python 字典方法:常用的方法与字典相关习惯用法的总结。
注意
**轮到你来**:看看你能不能想出一些模式,提高上面所示的正则表达式标注器的性能。(请注意1描述部分自动化这类工作的方法。)
**轮到你来**:看看你能不能想出一些模式,提高上面所示的正则表达式标注器的性能。(请注意 1 描述部分自动化这类工作的方法。)
## 4.3 查询标注器
......@@ -1001,7 +1001,7 @@ N-gram 标注器不应考虑跨越句子边界的上下文。因此,NLTK 的
我们标注生词的方法仍然是回退到一个正则表达式标注器或一个默认标注器。这些都无法利用上下文。因此,如果我们的标注器遇到词 blog,训练过程中没有看到过,它会分配相同的标记,不论这个词出现的上下文是 the blog 还是 to blog。我们怎样才能更好地处理这些生词,或词汇表以外的项目?
一个有用的基于上下文标注生词的方法是限制一个标注器的词汇表为最频繁的 n 个词,使用3中的方法替代每个其他的词为一个特殊的词 UNK。训练时,一个一元标注器可能会学到 UNK 通常是一个名词。然而,n-gram 标注器会检测它的一些其他标记中的上下文。例如,如果前面的词是 to(标注为`TO`),那么 UNK 可能会被标注为一个动词。
一个有用的基于上下文标注生词的方法是限制一个标注器的词汇表为最频繁的 n 个词,使用 3 中的方法替代每个其他的词为一个特殊的词 UNK。训练时,一个一元标注器可能会学到 UNK 通常是一个名词。然而,n-gram 标注器会检测它的一些其他标记中的上下文。例如,如果前面的词是 to(标注为`TO`),那么 UNK 可能会被标注为一个动词。
## 5.6 存储标注器
......@@ -1152,7 +1152,7 @@ Statement User121 18/m pm me if u tryin to chat
6. ☼ 尝试从字典`d`删除一个元素,使用语法`del d['abc']`。检查被删除的项目。
7. ☼ 创建两个字典,`d1`和`d2`,为每个添加一些条目。现在发出命令`d1.update(d2)`。这做了什么?它可能是有什么用?
8. ☼ 创建一个字典`e`,表示你选择的一些词的一个单独的词汇条目。定义键如`headword`、`part-of-speech`、`sense`和`example`,分配给它们适当的值。
9. ☼ 自己验证 go 和 went 在分布上的限制,也就是说,它们不能自由地在7中的[(3d)](./ch05.html#ex-go)演示的那种上下文中互换。
9. ☼ 自己验证 go 和 went 在分布上的限制,也就是说,它们不能自由地在 7 中的[(3d)](./ch05.html#ex-go)演示的那种上下文中互换。
10. ☼ 训练一个一元标注器,在一些新的文本上运行。观察有些词没有分配到标记。为什么没有?
11. ☼ 了解词缀标注器(输入`help(nltk.AffixTagger)`)。训练一个词缀标注器,在一些新的文本上运行。设置不同的词缀长度和最小词长做实验。讨论你的发现。
12. ☼ 训练一个没有回退标注器的二元标注器,在一些训练数据上运行。下一步,在一些新的数据运行它。标注器的准确性会发生什么?为什么呢?
......@@ -1186,7 +1186,7 @@ Statement User121 18/m pm me if u tryin to chat
24. ◑ 数据稀疏问题有多严重?调查 n-gram 标注器当 n 从 1 增加到 6 时的准确性。为准确性得分制表。估计这些标注器需要的训练数据,假设词汇量大小为 10&lt;sup&gt;5&lt;/sup&gt;而标记集的大小为 10&lt;sup&gt;2&lt;/sup&gt;。
25. ◑ 获取另一种语言的一些已标注数据,在其上测试和评估各种标注器。如果这种语言是形态复杂的,或者有词类的任何字形线索(如),可以考虑为它开发一个正则表达式标注器(排在一元标注器之后,默认标注器之前)。对比同样的运行在英文数据上的标注器,你的标注器的准确性如何?讨论你在运用这些方法到这种语言时遇到的问题。
26. ◑ 4.1 绘制曲线显示查找标注器的性能随模型的大小增加的变化。绘制当训练数据量变化时一元标注器的性能曲线。
27. ◑ 检查5中定义的二元标注器`t2`的混淆矩阵,确定简化的一套或多套标记。定义字典做映射,在简化的数据上评估标注器。
27. ◑ 检查 5 中定义的二元标注器`t2`的混淆矩阵,确定简化的一套或多套标记。定义字典做映射,在简化的数据上评估标注器。
28. ◑ 使用简化的标记集测试标注器(或制作一个你自己的,通过丢弃每个标记名中除第一个字母外所有的字母)。这种标注器需要做的区分更少,但由它获得的信息也更少。讨论你的发现。
29. ◑ 回顾一个二元标注器训练过程中遇到生词,标注句子的其余部分为`None`的例子。一个二元标注器可能只处理了句子的一部分就失败了,即使句子中没有包含生词(即使句子在训练过程中使用过)。在什么情况下会出现这种情况呢?你可以写一个程序,找到一些这方面的例子吗?
30. ◑ 预处理布朗新闻数据,替换低频词为 UNK,但留下标记不变。在这些数据上训练和评估一个二元标注器。这样有多少帮助?一元标注器和默认标注器的贡献是什么?
......@@ -1204,11 +1204,11 @@ Statement User121 18/m pm me if u tryin to chat
1. 创建一种新的一元标注器,查看前一个词的标记,而忽略当前词。(做到这一点的最好办法是修改`UnigramTagger()`的源代码,需要 Python 中的面向对象编程的知识。
2. 将这个标注器加入到回退标注器序列(包括普通的三元和二元标注器),放在常用默认标注器的前面。
3. 评价这个新的一元标注器的贡献。
38. ★ 思考5中的代码,它确定一个三元标注器的准确性上限。回顾 Abney 的关于精确标注的不可能性的讨论[(Church, Young, & Bloothooft, 1996)](./bibliography.html#abney1996pst)。解释为什么正确标注这些例子需要获取词和标记以外的其他种类的信息。你如何估计这个问题的规模?
38. ★ 思考 5 中的代码,它确定一个三元标注器的准确性上限。回顾 Abney 的关于精确标注的不可能性的讨论[(Church, Young, & Bloothooft, 1996)](./bibliography.html#abney1996pst)。解释为什么正确标注这些例子需要获取词和标记以外的其他种类的信息。你如何估计这个问题的规模?
39. ★ 使用`nltk.probability`中的一些估计技术,例如 *Lidstone* 或 *Laplace* 估计,开发一种统计标注器,它在训练中没有遇到而测试中遇到的上下文中表现优于 n-gram 回退标注器。
40. ★ 检查 Brill 标注器创建的诊断文件`rules.out`和`errors.out`。通过访问源代码(`http://www.nltk.org/code`)获得演示代码,创建你自己版本的 Brill 标注器。并根据你从检查`rules.out`了解到的,删除一些规则模板。增加一些新的规则模板,这些模板使用那些可能有助于纠正你在`errors.out`看到的错误的上下文。
41. ★ 开发一个 n-gram 回退标注器,允许在标注器初始化时指定“anti-n-grams”,如`["the", "the"]`。一个 anti-n-grams 被分配一个数字 0,被用来防止这个 n-gram 回退(如避免估计 P(the | the)而只做 P(the))。
42. ★ 使用布朗语料库开发标注器时,调查三种不同的方式来定义训练和测试数据之间的分割:genre (`category`)、source (`fileid`)和句子。比较它们的相对性能,并讨论哪种方法最合理。(你可能要使用 n-交叉验证,在3中讨论的,以提高评估的准确性。)
42. ★ 使用布朗语料库开发标注器时,调查三种不同的方式来定义训练和测试数据之间的分割:genre (`category`)、source (`fileid`)和句子。比较它们的相对性能,并讨论哪种方法最合理。(你可能要使用 n-交叉验证,在 3 中讨论的,以提高评估的准确性。)
43. ★ 开发你自己的`NgramTagger`,从 NLTK 中的类继承,封装本章中所述的已标注的训练和测试数据的词汇表缩减方法。确保一元和默认回退标注器有机会获得全部词汇。
## 关于本文档...
......
......@@ -30,7 +30,7 @@
## 1.1 性别鉴定
4中,我们看到,男性和女性的名字有一些鲜明的特点。以 a,e 和 i 结尾的很可能是女性,而以 k,o,r,s 和 t 结尾的很可能是男性。让我们建立一个分类器更精确地模拟这些差异。
4 中,我们看到,男性和女性的名字有一些鲜明的特点。以 a,e 和 i 结尾的很可能是女性,而以 k,o,r,s 和 t 结尾的很可能是男性。让我们建立一个分类器更精确地模拟这些差异。
创建一个分类器的第一步是决定输入的什么样的特征是相关的,以及如何为那些特征编码。在这个例子中,我们一开始只是寻找一个给定的名称的最后一个字母。以下特征提取器函数建立一个字典,包含有关给定名称的相关信息:
......@@ -213,7 +213,7 @@ correct=male guess=female name=Rich
## 1.3 文档分类
1中,我们看到了语料库的几个例子,那里文档已经按类别标记。使用这些语料库,我们可以建立分类器,自动给新文档添加适当的类别标签。首先,我们构造一个标记了相应类别的文档清单。对于这个例子,我们选择电影评论语料库,将每个评论归类为正面或负面。
1 中,我们看到了语料库的几个例子,那里文档已经按类别标记。使用这些语料库,我们可以建立分类器,自动给新文档添加适当的类别标签。首先,我们构造一个标记了相应类别的文档清单。对于这个例子,我们选择电影评论语料库,将每个评论归类为正面或负面。
```py
>>> from nltk.corpus import movie_reviews
......@@ -286,7 +286,7 @@ classifier = nltk.NaiveBayesClassifier.train(train_set)
特征提取函数的行为就像有色眼镜一样,强调我们的数据中的某些属性(颜色),并使其无法看到其他属性。分类器在决定如何标记输入时,将完全依赖它们强调的属性。在这种情况下,分类器将只基于一个给定的词拥有(如果有)哪个常见后缀的信息来做决定。
现在,我们已经定义了我们的特征提取器,可以用它来训练一个新的“决策树”的分类器(将在4讨论):
现在,我们已经定义了我们的特征提取器,可以用它来训练一个新的“决策树”的分类器(将在 4 讨论):
```py
>>> tagged_words = brown.tagged_words(categories='news')
......@@ -351,7 +351,7 @@ def pos_features(sentence, i): ❶
为了捕捉相关的分类任务之间的依赖关系,我们可以使用联合分类器模型,收集有关输入,选择适当的标签。在词性标注的例子中,各种不同的序列分类器模型可以被用来为一个给定的句子中的所有的词共同选择词性标签。
一种序列分类器策略,称为连续分类或贪婪序列分类,是为第一个输入找到最有可能的类标签,然后使用这个问题的答案帮助找到下一个输入的最佳的标签。这个过程可以不断重复直到所有的输入都被贴上标签。这是5中的二元标注器采用的方法,它一开始为句子的第一个词选择词性标记,然后为每个随后的词选择标记,基于词本身和前面词的预测的标记。
一种序列分类器策略,称为连续分类或贪婪序列分类,是为第一个输入找到最有可能的类标签,然后使用这个问题的答案帮助找到下一个输入的最佳的标签。这个过程可以不断重复直到所有的输入都被贴上标签。这是 5 中的二元标注器采用的方法,它一开始为句子的第一个词选择词性标记,然后为每个随后的词选择标记,基于词本身和前面词的预测的标记。
在 1.7 中演示了这一策略。首先,我们必须扩展我们的特征提取函数使其具有参数`history`,它提供一个我们到目前为止已经为句子预测的标记的列表❶。`history`中的每个标记对应`sentence`中的一个词。但是请注意,`history`将只包含我们已经归类的词的标记,也就是目标词左侧的词。因此,虽然是有可能查看目标词右边的词的某些特征,但查看那些词的标记是不可能的(因为我们还未产生它们)。
......@@ -464,7 +464,7 @@ def segment_sentences(words):
处理对话时,将对话看作说话者执行的*行为*是很有用的。对于表述行为的陈述句这种解释是最直白的,例如"I forgive you"或"I bet you can't climb that hill"。但是问候、问题、回答、断言和说明都可以被认为是基于语言的行为类型。识别对话中言语下的对话行为是理解谈话的重要的第一步。
NPS 聊天语料库,在1中的展示过,包括超过 10,000 个来自即时消息会话的帖子。这些帖子都已经被贴上 15 种对话行为类型中的一种标签,例如“陈述”,“情感”,“yn 问题”和“Continuer”。因此,我们可以利用这些数据建立一个分类器,识别新的即时消息帖子的对话行为类型。第一步是提取基本的消息数据。我们将调用`xml_posts()`来得到一个数据结构,表示每个帖子的 XML 注释:
NPS 聊天语料库,在 1 中的展示过,包括超过 10,000 个来自即时消息会话的帖子。这些帖子都已经被贴上 15 种对话行为类型中的一种标签,例如“陈述”,“情感”,“yn 问题”和“Continuer”。因此,我们可以利用这些数据建立一个分类器,识别新的即时消息帖子的对话行为类型。第一步是提取基本的消息数据。我们将调用`xml_posts()`来得到一个数据结构,表示每个帖子的 XML 注释:
```py
>>> posts = nltk.corpus.nps_chat.xml_posts()[:10000]
......@@ -494,7 +494,7 @@ NPS 聊天语料库,在1中的展示过,包括超过 10,000 个来自即时
## 2.3 识别文字蕴含
识别文字蕴含(RTE)是判断文本 *T* 的一个给定片段是否蕴含着另一个叫做“假设”的文本(已经在5讨论过)。迄今为止,已经有 4 个 RTE 挑战赛,在那里共享的开发和测试数据会提供给参赛队伍。这里是挑战赛 3 开发数据集中的文本/假设对的两个例子。标签 *True* 表示蕴含成立,*False* 表示蕴含不成立。
识别文字蕴含(RTE)是判断文本 *T* 的一个给定片段是否蕴含着另一个叫做“假设”的文本(已经在 5 讨论过)。迄今为止,已经有 4 个 RTE 挑战赛,在那里共享的开发和测试数据会提供给参赛队伍。这里是挑战赛 3 开发数据集中的文本/假设对的两个例子。标签 *True* 表示蕴含成立,*False* 表示蕴含不成立。
> Challenge 3, Pair 34 (True)
>
......@@ -602,7 +602,7 @@ Python 提供了一个良好的环境进行基本的文本处理和特征提取
0.75
```
解释一个分类器的准确性得分,考虑测试集中单个类标签的频率是很重要的。例如,考虑一个决定词 bank 每次出现的正确的词意的分类器。如果我们在金融新闻文本上评估分类器,那么我们可能会发现,`金融机构`的意思 20 个里面出现了 19 次。在这种情况下,95% 的准确度也难以给人留下深刻印象,因为我们可以实现一个模型,它总是返回`金融机构`的意义。然而,如果我们在一个更加平衡的语料库上评估分类器,那里的最频繁的词意只占 40%,那么 95% 的准确度得分将是一个更加积极的结果。(在2测量标注一致性程度时也会有类似的问题。)
解释一个分类器的准确性得分,考虑测试集中单个类标签的频率是很重要的。例如,考虑一个决定词 bank 每次出现的正确的词意的分类器。如果我们在金融新闻文本上评估分类器,那么我们可能会发现,`金融机构`的意思 20 个里面出现了 19 次。在这种情况下,95% 的准确度也难以给人留下深刻印象,因为我们可以实现一个模型,它总是返回`金融机构`的意义。然而,如果我们在一个更加平衡的语料库上评估分类器,那里的最频繁的词意只占 40%,那么 95% 的准确度得分将是一个更加积极的结果。(在 2 测量标注一致性程度时也会有类似的问题。)
## 3.3 精确度和召回率
......@@ -625,7 +625,7 @@ Python 提供了一个良好的环境进行基本的文本处理和特征提取
## 3.4 混淆矩阵
当处理有 3 个或更多的标签的分类任务时,基于模型错误类型细分模型的错误是有信息量的。一个混淆矩阵是一个表,其中每个 cells [i,j]表示正确的标签 i 被预测为标签 j 的次数。因此,对角线项目(即 cells [|ii|](./ch06.html#id17))表示正确预测的标签,非对角线项目表示错误。在下面的例子中,我们为4中开发的一元标注器生成一个混淆矩阵:
当处理有 3 个或更多的标签的分类任务时,基于模型错误类型细分模型的错误是有信息量的。一个混淆矩阵是一个表,其中每个 cells [i,j]表示正确的标签 i 被预测为标签 j 的次数。因此,对角线项目(即 cells [|ii|](./ch06.html#id17))表示正确预测的标签,非对角线项目表示错误。在下面的例子中,我们为 4 中开发的一元标注器生成一个混淆矩阵:
```py
>>> def tag_list(tagged_sents):
......
......@@ -54,7 +54,7 @@
图 2.1:词符和词块级别的分割与标注
在本节中,我们将在较深的层面探讨词块划分,以词块的定义和表示开始。我们将看到正则表达式和 N-gram 的方法来词块划分,使用 CoNLL-2000 词块划分语料库开发和评估词块划分器。我们将在[(5)](./ch07.html#sec-ner)6回到命名实体识别和关系抽取的任务。
在本节中,我们将在较深的层面探讨词块划分,以词块的定义和表示开始。我们将看到正则表达式和 N-gram 的方法来词块划分,使用 CoNLL-2000 词块划分语料库开发和评估词块划分器。我们将在[(5)](./ch07.html#sec-ner) 6 回到命名实体识别和关系抽取的任务。
## 2.1 名词短语词块划分
......@@ -130,7 +130,7 @@ sentence = [("Rapunzel", "NNP"), ("let", "VBD"), ("down", "RP"), ❶
## 2.4 探索文本语料库
2中,我们看到了我们如何在已标注的语料库中提取匹配的特定的词性标记序列的短语。我们可以使用词块划分器更容易的做同样的工作,如下:
2 中,我们看到了我们如何在已标注的语料库中提取匹配的特定的词性标记序列的短语。我们可以使用词块划分器更容易的做同样的工作,如下:
```py
>>> cp = nltk.RegexpParser('CHUNK: {<V.*> <TO> <V.*>}')
......
......@@ -14,7 +14,7 @@
## 1.1 语言数据和无限可能性
前面的章节中已经为你讲述了如何处理和分析的文本语料库,我们一直强调处理大量的每天都在增加的电子语言数据是 NLP 的挑战。让我们更加细致的思考这些数据,做一个思想上的实验,我们有一个巨大的语料库,包括在过去 50 年中英文表达或写成的一切。我们称这个语料库为“现代英语”合理吗?有许多为什么我们的回答可能是否定的的原因。回想一下,在3中,我们让你搜索网络查找 the of 模式的实例。虽然很容易在网上找到包含这个词序列的例子,例如 New man at the of IMG (见`http://www.telegraph.co.uk/sport/2387900/New-man-at-the-of-IMG.html`),说英语的人会说大多数这样的例子是错误的,因此它们根本不是英语。
前面的章节中已经为你讲述了如何处理和分析的文本语料库,我们一直强调处理大量的每天都在增加的电子语言数据是 NLP 的挑战。让我们更加细致的思考这些数据,做一个思想上的实验,我们有一个巨大的语料库,包括在过去 50 年中英文表达或写成的一切。我们称这个语料库为“现代英语”合理吗?有许多为什么我们的回答可能是否定的的原因。回想一下,在 3 中,我们让你搜索网络查找 the of 模式的实例。虽然很容易在网上找到包含这个词序列的例子,例如 New man at the of IMG (见`http://www.telegraph.co.uk/sport/2387900/New-man-at-the-of-IMG.html`),说英语的人会说大多数这样的例子是错误的,因此它们根本不是英语。
因此,我们可以说,“现代英语”并不等同于我们想象中的语料库中的非常大的词序列的集合。说英语的人可以判断这些序列,并将拒绝其中一些不合语法的。
......@@ -410,7 +410,7 @@ NLTK 语料库也收集了*中央研究院树库语料*,包括 10,000 句已
(S (NP (NP fish) (Sbar (NP fish) (V fish))) (V fish) (NP fish))
```
随着句子长度增加到(3,5,7,...),我们得到的分析树的数量是:1; 2; 5; 14; 42; 132; 429; 1,430; 4,862; 16,796; 58,786; 208,012; ….(这是 Catalan 数,我们在4的练习中见过)。最后一个是句子长度为 23 的分析树的数目,这是宾州树库 WSJ 部分的句子的平均长度。对于一个长度为 50 的句子有超过 10&lt;sup&gt;12&lt;/sup&gt;的解析,这只是 Piglet 句子长度的一半(1),这些句子小孩可以毫不费力的处理。没有实际的自然语言处理系统可以为一个句子构建数以百万计的树,并根据上下文选择一个合适的。很显然,人也不会这样做!
随着句子长度增加到(3,5,7,...),我们得到的分析树的数量是:1; 2; 5; 14; 42; 132; 429; 1,430; 4,862; 16,796; 58,786; 208,012; ….(这是 Catalan 数,我们在 4 的练习中见过)。最后一个是句子长度为 23 的分析树的数目,这是宾州树库 WSJ 部分的句子的平均长度。对于一个长度为 50 的句子有超过 10&lt;sup&gt;12&lt;/sup&gt;的解析,这只是 Piglet 句子长度的一半(1),这些句子小孩可以毫不费力的处理。没有实际的自然语言处理系统可以为一个句子构建数以百万计的树,并根据上下文选择一个合适的。很显然,人也不会这样做!
请注意,这个问题不是只在我们选择的例子中存在。[(Church & Patil, 1982)](./bibliography.html#church1982csa)指出`PP`附着句法歧义在像[(18)](./ch08.html#ex-pp)这样的句子中也是按 Catalan 数的比例增长。
......@@ -521,7 +521,7 @@ grammar = nltk.PCFG.fromstring("""
16. ◑ 挑选一些常用动词,完成以下任务:
1. 写一个程序在 PP 附着语料库`nltk.corpus.ppattach`找到那些动词。找出任何这样的情况,相同的动词有两种不同的附着,其中第一个是名词,或者第二个是名词,或者介词保持不变(正如我们在2句法歧义中讨论过的)。
1. 写一个程序在 PP 附着语料库`nltk.corpus.ppattach`找到那些动词。找出任何这样的情况,相同的动词有两种不同的附着,其中第一个是名词,或者第二个是名词,或者介词保持不变(正如我们在 2 句法歧义中讨论过的)。
2. 制定 CFG 语法产生式涵盖其中一些情况。
17. ◑ 写一个程序,比较自上而下的图表分析器与递归下降分析器的效率(4)。使用相同的语法和输入的句子。使用`timeit`模块比较它们的性能(见 4.7,如何做到这一点的一个例子)。
......
......@@ -12,7 +12,7 @@
## 1 语法特征
[chap-data-intensive](./ch06.html#chap-data-intensive)中,我们描述了如何建立基于检测文本特征的分类器。那些特征可能非常简单,如提取一个单词的最后一个字母,或者更复杂一点儿,如分类器自己预测的词性标签。在本章中,我们将探讨特征在建立基于规则的语法中的作用。对比特征提取,记录已经自动检测到的特征,我们现在要*声明*词和短语的特征。我们以一个很简单的例子开始,使用字典存储特征和它们的值。
第六章中,我们描述了如何建立基于检测文本特征的分类器。那些特征可能非常简单,如提取一个单词的最后一个字母,或者更复杂一点儿,如分类器自己预测的词性标签。在本章中,我们将探讨特征在建立基于规则的语法中的作用。对比特征提取,记录已经自动检测到的特征,我们现在要*声明*词和短语的特征。我们以一个很简单的例子开始,使用字典存储特征和它们的值。
```py
>>> kim = {'CAT': 'NP', 'ORTH': 'Kim', 'REF': 'k'}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册