提交 f7a9a18c 编写于 作者: W wizardforcel

2020-12-29 16:34:30

上级 8f6c038c
......@@ -855,7 +855,7 @@ d1: ['s0-r1', 's1-r0'] : ([z12,z15],[boy(z12), (([x],[dog(x)]) ->
3. 广义量词,如 most;
4. 内涵结构,例如像 may 和 believe 这样的动词。
(1)和(2)可以使用一阶逻辑处理,(3)和(4)需要不同的逻辑。下面的读物中很多都讲述了这些问题。
`(1)``(2)`可以使用一阶逻辑处理,`(3)``(4)`需要不同的逻辑。下面的读物中很多都讲述了这些问题。
建立自然语言前端数据库方面的结果和技术的综合概述可以在[(Androutsopoulos, Ritchie, & Thanisch, 1995)](./bibliography.html#androutsopoulos1995nli)中找到。
......
......@@ -221,7 +221,7 @@ f_out.write(bytes(s, 'UTF-8'))
已标注语言数据很少以最方便的格式保存,往往需要进行各种格式转换。字符编码之间的转换已经讨论过(见 3.3)。在这里,我们专注于数据结构。
最简单的情况,输入和输出格式是同构的。例如,我们可能要将词汇数据从 Toolbox 格式转换为 XML,可以直接一次一个的转换词条(4)。数据结构反映在所需的程序的结构中:一个`for`循环,每次循环处理一个词条。
最简单的情况,输入和输出格式是同构的。例如,我们可能要将词汇数据从 Toolbox 格式转换为 XML,可以直接一次一个的转换词条`(4)`。数据结构反映在所需的程序的结构中:一个`for`循环,每次循环处理一个词条。
另一种常见的情况,输出是输入的摘要形式,如一个倒置的文件索引。有必要在内存中建立索引结构(见 4.8),然后把它以所需的格式写入一个文件。下面的例子构造一个索引,映射字典定义的词汇到相应的每个词条❶的语意❷,已经对定义文本分词❸,并丢弃短词❹。一旦该索引建成,我们打开一个文件,然后遍历索引项,以所需的格式输出行❺。
......
......@@ -1125,7 +1125,7 @@ result = ['cat']
190
```
作为递归的最后一个例子,让我们用它来构建一个深嵌套的对象。一个字母查找树是一种可以用来索引词汇的数据结构,一次一个字母。(这个名字来自于单词`retrieval`)。例如,如果`trie`包含一个字母的查找树,那么`trie['c']`是一个较小的查找树,包含所有以`c`开头的词。4.9 演示了使用 Python 字典(3)构建查找树的递归过程。若要插入词`chien``dog`的法语),我们将`c`分类,递归的掺入`hien``trie['c']`子查找树中。递归继续直到词中没有剩余的字母,于是我们存储的了预期值(本例中是词`dog`)。
作为递归的最后一个例子,让我们用它来构建一个深嵌套的对象。一个字母查找树是一种可以用来索引词汇的数据结构,一次一个字母。(这个名字来自于单词`retrieval`)。例如,如果`trie`包含一个字母的查找树,那么`trie['c']`是一个较小的查找树,包含所有以`c`开头的词。4.9 演示了使用 Python 字典`(3)`构建查找树的递归过程。若要插入词`chien``dog`的法语),我们将`c`分类,递归的掺入`hien``trie['c']`子查找树中。递归继续直到词中没有剩余的字母,于是我们存储的了预期值(本例中是词`dog`)。
```py
def insert(trie, key, value):
......
......@@ -21,7 +21,7 @@
('completely', 'RB'), ('different', 'JJ')]
```
在这里我们看到 and 是`CC`,并列连词;now 和 completely 是`RB`,副词;for 是`IN`,介词;something 是`NN`,名词;different `JJ`,形容词。
在这里我们看到`and``CC`,并列连词;`now``completely``RB`,副词;`for``IN`,介词;`something``NN`,名词;`different``JJ`,形容词。
注意
......@@ -36,13 +36,13 @@ NLTK 为每个标记提供了文档,可以使用该标记来查询,如`nltk.
('to', 'TO'), ('obtain', 'VB'), ('the', 'DT'), ('refuse', 'NN'), ('permit', 'NN')]
```
请注意 refuse 和 permit 都以现在时动词(`VBP`)和名词(`NN`)形式出现。例如 refUSE 是一个动词,意为“拒绝”,而 REFuse 是一个名词,意为“垃圾”(即它们不是同音词)。因此,我们需要知道正在使用哪一个词以便能正确读出文本。(出于这个原因,文本转语音系统通常进行词性标注。)
请注意`refuse``permit`都以现在时动词(`VBP`)和名词(`NN`)形式出现。例如`refUSE`是一个动词,意为“拒绝”,而`REFuse`是一个名词,意为“垃圾”(即它们不是同音词)。因此,我们需要知道正在使用哪一个词以便能正确读出文本。(出于这个原因,文本转语音系统通常进行词性标注。)
注意
**轮到你来**:很多单词,如 ski 和 race,可以用作名词或动词而发音没有区别。你能想出其他的吗?提示:想想一个常见的东西,尝试把词 to 放到它前面,看它是否也是一个动词;或者想想一个动作,尝试把 the 放在它前面,看它是否也是一个名词。现在用这个词的两种用途造句,在这句话上运行词性标注器。
**轮到你来**:很多单词,如`ski``race`,可以用作名词或动词而发音没有区别。你能想出其他的吗?提示:想想一个常见的东西,尝试把词`to`放到它前面,看它是否也是一个动词;或者想想一个动作,尝试把`the`放在它前面,看它是否也是一个名词。现在用这个词的两种用途造句,在这句话上运行词性标注器。
词汇类别如“名词”和词性标记如`NN`,看上去似乎有其用途,但在细节上将使许多读者感到晦涩。你可能想知道要引进这种额外的信息的理由是什么。很多这些类别源于对文本中单词分布的粗略分析。考虑下面的分析,涉及 woman(名词),bought(动词),over(介词)和 the(限定词)。`text.similar()`方法接收一个单词 w,找出所有上下文 w[1]w w[2],然后找出所有出现在相同上下文中的词 w',即 w[1]w'w[2]
词汇类别如“名词”和词性标记如`NN`,看上去似乎有其用途,但在细节上将使许多读者感到晦涩。你可能想知道要引进这种额外的信息的理由是什么。很多这些类别源于对文本中单词分布的粗略分析。考虑下面的分析,涉及`woman`(名词),`bought`(动词),`over`(介词)和`the`(限定词)。`text.similar()`方法接收一个单词`w`,找出所有上下文`w[1]w w[2]`,然后找出所有出现在相同上下文中的词`w'`,即`w[1]w'w[2]`
```py
>>> text = nltk.Text(word.lower() for word in nltk.corpus.brown.words())
......@@ -61,9 +61,9 @@ a his this their its her an that our any all one these my in your no
some other and
```
可以观察到,搜索 woman 找到名词;搜索 bought 找到的大部分是动词;搜索 over 一般会找到介词;搜索 the 找到几个限定词。一个标注器能够正确识别一个句子的上下文中的这些词的标记,例如 The woman bought over $150,000 worth of clothes
可以观察到,搜索`woman`找到名词;搜索`bought`找到的大部分是动词;搜索`over`一般会找到介词;搜索`the`找到几个限定词。一个标注器能够正确识别一个句子的上下文中的这些词的标记,例如`The woman bought over $150,000 worth of clothes`
一个标注器还可以为我们对未知词的认识建模,例如我们可以根据词根 scrobble 猜测 scrobbling 可能是一个动词,并有可能发生在 he was scrobbling 这样的上下文中。
一个标注器还可以为我们对未知词的认识建模,例如我们可以根据词根`scrobble`猜测`scrobbling`可能是一个动词,并有可能发生在`he was scrobbling`这样的上下文中。
## 2 已经标注的语料库
......@@ -181,7 +181,7 @@ NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语
## 2.4 名词
名词一般指的是人、地点、事情或概念,例如: woman, Scotland, book, intelligence。名词可能出现在限定词和形容词之后,可以是动词的主语或宾语,如 2.2 所示。
名词一般指的是人、地点、事情或概念,例如: `woman, Scotland, book, intelligence`。名词可能出现在限定词和形容词之后,可以是动词的主语或宾语,如 2.2 所示。
表 2.2:
......@@ -199,7 +199,7 @@ NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语
## 2.5 动词
动词是用来描述事件和行动的词,例如 2.3 中的 fall, eat。在一个句子中,动词通常表示涉及一个或多个名词短语所指示物的关系。
动词是用来描述事件和行动的词,例如 2.3 中的`fall, eat`。在一个句子中,动词通常表示涉及一个或多个名词短语所指示物的关系。
表 2.3:
......@@ -249,7 +249,7 @@ NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语
[('head', 'NN'), ('of', 'IN'), ('state', 'NN'), ('has', 'VBZ'), ('kicked', 'VBN')]
```
在这种情况下,我们可以看到过去分词 kicked 前面是助动词 have 的形式。这是普遍真实的吗?
在这种情况下,我们可以看到过去分词`kicked`前面是助动词`have`的形式。这是普遍真实的吗?
注意
......@@ -257,17 +257,17 @@ NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语
## 2.6 形容词和副词
另外两个重要的词类是形容词和副词。形容词修饰名词,可以作为修饰语(如 the large pizza 中的 large),或者谓语(如 the pizza is large)。英语形容词可以有内部结构(如 the falling stocks 中的 fall+ing)。副词修饰动词,指定动词描述的事件的时间、方式、地点或方向(如 the stocks fell quickly 中的 quickly)。副词也可以修饰的形容词(如 Mary's teacher was really nice 中的 really)。
另外两个重要的词类是形容词和副词。形容词修饰名词,可以作为修饰语(如`the large pizza`中的`large`),或者谓语(如`the pizza is large`)。英语形容词可以有内部结构(如`the falling stocks`中的`fall+ing`)。副词修饰动词,指定动词描述的事件的时间、方式、地点或方向(如`the stocks fell quickly`中的`quickly`)。副词也可以修饰的形容词(如`Mary's teacher was really nice`中的`really`)。
英语中还有几个封闭的词类,如介词,冠词(也常称为限定词)(如 the、a),情态动词(如 should、may)和人称代词(如 she、they)。每个词典和语法对这些词的分类都不同。
英语中还有几个封闭的词类,如介词,冠词(也常称为限定词)(如`the, a`),情态动词(如`should, may`)和人称代词(如`she, they`)。每个词典和语法对这些词的分类都不同。
注意
**轮到你来**:如果你对这些词性中的一些不确定,使用`nltk.app.concordance()`学习它们,或*Schoolhouse Rock!* 语法视频于 YouTube,或者查询本章结束的进一步阅读一节。
**轮到你来**:如果你对这些词性中的一些不确定,使用`nltk.app.concordance()`学习它们,或在 YouTube 看《Schoolhouse Rock!》语法视频,或者查询本章结束的进一步阅读一节。
## 2.7 未简化的标记
让我们找出每个名词类型中最频繁的名词。2.2 中的程序找出所有以`NN`开始的标记,并为每个标记提供了几个示例单词。你会看到有许多`NN`的变种;最重要有`此外,大多数的标记都有后缀修饰符:`-NC`表示引用,`-HL`表示标题中的词,`-TL`表示标题(布朗标记的特征)。
让我们找出每个名词类型中最频繁的名词。2.2 中的程序找出所有以`NN`开始的标记,并为每个标记提供了几个示例单词。你会看到有许多`NN`的变种;此外,大多数的标记都有后缀修饰符:`-NC`表示引用,`-HL`表示标题中的词,`-TL`表示标题(布朗标记的特征)。
```py
def findtags(tag_prefix, tagged_text):
......@@ -302,7 +302,7 @@ NNS-TL-HL [('Nations', 1)]
让我们简要地回过来探索语料库,我们在前面的章节中看到过,这次我们探索词性标记。
假设我们正在研究词 often,想看看它是如何在文本中使用的。我们可以试着看看跟在 often 后面的词汇
假设我们正在研究词`often`,想看看它是如何在文本中使用的。我们可以试着看看跟在`often`后面的词汇
```py
>>> brown_learned_text = brown.words(categories='learned')
......@@ -322,9 +322,9 @@ NNS-TL-HL [('Nations', 1)]
2 8 7 4 37 6
```
请注意 often 后面最高频率的词性是动词。名词从来没有在这个位置出现(在这个特别的语料中)。
请注意`often`后面最高频率的词性是动词。名词从来没有在这个位置出现(在这个特别的语料中)。
接下来,让我们看一些较大范围的上下文,找出涉及特定标记和词序列的词(在这种情况下,`"<Verb> to <Verb>"`)。在 code-three-word-phrase 中,我们考虑句子中的每个三词窗口❶,检查它们是否符合我们的标准❷。如果标记匹配,我们输出对应的词❸。
接下来,让我们看一些较大范围的上下文,找出涉及特定标记和词序列的词(在这种情况下,`"<Verb> to <Verb>"`)。在`code-three-word-phrase`中,我们考虑句子中的每个三词窗口❶,检查它们是否符合我们的标准❷。如果标记匹配,我们输出对应的词❸。
```py
from nltk.corpus import brown
......@@ -393,7 +393,7 @@ that CNJ V WH DET
图 3.1:列表查找:一个整数索引帮助我们访问 Python 列表的内容。
对比这种情况与频率分布(3),在那里我们指定一个词然后取回一个数字,如`fdist['monstrous']`,它告诉我们一个给定的词在文本中出现的次数。用词查询对任何使用过字典的人都很熟悉。3.2 展示一些更多的例子。
对比这种情况与频率分布`(3)`,在那里我们指定一个词然后取回一个数字,如`fdist['monstrous']`,它告诉我们一个给定的词在文本中出现的次数。用词查询对任何使用过字典的人都很熟悉。3.2 展示一些更多的例子。
![Images/maps02.png](Images/484180fc6abc244116b30e57cb6c0cf5.jpg)
......@@ -839,7 +839,7 @@ Python 字典方法:常用的方法与字典相关习惯用法的总结。
('of', 'IN'), ('this', 'DT'), ('city', None), ("''", "''"), ('.', '.')]
```
许多词都被分配了一个`None`标签,因为它们不在 100 个最频繁的词之中。在这些情况下,我们想分配默认标记`NN`。换句话说,我们要先使用查找表,如果它不能指定一个标记就使用默认标注器,这个过程叫做回退(5)。我们可以做到这个,通过指定一个标注器作为另一个标注器的参数,如下所示。现在查找标注器将只存储名词以外的词的词-标记对,只要它不能给一个词分配标记,它将会调用默认标注器。
许多词都被分配了一个`None`标签,因为它们不在 100 个最频繁的词之中。在这些情况下,我们想分配默认标记`NN`。换句话说,我们要先使用查找表,如果它不能指定一个标记就使用默认标注器,这个过程叫做回退`(5)`。我们可以做到这个,通过指定一个标注器作为另一个标注器的参数,如下所示。现在查找标注器将只存储名词以外的词的词-标记对,只要它不能给一个词分配标记,它将会调用默认标注器。
```py
>>> baseline_tagger = nltk.UnigramTagger(model=likely_tags,
......@@ -890,7 +890,7 @@ def display():
## 5.1 一元标注
一元标注器基于一个简单的统计算法:对每个标识符分配这个独特的标识符最有可能的标记。例如,它将分配标记`JJ`给词 frequent 的所有出现,因为 frequent 用作一个形容词(例如 a frequent word)比用作一个动词(例如 I frequent this cafe)更常见。一个一元标注器的行为就像一个查找标注器(4),除了有一个更方便的建立它的技术,称为训练。在下面的代码例子中,我们训练一个一元标注器,用它来标注一个句子,然后评估:
一元标注器基于一个简单的统计算法:对每个标识符分配这个独特的标识符最有可能的标记。例如,它将分配标记`JJ`给词 frequent 的所有出现,因为 frequent 用作一个形容词(例如 a frequent word)比用作一个动词(例如 I frequent this cafe)更常见。一个一元标注器的行为就像一个查找标注器`(4)`,除了有一个更方便的建立它的技术,称为训练。在下面的代码例子中,我们训练一个一元标注器,用它来标注一个句子,然后评估:
```py
>>> from nltk.corpus import brown
......
# 6\. 学习分类文本
模式识别是自然语言处理的一个核心部分。以-ed 结尾的词往往是过去时态动词([5.](./ch05.html#chap-tag))。频繁使用 will 是新闻文本的暗示(3)。这些可观察到的模式——词的结构和词频——恰好与特定方面的含义关联,如时态和主题。但我们怎么知道从哪里开始寻找,形式的哪一方面关联含义的哪一方面?
模式识别是自然语言处理的一个核心部分。以-ed 结尾的词往往是过去时态动词([5.](./ch05.html#chap-tag))。频繁使用 will 是新闻文本的暗示`(3)`。这些可观察到的模式——词的结构和词频——恰好与特定方面的含义关联,如时态和主题。但我们怎么知道从哪里开始寻找,形式的哪一方面关联含义的哪一方面?
本章的目的是要回答下列问题:
......
......@@ -268,7 +268,7 @@ ChunkParse score:
F-Measure: 69.2%
```
正如你看到的,这种方法达到相当好的结果。但是,我们可以采用更多数据驱动的方法改善它,在这里我们使用训练语料找到对每个词性标记最有可能的块标记(`I`, `O`或`B`)。换句话说,我们可以使用*一元标注器*(4)建立一个词块划分器。但不是尝试确定每个词的正确的词性标记,而是根据每个词的词性标记,尝试确定正确的词块标记。
正如你看到的,这种方法达到相当好的结果。但是,我们可以采用更多数据驱动的方法改善它,在这里我们使用训练语料找到对每个词性标记最有可能的块标记(`I`, `O`或`B`)。换句话说,我们可以使用*一元标注器*`(4)`建立一个词块划分器。但不是尝试确定每个词的正确的词性标记,而是根据每个词的词性标记,尝试确定正确的词块标记。
在 3.1 中,我们定义了`UnigramChunker`类,使用一元标注器给句子加词块标记。这个类的大部分代码只是用来在 NLTK 的`ChunkParserI`接口使用的词块树表示和嵌入式标注器使用的 IOB 表示之间镜像转换。类定义了两个方法:一个构造函数❶,当我们建立一个新的 UnigramChunker 时调用;以及`parse`方法❸,用来给新句子划分词块。
......
......@@ -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; ….(这是卡塔兰数,我们在 4 的练习中见过)。最后一个是句子长度为 23 的分析树的数目,这是宾州树库 WSJ 部分的句子的平均长度。对于一个长度为 50 的句子有超过 10<sup>12</sup>的解析,这只是 Piglet 句子长度的一半(1),这些句子小孩可以毫不费力的处理。没有实际的自然语言处理系统可以为一个句子构建数以百万计的树,并根据上下文选择一个合适的。很显然,人也不会这样做!
随着句子长度增加到(3,5,7,...),我们得到的分析树的数量是:1; 2; 5; 14; 42; 132; 429; 1,430; 4,862; 16,796; 58,786; 208,012; ….(这是卡塔兰数,我们在 4 的练习中见过)。最后一个是句子长度为 23 的分析树的数目,这是宾州树库 WSJ 部分的句子的平均长度。对于一个长度为 50 的句子有超过 10<sup>12</sup>的解析,这只是 Piglet 句子长度的一半`(1)`,这些句子小孩可以毫不费力的处理。没有实际的自然语言处理系统可以为一个句子构建数以百万计的树,并根据上下文选择一个合适的。很显然,人也不会这样做!
请注意,这个问题不是只在我们选择的例子中存在。[(Church & Patil, 1982)](./bibliography.html#church1982csa)指出`PP`附着句法歧义在像[(18)](./ch08.html#ex-pp)这样的句子中也是按卡塔兰数的比例增长。
......@@ -523,7 +523,7 @@ grammar = nltk.PCFG.fromstring("""
1. 写一个程序在 PP 附着语料库`nltk.corpus.ppattach`找到那些动词。找出任何这样的情况,相同的动词有两种不同的附着,其中第一个是名词,或者第二个是名词,或者介词保持不变(正如我们在 2 句法歧义中讨论过的)。
2. 制定 CFG 语法产生式涵盖其中一些情况。
17. ◑ 写一个程序,比较自上而下的图表分析器与递归下降分析器的效率(4)。使用相同的语法和输入的句子。使用`timeit`模块比较它们的性能(见 4.7,如何做到这一点的一个例子)。
17. ◑ 写一个程序,比较自上而下的图表分析器与递归下降分析器的效率`(4)`。使用相同的语法和输入的句子。使用`timeit`模块比较它们的性能(见 4.7,如何做到这一点的一个例子)。
18. 比较自上而下、自下而上和左角落分析器的性能,使用相同的语法和 3 个符合语法的测试句子。使用`timeit`记录每个分析器在同一个句子上花费的时间。写一个函数,在这三句话上运行这三个分析器,输出 3×3 格的时间,以及行和列的总计。讨论你的发现。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册