From 10b3bb18bffdacee10266b0673bb755236a5d25f Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Tue, 29 Dec 2020 16:38:34 +0800 Subject: [PATCH] 2020-12-29 16:38:34 --- 5.md | 44 ++++++++++++++++++++++---------------------- 7.md | 12 ++++++------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/5.md b/5.md index e03ea43..1b62adc 100644 --- a/5.md +++ b/5.md @@ -6,7 +6,7 @@ 2. 一个好的存储词汇和它们的分类的 Python 数据结构是什么? 3. 我们如何自动标注文本中词汇的词类? -一路上,我们将介绍 NLP 的一些基本技术,包括序列标注、N-gram 模型、回退和评估。这些技术在许多方面都很有用,标注为我们提供了一个表示它们的简单的上下文。我们还将看到,在典型的 NLP 处理流程中,标注为何是位于分词之后的第二个步骤。 +一路上,我们将介绍 NLP 的一些基本技术,包括序列标注、N 元模型、回退和评估。这些技术在许多方面都很有用,标注为我们提供了一个表示它们的简单的上下文。我们还将看到,在典型的 NLP 处理流程中,标注为何是位于分词之后的第二个步骤。 将单词按它们的词性分类并进行相应地标注的过程,称为词语性质标注、词性标注或简称标注。词性也称为词类或词汇类别。用于特定任务的标记的集合被称为一个标记集。我们在本章的重点是运用标记和自动标注文本。 @@ -419,7 +419,7 @@ that CNJ V WH DET {'furiously': 'ADV', 'ideas': 'N', 'colorless': 'ADJ', 'sleep': 'V'} ``` -所以,例如,❶说的是 colorless 的词性是形容词,或者更具体地说:在字典`pos`中,键`'colorless'`被分配了值`'ADJ'`。当我们检查`pos`的值时❷,我们看到一个键-值对的集合。一旦我们以这样的方式填充了字典,就可以使用键来检索值: +所以,例如,❶说的是`colorless`的词性是形容词,或者更具体地说:在字典`pos`中,键`'colorless'`被分配了值`'ADJ'`。当我们检查`pos`的值时❷,我们看到一个键-值对的集合。一旦我们以这样的方式填充了字典,就可以使用键来检索值: ```py >>> pos['ideas'] @@ -484,7 +484,7 @@ ideas: N sleep: V ``` -我们要确保当我们在字典中查找某词时,一个键只得到一个值。现在假设我们试图用字典来存储可同时作为动词和名词的词 sleep: +我们要确保当我们在字典中查找某词时,一个键只得到一个值。现在假设我们试图用字典来存储可同时作为动词和名词的词`sleep`: ```py >>> pos['sleep'] = 'V' @@ -562,7 +562,7 @@ TypeError: list objects are unhashable 让我们来看看默认字典如何被应用在较大规模的语言处理任务中。许多语言处理任务——包括标注——费很大力气来正确处理文本中只出现过一次的词。如果有一个固定的词汇和没有新词会出现的保证,它们会有更好的表现。在一个默认字典的帮助下,我们可以预处理一个文本,替换低频词汇为一个特殊的“超出词汇表”词符`UNK`。(你能不看下面的想出如何做吗?) -我们需要创建一个默认字典,映射每个词为它们的替换词。最频繁的 n 个词将被映射到它们自己。其他的被映射到`UNK`。 +我们需要创建一个默认字典,映射每个词为它们的替换词。最频繁的`n`个词将被映射到它们自己。其他的被映射到`UNK`。 ```py >>> alice = nltk.corpus.gutenberg.words('carroll-alice.txt') @@ -610,7 +610,7 @@ TypeError: list objects are unhashable ['NOUN', 'VERB', 'ADP', '.', 'DET', 'ADJ', 'ADV', 'CONJ', 'PRON', 'PRT', 'NUM', 'X'] ``` -3.3 中的列表演示了一个重要的按值排序一个字典的习惯用法,来按频率递减顺序显示词汇。`sorted()`的第一个参数是要排序的项目,它是由一个词性标记和一个频率组成的元组的列表。第二个参数使用函数`itemgetter()`指定排序的键。在一般情况下,`itemgetter(n)`返回一个函数,这个函数可以在一些其他序列对象上被调用获得这个序列的第 n 个元素,例如: +3.3 中的列表演示了一个重要的按值排序一个字典的习惯用法,来按频率递减顺序显示词汇。`sorted()`的第一个参数是要排序的项目,它是由一个词性标记和一个频率组成的元组的列表。第二个参数使用函数`itemgetter()`指定排序的键。在一般情况下,`itemgetter(n)`返回一个函数,这个函数可以在一些其他序列对象上被调用获得这个序列的第`n`个元素,例如: ```py >>> pair = ('NP', 8336) @@ -684,7 +684,7 @@ TypeError: list objects are unhashable defaultdict(, {'ADJ': 11, 'NOUN': 5}) ``` -这个例子使用一个字典,它的条目的默认值也是一个字典(其默认值是`int()`,即 0)。请注意我们如何遍历已标注语料库的双连词,每次遍历处理一个词-标记对❶。每次通过循环时,我们更新字典`pos`中的条目`(t1, w2)`,一个标记和它*后面*的词❷。当我们在`pos`中查找一个项目时,我们必须指定一个复合键❸,然后得到一个字典对象。一个词性标注器可以使用这些信息来决定词 right,前面是一个限定词时,应标注为`ADJ`。 +这个例子使用一个字典,它的条目的默认值也是一个字典(其默认值是`int()`,即 0)。请注意我们如何遍历已标注语料库的双连词,每次遍历处理一个词-标记对❶。每次通过循环时,我们更新字典`pos`中的条目`(t1, w2)`,一个标记和它*后面*的词❷。当我们在`pos`中查找一个项目时,我们必须指定一个复合键❸,然后得到一个字典对象。一个词性标注器可以使用这些信息来决定词`right`,前面是一个限定词时,应标注为`ADJ`。 ## 3.7 反转字典 @@ -775,7 +775,7 @@ Python 字典方法:常用的方法与字典相关习惯用法的总结。 ## 4.2 正则表达式标注器 -正则表达式标注器基于匹配模式分配标记给词符。例如,我们可能会猜测任一以 ed 结尾的词都是动词过去分词,任一以's 结尾的词都是名词所有格。可以用一个正则表达式的列表表示这些: +正则表达式标注器基于匹配模式分配标记给词符。例如,我们可能会猜测任一以`ed`结尾的词都是动词过去分词,任一以`'s`结尾的词都是名词所有格。可以用一个正则表达式的列表表示这些: ```py >>> patterns = [ @@ -886,7 +886,7 @@ def display(): 开发一个已标注语料库是一个重大的任务。除了数据,它会产生复杂的工具、文档和实践,为确保高品质的标注。标记集和其他编码方案不可避免地依赖于一些理论主张,不是所有的理论主张都被共享,然而,语料库的创作者往往竭尽全力使他们的工作尽可能理论中立,以最大限度地提高其工作的有效性。我们将在[11.](./ch11.html#chap-data)讨论创建一个语料库的挑战。 -## 5 N-gram 标注 +## 5 N 元标注 ## 5.1 一元标注 @@ -926,11 +926,11 @@ def display(): 虽然得分更糟糕了,但是现在我们对这种标注器的用处有了更好的了解,如它在之前没有遇见的文本上的表现。 -## 5.3 一般的 N-gram 标注 +## 5.3 一般的 N 元标注 在基于一元处理一个语言处理任务时,我们使用上下文中的一个项目。标注的时候,我们只考虑当前的词符,与更大的上下文隔离。给定一个模型,我们能做的最好的是为每个词标注其*先验的*最可能的标记。这意味着我们将使用相同的标记标注一个词,如 wind,不论它出现的上下文是 the wind 还是 to wind。 -一个 n-gram tagger 标注器是一个一元标注器的一般化,它的上下文是当前词和它前面 *n*-1 个标识符的词性标记,如图 5.1 所示。要选择的标记是圆圈里的 *t*<sub>n</sub>,灰色阴影的是上下文。在 5.1 所示的 n-gram 标注器的例子中,我们让 *n*=3;也就是说,我们考虑当前词的前两个词的标记。一个 n-gram 标注器挑选在给定的上下文中最有可能的标记。 +一个 N 元标注器是一个一元标注器的一般化,它的上下文是当前词和它前面 *n*-1 个标识符的词性标记,如图 5.1 所示。要选择的标记是圆圈里的 *t*<sub>n</sub>,灰色阴影的是上下文。在 5.1 所示的 N 元标注器的例子中,我们让 *n*=3;也就是说,我们考虑当前词的前两个词的标记。一个 N 元标注器挑选在给定的上下文中最有可能的标记。 ![Images/tag-context.png](Images/12573c3a9015654728fe798e170a3c50.jpg) @@ -940,7 +940,7 @@ def display(): 1-gram 标注器是一元标注器另一个名称:即用于标注一个词符的上下文的只是词符本身。2-gram 标注器也称为*二元标注器*,3-gram 标注器也称为*三元标注器*。 -`NgramTagger`类使用一个已标注的训练语料库来确定对每个上下文哪个词性标记最有可能。这里我们看 n-gram 标注器的一个特殊情况,二元标注器。首先,我们训练它,然后用它来标注未标注的句子: +`NgramTagger`类使用一个已标注的训练语料库来确定对每个上下文哪个词性标记最有可能。这里我们看 N 元标注器的一个特殊情况,二元标注器。首先,我们训练它,然后用它来标注未标注的句子: ```py >>> bigram_tagger = nltk.BigramTagger(train_sents) @@ -971,7 +971,7 @@ def display(): 小心! -N-gram 标注器不应考虑跨越句子边界的上下文。因此,NLTK 的标注器被设计用于句子列表,其中一个句子是一个词列表。在一个句子的开始,_t_<sub>n-1</sub>和前面的标记被设置为`None`。 +N 元标注器不应考虑跨越句子边界的上下文。因此,NLTK 的标注器被设计用于句子列表,其中一个句子是一个词列表。在一个句子的开始,_t_<sub>n-1</sub>和前面的标记被设置为`None`。 ## 5.4 组合标注器 @@ -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 元标注器会检测它的一些其他标记中的上下文。例如,如果前面的词是 to(标注为`TO`),那么 UNK 可能会被标注为一个动词。 ## 5.6 存储标注器 @@ -1038,7 +1038,7 @@ N-gram 标注器不应考虑跨越句子边界的上下文。因此,NLTK 的 ## 5.7 准确性的极限 -一个 n-gram 标注器准确性的上限是什么?考虑一个三元标注器的情况。它遇到多少词性歧义的情况?我们可以根据经验决定这个问题的答案: +一个 N 元标注器准确性的上限是什么?考虑一个三元标注器的情况。它遇到多少词性歧义的情况?我们可以根据经验决定这个问题的答案: ```py >>> cfd = nltk.ConditionalFreqDist( @@ -1065,17 +1065,17 @@ N-gram 标注器不应考虑跨越句子边界的上下文。因此,NLTK 的 分析标注器准确性界限的另一种方式来自人类标注者之间并非 100% 的意见一致。[更多] -一般情况下,标注过程会损坏区别:例如当所有的人称代词被标注为`PRP`时,词的特性通常会失去。与此同时,标注过程引入了新的区别从而去除了含糊之处:例如 deal 标注为`VB`或`NN`。这种消除某些区别并引入新的区别的特点是标注的一个重要的特征,有利于分类和预测。当我们引入一个标记集的更细的划分时,在 n-gram 标注器决定什么样的标记分配给一个特定的词时,可以获得关于左侧上下文的更详细的信息。然而,标注器同时也将需要做更多的工作来划分当前的词符,只是因为有更多可供选择的标记。相反,使用较少的区别(如简化的标记集),标注器有关上下文的信息会减少,为当前词符分类的选择范围也较小。 +一般情况下,标注过程会损坏区别:例如当所有的人称代词被标注为`PRP`时,词的特性通常会失去。与此同时,标注过程引入了新的区别从而去除了含糊之处:例如 deal 标注为`VB`或`NN`。这种消除某些区别并引入新的区别的特点是标注的一个重要的特征,有利于分类和预测。当我们引入一个标记集的更细的划分时,在 N 元标注器决定什么样的标记分配给一个特定的词时,可以获得关于左侧上下文的更详细的信息。然而,标注器同时也将需要做更多的工作来划分当前的词符,只是因为有更多可供选择的标记。相反,使用较少的区别(如简化的标记集),标注器有关上下文的信息会减少,为当前词符分类的选择范围也较小。 我们已经看到,训练数据中的歧义导致标注器准确性的上限。有时更多的上下文能解决这些歧义。然而,在其他情况下,如[(Church, Young, & Bloothooft, 1996)](./bibliography.html#abney1996pst)中指出的,只有参考语法或现实世界的知识,才能解决歧义。尽管有这些缺陷,词性标注在用统计方法进行自然语言处理的兴起过程中起到了核心作用。1990 年代初,统计标注器令人惊讶的精度是一个惊人的示范,可以不用更深的语言学知识解决一小部分语言理解问题,即词性消歧。这个想法能再推进吗?第[7.](./ch07.html#chap-chunk)中,我们将看到,它可以。 ## 6 基于转换的标注 -n-gram 标注器的一个潜在的问题是它们的 n-gram 表(或语言模型)的大小。如果使用各种语言技术的标注器部署在移动计算设备上,在模型大小和标注器准确性之间取得平衡是很重要的。使用回退标注器的 n-gram 标注器可能存储 trigram 和 bigram 表,这是很大的稀疏阵列,可能有数亿条条目。 +N 元标注器的一个潜在的问题是它们的 N 元表(或语言模型)的大小。如果使用各种语言技术的标注器部署在移动计算设备上,在模型大小和标注器准确性之间取得平衡是很重要的。使用回退标注器的 N 元标注器可能存储 trigram 和 bigram 表,这是很大的稀疏阵列,可能有数亿条条目。 -第二个问题是关于上下文。n-gram 标注器从前面的上下文中获得的唯一的信息是标记,虽然词本身可能是一个有用的信息源。n-gram 模型使用上下文中的词的其他特征为条件是不切实际的。在本节中,我们考察 Brill 标注,一种归纳标注方法,它的性能很好,使用的模型只有 n-gram 标注器的很小一部分。 +第二个问题是关于上下文。N 元标注器从前面的上下文中获得的唯一的信息是标记,虽然词本身可能是一个有用的信息源。N 元模型使用上下文中的词的其他特征为条件是不切实际的。在本节中,我们考察 Brill 标注,一种归纳标注方法,它的性能很好,使用的模型只有 N 元标注器的很小一部分。 -Brill 标注是一种*基于转换的学习*,以它的发明者命名。一般的想法很简单:猜每个词的标记,然后返回和修复错误。在这种方式中,Brill 标注器陆续将一个不良标注的文本转换成一个更好的。与 n-gram 标注一样,这是有*监督的学习*方法,因为我们需要已标注的训练数据来评估标注器的猜测是否是一个错误。然而,不像 n-gram 标注,它不计数观察结果,只编制一个转换修正规则列表。 +Brill 标注是一种*基于转换的学习*,以它的发明者命名。一般的想法很简单:猜每个词的标记,然后返回和修复错误。在这种方式中,Brill 标注器陆续将一个不良标注的文本转换成一个更好的。与 N 元标注一样,这是有*监督的学习*方法,因为我们需要已标注的训练数据来评估标注器的猜测是否是一个错误。然而,不像 N 元标注,它不计数观察结果,只编制一个转换修正规则列表。 Brill 标注的的过程通常是与绘画类比来解释的。假设我们要画一棵树,包括大树枝、树枝、小枝、叶子和一个统一的天蓝色背景的所有细节。不是先画树然后尝试在空白处画蓝色,而是简单的将整个画布画成蓝色,然后通过在蓝色背景上上色“修正”树的部分。以同样的方式,我们可能会画一个统一的褐色的树干再回过头来用更精细的刷子画进一步的细节。Brill 标注使用了同样的想法:以大笔画开始,然后修复细节,一点点的细致的改变。让我们看看下面的例子: @@ -1183,7 +1183,7 @@ Statement User121 18/m pm me if u tryin to chat 21. ◑ 在 3.1 中我们看到动词 adore, love, like, prefer 及前面的限定符 absolutely 和 definitely 的频率计数的表格。探讨这四个动词前出现的所有限定符。 22. ◑ 我们定义可以用来做生词的回退标注器的`regexp_tagger`。这个标注器只检查基数词。通过特定的前缀或后缀字符串进行测试,它应该能够猜测其他标记。例如,我们可以标注所有-s 结尾的词为复数名词。定义一个正则表达式标注器(使用`RegexpTagger()`),测试至少 5 个单词拼写的其他模式。(使用内联文档解释规则。) 23. ◑ 考虑上一练习中开发的正则表达式标注器。使用它的`accuracy()`方法评估标注器,尝试想办法提高其性能。讨论你的发现。客观的评估如何帮助开发过程? -24. ◑ 数据稀疏问题有多严重?调查 n-gram 标注器当 n 从 1 增加到 6 时的准确性。为准确性得分制表。估计这些标注器需要的训练数据,假设词汇量大小为 10<sup>5</sup>而标记集的大小为 10<sup>2</sup>。 +24. ◑ 数据稀疏问题有多严重?调查 N 元标注器当 n 从 1 增加到 6 时的准确性。为准确性得分制表。估计这些标注器需要的训练数据,假设词汇量大小为 10<sup>5</sup>而标记集的大小为 10<sup>2</sup>。 25. ◑ 获取另一种语言的一些已标注数据,在其上测试和评估各种标注器。如果这种语言是形态复杂的,或者有词类的任何字形线索(如),可以考虑为它开发一个正则表达式标注器(排在一元标注器之后,默认标注器之前)。对比同样的运行在英文数据上的标注器,你的标注器的准确性如何?讨论你在运用这些方法到这种语言时遇到的问题。 26. ◑ 4.1 绘制曲线显示查找标注器的性能随模型的大小增加的变化。绘制当训练数据量变化时一元标注器的性能曲线。 27. ◑ 检查 5 中定义的二元标注器`t2`的混淆矩阵,确定简化的一套或多套标记。定义字典做映射,在简化的数据上评估标注器。 @@ -1197,7 +1197,7 @@ Statement User121 18/m pm me if u tryin to chat 1. 打印一个表格,一列中是整数 1..10,另一列是语料库中有 1..10 个不同标记的不同词的数目。 2. 对有不同的标记数量最多的词,输出语料库中包含这个词的句子,每个可能的标记一个。 35. ★ 写一个程序,按照词 must 后面的词的标记为它的上下文分类。这样可以区分 must 的“必须”和“应该”两种词意上的用法吗? -36. ★ 创建一个正则表达式标注器和各种一元以及 n-gram 标注器,包括回退,在布朗语料库上训练它们。 +36. ★ 创建一个正则表达式标注器和各种一元以及 N 元标注器,包括回退,在布朗语料库上训练它们。 1. 创建这些标注器的 3 种不同组合。测试每个组合标注器的准确性。哪种组合效果最好? 2. 尝试改变训练语料的规模。它是如何影响你的结果的? 37. ★ 我们标注生词的方法一直要考虑这个词的字母(使用`RegexpTagger()`),或完全忽略这个词,将它标注为一个名词(使用`nltk.DefaultTagger()`)。这些方法对于有新词却不是名词的文本不会很好。思考句子 I like to blog on Kim's blog。如果 blog 是一个新词,那么查看前面的标记(`TO`和`NP 即我们需要一个对前面的标记敏感的默认标注器。 @@ -1205,9 +1205,9 @@ Statement User121 18/m pm me if u tryin to chat 2. 将这个标注器加入到回退标注器序列(包括普通的三元和二元标注器),放在常用默认标注器的前面。 3. 评价这个新的一元标注器的贡献。 38. ★ 思考 5 中的代码,它确定一个三元标注器的准确性上限。回顾 Abney 的关于精确标注的不可能性的讨论[(Church, Young, & Bloothooft, 1996)](./bibliography.html#abney1996pst)。解释为什么正确标注这些例子需要获取词和标记以外的其他种类的信息。你如何估计这个问题的规模? -39. ★ 使用`nltk.probability`中的一些估计技术,例如 *Lidstone* 或 *Laplace* 估计,开发一种统计标注器,它在训练中没有遇到而测试中遇到的上下文中表现优于 n-gram 回退标注器。 +39. ★ 使用`nltk.probability`中的一些估计技术,例如 *Lidstone* 或 *Laplace* 估计,开发一种统计标注器,它在训练中没有遇到而测试中遇到的上下文中表现优于 N 元回退标注器。 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))。 +41. ★ 开发一个 N 元回退标注器,允许在标注器初始化时指定“anti-n-grams”,如`["the", "the"]`。一个 anti-n-grams 被分配一个数字 0,被用来防止这个 N 元回退(如避免估计 P(the | the)而只做 P(the))。 42. ★ 使用布朗语料库开发标注器时,调查三种不同的方式来定义训练和测试数据之间的分割:genre (`category`)、source (`fileid`)和句子。比较它们的相对性能,并讨论哪种方法最合理。(你可能要使用 n-交叉验证,在 3 中讨论的,以提高评估的准确性。) 43. ★ 开发你自己的`NgramTagger`,从 NLTK 中的类继承,封装本章中所述的已标注的训练和测试数据的词汇表缩减方法。确保一元和默认回退标注器有机会获得全部词汇。 diff --git a/7.md b/7.md index 07c4857..bbdc9e9 100644 --- a/7.md +++ b/7.md @@ -54,7 +54,7 @@ 图 2.1:词符和词块级别的分割与标注 -在本节中,我们将在较深的层面探讨词块划分,以词块的定义和表示开始。我们将看到正则表达式和 N-gram 的方法来词块划分,使用 CoNLL-2000 词块划分语料库开发和评估词块划分器。我们将在[(5)](./ch07.html#sec-ner)和 6 回到命名实体识别和关系抽取的任务。 +在本节中,我们将在较深的层面探讨词块划分,以词块的定义和表示开始。我们将看到正则表达式和 N 元的方法来词块划分,使用 CoNLL-2000 词块划分语料库开发和评估词块划分器。我们将在[(5)](./ch07.html#sec-ner)和 6 回到命名实体识别和关系抽取的任务。 ## 2.1 名词短语词块划分 @@ -340,7 +340,7 @@ ChunkParse score: ## 3.3 训练基于分类器的词块划分器 -无论是基于正则表达式的词块划分器还是 n-gram 词块划分器,决定创建什么词块完全基于词性标记。然而,有时词性标记不足以确定一个句子应如何划分词块。例如,考虑下面的两个语句: +无论是基于正则表达式的词块划分器还是 N 元词块划分器,决定创建什么词块完全基于词性标记。然而,有时词性标记不足以确定一个句子应如何划分词块。例如,考虑下面的两个语句: ```py class ConsecutiveNPChunkTagger(nltk.TaggerI): ❶ @@ -742,8 +742,8 @@ IOB 格式(有时也称为 BIO 格式)由[(Ramshaw & Marcus, 1995)](./biblio 8. ◑ 使用基于正则表达式的词块语法`RegexpChunk`,为 CoNLL 语料库中词块类型中的一个开发一个词块划分器。使用词块、词缝、合并或拆分规则的任意组合。 9. ◑ 有时一个词的标注不正确,例如"12/CD or/CC so/RB cases/VBZ"中的中心名词。不用要求手工校正标注器的输出,好的词块划分器使用标注器的错误输出也能运作。查找使用不正确的标记正确为名词短语划分词块的其他例子。 10. ◑ 二元词块划分器的准确性得分约为 90%。研究它的错误,并试图找出它为什么不能获得 100% 的准确率。实验三元词块划分。你能够再提高准确性吗? -11. ★ 在 IOB 词块标注上应用 n-gram 和 Brill 标注方法。不是给词分配词性标记,在这里我们给词性标记分配 IOB 标记。例如如果标记`DT`(限定符)经常出现在一个词块的开头,它会被标注为`B`(开始)。相对于本章中讲到的正则表达式词块划分方法,评估这些词块划分方法的表现。 -12. ★ 在[5.](./ch05.html#chap-tag)中我们看到,通过查找有歧义的 n-grams 可以得到标注准确性的上限,即在训练数据中有多种可能的方式标注的 n-grams。应用同样的方法来确定一个 n-gram 词块划分器的上限。 +11. ★ 在 IOB 词块标注上应用 N 元和 Brill 标注方法。不是给词分配词性标记,在这里我们给词性标记分配 IOB 标记。例如如果标记`DT`(限定符)经常出现在一个词块的开头,它会被标注为`B`(开始)。相对于本章中讲到的正则表达式词块划分方法,评估这些词块划分方法的表现。 +12. ★ 在[5.](./ch05.html#chap-tag)中我们看到,通过查找有歧义的 n-grams 可以得到标注准确性的上限,即在训练数据中有多种可能的方式标注的 n-grams。应用同样的方法来确定一个 N 元词块划分器的上限。 13. ★ 挑选 CoNLL 语料库中三种词块类型之一。编写函数为你选择的类型做以下任务: 1. 列出与此词块类型的每个实例一起出现的所有标记序列。 2. 计数每个标记序列的频率,并产生一个按频率减少的顺序排列的列表;每行要包含一个整数(频率)和一个标记序列。 @@ -753,8 +753,8 @@ IOB 格式(有时也称为 BIO 格式)由[(Ramshaw & Marcus, 1995)](./biblio 16. ★ 宾州树库样例包含一部分已标注的《华尔街日报》文本,已经按名词短语划分词块。其格式使用方括号,我们已经在本章遇到它了几次。该语料可以使用`for sent in nltk.corpus.treebank_chunk.chunked_sents(fileid)`来访问。这些都是平坦的树,正如我们使用`nltk.corpus.conll2000.chunked_sents()`得到的一样。 1. 函数`nltk.tree.pprint()`和`nltk.chunk.tree2conllstr()`可以用来从一棵树创建树库和 IOB 字符串。编写函数`chunk2brackets()`和`chunk2iob()`,以一个单独的词块树为它们唯一的参数,返回所需的多行字符串表示。 2. 写命令行转换工具`bracket2iob.py`和`iob2bracket.py`,(分别)读取树库或 CoNLL 格式的一个文件,将它转换为其他格式。(从 NLTK 语料库获得一些原始的树库或 CoNLL 数据,保存到一个文件,然后使用`for line in open(filename)`从 Python 访问它。) -17. ★ 一个 n-gram 词块划分器可以使用除当前词性标记和 n-1 个前面的词块的标记以外其他信息。调查其他的上下文模型,如 n-1 个前面的词性标记,或一个写前面词块标记连同前面和后面的词性标记的组合。 -18. ★ 思考一个 n-gram 标注器使用临近的标记的方式。现在观察一个词块划分器可能如何重新使用这个序列信息。例如:这两个任务将使用名词往往跟在形容词后面(英文中)的信息。这会出现相同的信息被保存在两个地方的情况。随着规则集规模增长,这会成为一个问题吗?如果是,推测可能会解决这个问题的任何方式。 +17. ★ 一个 N 元词块划分器可以使用除当前词性标记和 n-1 个前面的词块的标记以外其他信息。调查其他的上下文模型,如 n-1 个前面的词性标记,或一个写前面词块标记连同前面和后面的词性标记的组合。 +18. ★ 思考一个 N 元标注器使用临近的标记的方式。现在观察一个词块划分器可能如何重新使用这个序列信息。例如:这两个任务将使用名词往往跟在形容词后面(英文中)的信息。这会出现相同的信息被保存在两个地方的情况。随着规则集规模增长,这会成为一个问题吗?如果是,推测可能会解决这个问题的任何方式。 ## 关于本文档... -- GitLab