From a929853b25914882f8b9c273db503f55c4f42e87 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Tue, 29 Dec 2020 16:47:03 +0800 Subject: [PATCH] 2020-12-29 16:47:03 --- 5.md | 60 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/5.md b/5.md index 1b62adc..f705e07 100644 --- a/5.md +++ b/5.md @@ -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 @@ -928,9 +928,9 @@ def display(): ## 5.3 一般的 N 元标注 -在基于一元处理一个语言处理任务时,我们使用上下文中的一个项目。标注的时候,我们只考虑当前的词符,与更大的上下文隔离。给定一个模型,我们能做的最好的是为每个词标注其*先验的*最可能的标记。这意味着我们将使用相同的标记标注一个词,如 wind,不论它出现的上下文是 the wind 还是 to wind。 +在基于一元处理一个语言处理任务时,我们使用上下文中的一个项目。标注的时候,我们只考虑当前的词符,与更大的上下文隔离。给定一个模型,我们能做的最好的是为每个词标注其*先验的*最可能的标记。这意味着我们将使用相同的标记标注一个词,如`wind`,不论它出现的上下文是`the wind`还是`to wind`。 -一个 N 元标注器是一个一元标注器的一般化,它的上下文是当前词和它前面 *n*-1 个标识符的词性标记,如图 5.1 所示。要选择的标记是圆圈里的 *t*<sub>n</sub>,灰色阴影的是上下文。在 5.1 所示的 N 元标注器的例子中,我们让 *n*=3;也就是说,我们考虑当前词的前两个词的标记。一个 N 元标注器挑选在给定的上下文中最有可能的标记。 +一个 N 元标注器是一个一元标注器的一般化,它的上下文是当前词和它前面`n - 1`个标识符的词性标记,如图 5.1 所示。要选择的标记是圆圈里的`t[n]`,灰色阴影的是上下文。在 5.1 所示的 N 元标注器的例子中,我们让`n = 3`;也就是说,我们考虑当前词的前两个词的标记。一个 N 元标注器挑选在给定的上下文中最有可能的标记。 ![Images/tag-context.png](Images/12573c3a9015654728fe798e170a3c50.jpg) @@ -960,7 +960,7 @@ def display(): ('separate', None), ('dialects', None), ('.', None)] ``` -请注意,二元标注器能够标注训练中它看到过的句子中的所有词,但对一个没见过的句子表现很差。只要遇到一个新词(如 13.5),就无法给它分配标记。它不能标注下面的词(如 million),即使是在训练过程中看到过的,只是因为在训练过程中从来没有见过它前面有一个`None`标记的词。因此,标注器标注句子的其余部分也失败了。它的整体准确度得分非常低: +请注意,二元标注器能够标注训练中它看到过的句子中的所有词,但对一个没见过的句子表现很差。只要遇到一个新词(如 13.5),就无法给它分配标记。它不能标注下面的词(如`million`),即使是在训练过程中看到过的,只是因为在训练过程中从来没有见过它前面有一个`None`标记的词。因此,标注器标注句子的其余部分也失败了。它的整体准确度得分非常低: ```py >>> bigram_tagger.evaluate(test_sents) @@ -971,7 +971,7 @@ def display(): 小心! -N 元标注器不应考虑跨越句子边界的上下文。因此,NLTK 的标注器被设计用于句子列表,其中一个句子是一个词列表。在一个句子的开始,_t_<sub>n-1</sub>和前面的标记被设置为`None`。 +N 元标注器不应考虑跨越句子边界的上下文。因此,NLTK 的标注器被设计用于句子列表,其中一个句子是一个词列表。在一个句子的开始,`t[n - 1]`和前面的标记被设置为`None`。 ## 5.4 组合标注器 @@ -999,9 +999,9 @@ N 元标注器不应考虑跨越句子边界的上下文。因此,NLTK 的标 ## 5.5 标注生词 -我们标注生词的方法仍然是回退到一个正则表达式标注器或一个默认标注器。这些都无法利用上下文。因此,如果我们的标注器遇到词 blog,训练过程中没有看到过,它会分配相同的标记,不论这个词出现的上下文是 the blog 还是 to blog。我们怎样才能更好地处理这些生词,或词汇表以外的项目? +我们标注生词的方法仍然是回退到一个正则表达式标注器或一个默认标注器。这些都无法利用上下文。因此,如果我们的标注器遇到词`blog`,训练过程中没有看到过,它会分配相同的标记,不论这个词出现的上下文是`the blog`还是`to blog`。我们怎样才能更好地处理这些生词,或词汇表以外的项目? -一个有用的基于上下文标注生词的方法是限制一个标注器的词汇表为最频繁的 n 个词,使用 3 中的方法替代每个其他的词为一个特殊的词 UNK。训练时,一个一元标注器可能会学到 UNK 通常是一个名词。然而,N 元标注器会检测它的一些其他标记中的上下文。例如,如果前面的词是 to(标注为`TO`),那么 UNK 可能会被标注为一个动词。 +一个有用的基于上下文标注生词的方法是限制一个标注器的词汇表为最频繁的`n`个词,使用 3 中的方法替代每个其他的词为一个特殊的词 UNK。训练时,一个一元标注器可能会学到 UNK 通常是一个名词。然而,N 元标注器会检测它的一些其他标记中的上下文。例如,如果前面的词是`to`(标注为`TO`),那么 UNK 可能会被标注为一个动词。 ## 5.6 存储标注器 @@ -1050,7 +1050,7 @@ N 元标注器不应考虑跨越句子边界的上下文。因此,NLTK 的标 0.049297702068029296 ``` -因此,1/20 的三元是有歧义的[示例]。给定当前单词及其前两个标记,根据训练数据,在 5% 的情况中,有一个以上的标记可能合理地分配给当前词。假设我们总是挑选在这种含糊不清的上下文中最有可能的标记,可以得出三元标注器准确性的一个下界。 +因此,`1/20`的三元是有歧义的示例。给定当前单词及其前两个标记,根据训练数据,在 5% 的情况中,有一个以上的标记可能合理地分配给当前词。假设我们总是挑选在这种含糊不清的上下文中最有可能的标记,可以得出三元标注器准确性的一个下界。 调查标注器准确性的另一种方法是研究它的错误。有些标记可能会比别的更难分配,可能需要专门对这些数据进行预处理或后处理。一个方便的方式查看标注错误是混淆矩阵。它用图表表示期望的标记(黄金标准)与实际由标注器产生的标记: @@ -1063,15 +1063,15 @@ N 元标注器不应考虑跨越句子边界的上下文。因此,NLTK 的标 基于这样的分析,我们可能会决定修改标记集。或许标记之间很难做出的区分可以被丢弃,因为它在一些较大的处理任务的上下文中并不重要。 -分析标注器准确性界限的另一种方式来自人类标注者之间并非 100% 的意见一致。[更多] +分析标注器准确性界限的另一种方式来自人类标注者之间并非 100% 的意见一致。 -一般情况下,标注过程会损坏区别:例如当所有的人称代词被标注为`PRP`时,词的特性通常会失去。与此同时,标注过程引入了新的区别从而去除了含糊之处:例如 deal 标注为`VB`或`NN`。这种消除某些区别并引入新的区别的特点是标注的一个重要的特征,有利于分类和预测。当我们引入一个标记集的更细的划分时,在 N 元标注器决定什么样的标记分配给一个特定的词时,可以获得关于左侧上下文的更详细的信息。然而,标注器同时也将需要做更多的工作来划分当前的词符,只是因为有更多可供选择的标记。相反,使用较少的区别(如简化的标记集),标注器有关上下文的信息会减少,为当前词符分类的选择范围也较小。 +一般情况下,标注过程会损坏区别:例如当所有的人称代词被标注为`PRP`时,词的特性通常会失去。与此同时,标注过程引入了新的区别从而去除了含糊之处:例如`deal`标注为`VB`或`NN`。这种消除某些区别并引入新的区别的特点是标注的一个重要的特征,有利于分类和预测。当我们引入一个标记集的更细的划分时,在 N 元标注器决定什么样的标记分配给一个特定的词时,可以获得关于左侧上下文的更详细的信息。然而,标注器同时也将需要做更多的工作来划分当前的词符,只是因为有更多可供选择的标记。相反,使用较少的区别(如简化的标记集),标注器有关上下文的信息会减少,为当前词符分类的选择范围也较小。 我们已经看到,训练数据中的歧义导致标注器准确性的上限。有时更多的上下文能解决这些歧义。然而,在其他情况下,如[(Church, Young, & Bloothooft, 1996)](./bibliography.html#abney1996pst)中指出的,只有参考语法或现实世界的知识,才能解决歧义。尽管有这些缺陷,词性标注在用统计方法进行自然语言处理的兴起过程中起到了核心作用。1990 年代初,统计标注器令人惊讶的精度是一个惊人的示范,可以不用更深的语言学知识解决一小部分语言理解问题,即词性消歧。这个想法能再推进吗?第[7.](./ch07.html#chap-chunk)中,我们将看到,它可以。 ## 6 基于转换的标注 -N 元标注器的一个潜在的问题是它们的 N 元表(或语言模型)的大小。如果使用各种语言技术的标注器部署在移动计算设备上,在模型大小和标注器准确性之间取得平衡是很重要的。使用回退标注器的 N 元标注器可能存储 trigram 和 bigram 表,这是很大的稀疏阵列,可能有数亿条条目。 +N 元标注器的一个潜在的问题是它们的 N 元表(或语言模型)的大小。如果使用各种语言技术的标注器部署在移动计算设备上,在模型大小和标注器准确性之间取得平衡是很重要的。使用回退标注器的 N 元标注器可能存储三元和二元表,这是很大的稀疏阵列,可能有数亿条条目。 第二个问题是关于上下文。N 元标注器从前面的上下文中获得的唯一的信息是标记,虽然词本身可能是一个有用的信息源。N 元模型使用上下文中的词的其他特征为条件是不切实际的。在本节中,我们考察 Brill 标注,一种归纳标注方法,它的性能很好,使用的模型只有 N 元标注器的很小一部分。 @@ -1124,13 +1124,13 @@ olboys/NNS over/IN the/DT | cars/NN->NNS | and/CC drivers/NNS ./. ## 7.1 形态学线索 -一个词的内部结构可能为这个词分类提供有用的线索。举例来说:-ness 是一个后缀,与形容词结合产生一个名词,如 happy → happiness, ill → illness。如果我们遇到的一个以-ness 结尾的词,很可能是一个名词。同样的,-ment 是与一些动词结合产生一个名词的后缀,如 govern → government 和 establish → establishment。 +一个词的内部结构可能为这个词分类提供有用的线索。举例来说:`-ness`是一个后缀,与形容词结合产生一个名词,如`happy → happiness`, `ill → illness`。如果我们遇到的一个以`-ness`结尾的词,很可能是一个名词。同样的,`-ment`是与一些动词结合产生一个名词的后缀,如`govern → government`和`establish → establishment`。 -英语动词也可以是形态复杂的。例如,一个动词的现在分词以-ing 结尾,表示正在进行的还没有结束的行动(如 falling, eating)。-ing 后缀也出现在从动词派生的名词中,如 the falling of the leaves(这被称为动名词)。 +英语动词也可以是形态复杂的。例如,一个动词的现在分词以`-ing`结尾,表示正在进行的还没有结束的行动(如`falling, eating`)。`-ing`后缀也出现在从动词派生的名词中,如`the falling of the leaves`(这被称为动名词)。 ## 7.2 句法线索 -另一个信息来源是一个词可能出现的典型的上下文语境。例如,假设我们已经确定了名词类。那么我们可以说,英语形容词的句法标准是它可以立即出现在一个名词前,或紧跟在词 be 或 very 后。根据这些测试,near 应该被归类为形容词: +另一个信息来源是一个词可能出现的典型的上下文语境。例如,假设我们已经确定了名词类。那么我们可以说,英语形容词的句法标准是它可以立即出现在一个名词前,或紧跟在词`be`或`very`后。根据这些测试,`near`应该被归类为形容词: ```py Statement User117 Dude..., I wanted some of that @@ -1144,22 +1144,22 @@ Statement User121 18/m pm me if u tryin to chat ## 10 练习 -1. ☼ 网上搜索“spoof newspaper headlines”,找到这种宝贝:British Left Waffles on Falkland Islands 和 Juvenile Court to Try Shooting Defendant。手工标注这些头条,看看词性标记的知识是否可以消除歧义。 -2. ☼ 和别人一起,轮流挑选一个既可以是名词也可以是动词的词(如 contest);让对方预测哪一个可能是布朗语料库中频率最高的;检查对方的预测,为几个回合打分。 -3. ☼ 分词和标注下面的句子:They wind back the clock, while we chase after the wind。涉及哪些不同的发音和词类? +1. ☼ 网上搜索“spoof newspaper headlines”,找到这种宝贝:`British Left Waffles on Falkland Islands`和`Juvenile Court to Try Shooting Defendant`。手工标注这些头条,看看词性标记的知识是否可以消除歧义。 +2. ☼ 和别人一起,轮流挑选一个既可以是名词也可以是动词的词(如`contest`);让对方预测哪一个可能是布朗语料库中频率最高的;检查对方的预测,为几个回合打分。 +3. ☼ 分词和标注下面的句子:`They wind back the clock, while we chase after the wind`。涉及哪些不同的发音和词类? 4. ☼ 回顾 3.1 中的映射。讨论你能想到的映射的其他的例子。它们从什么类型的信息映射到什么类型的信息? 5. ☼ 在交互模式下使用 Python 解释器,实验本章中字典的例子。创建一个字典`d`,添加一些条目。如果你尝试访问一个不存在的条目会发生什么,如`d['xyz']`? 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. ☼ 训练一个没有回退标注器的二元标注器,在一些训练数据上运行。下一步,在一些新的数据运行它。标注器的准确性会发生什么?为什么呢? 13. ☼ 我们可以使用字典指定由一个格式化字符串替换的值。阅读关于格式化字符串的 Python 库文档`http://docs.python.org/lib/typesseq-strings.html`,使用这种方法以两种不同的格式显示今天的日期。 14. ◑ 使用`sorted()`和`set()`获得布朗语料库使用的标记的排序的列表,删除重复。 15. ◑ 写程序处理布朗语料库,找到以下问题的答案: - 1. 哪些名词常以它们复数形式而不是它们的单数形式出现?(只考虑常规的复数形式,-s 后缀形式的)。 + 1. 哪些名词常以它们复数形式而不是它们的单数形式出现?(只考虑常规的复数形式,`-s`后缀形式的)。 2. 哪个词的不同标记数目最多。它们是什么,它们代表什么? 3. 按频率递减的顺序列出标记。前 20 个最频繁的标记代表什么? 4. 名词后面最常见的是哪些标记?这些标记代表什么? @@ -1177,13 +1177,13 @@ Statement User121 18/m pm me if u tryin to chat 3. 现在,检查源代码来看看这个方法是如何实现的。检查`nltk.tag.api.__file__`找到源代码的位置,使用编辑器打开这个文件(一定要使用文件`api.py`,而不是编译过的二进制文件`api.pyc`)。 20. ◑ 编写代码,搜索布朗语料库,根据标记查找特定的词和短语,回答下列问题: 1. 产生一个标注为`MD`的不同的词的按字母顺序排序的列表。 - 2. 识别可能是复数名词或第三人称单数动词的词(如 deals, flies)。 - 3. 识别三个词的介词短语形式 IN + DET + NN(如 in the lab)。 + 2. 识别可能是复数名词或第三人称单数动词的词(如 `deals, flies`)。 + 3. 识别三个词的介词短语形式`IN + DET + NN`(如`in the lab`)。 4. 男性与女性代词的比例是多少? -21. ◑ 在 3.1 中我们看到动词 adore, love, like, prefer 及前面的限定符 absolutely 和 definitely 的频率计数的表格。探讨这四个动词前出现的所有限定符。 -22. ◑ 我们定义可以用来做生词的回退标注器的`regexp_tagger`。这个标注器只检查基数词。通过特定的前缀或后缀字符串进行测试,它应该能够猜测其他标记。例如,我们可以标注所有-s 结尾的词为复数名词。定义一个正则表达式标注器(使用`RegexpTagger()`),测试至少 5 个单词拼写的其他模式。(使用内联文档解释规则。) +21. ◑ 在 3.1 中我们看到动词`adore, love, like, prefer`及前面的限定符`absolutely`和`definitely`的频率计数的表格。探讨这四个动词前出现的所有限定符。 +22. ◑ 我们定义可以用来做生词的回退标注器的`regexp_tagger`。这个标注器只检查基数词。通过特定的前缀或后缀字符串进行测试,它应该能够猜测其他标记。例如,我们可以标注所有`-s`结尾的词为复数名词。定义一个正则表达式标注器(使用`RegexpTagger()`),测试至少 5 个单词拼写的其他模式。(使用内联文档解释规则。) 23. ◑ 考虑上一练习中开发的正则表达式标注器。使用它的`accuracy()`方法评估标注器,尝试想办法提高其性能。讨论你的发现。客观的评估如何帮助开发过程? -24. ◑ 数据稀疏问题有多严重?调查 N 元标注器当 n 从 1 增加到 6 时的准确性。为准确性得分制表。估计这些标注器需要的训练数据,假设词汇量大小为 10<sup>5</sup>而标记集的大小为 10<sup>2</sup>。 +24. ◑ 数据稀疏问题有多严重?调查 N 元标注器当`n`从 1 增加到 6 时的准确性。为准确性得分制表。估计这些标注器需要的训练数据,假设词汇量大小为`10^5`而标记集的大小为`10^2`。 25. ◑ 获取另一种语言的一些已标注数据,在其上测试和评估各种标注器。如果这种语言是形态复杂的,或者有词类的任何字形线索(如),可以考虑为它开发一个正则表达式标注器(排在一元标注器之后,默认标注器之前)。对比同样的运行在英文数据上的标注器,你的标注器的准确性如何?讨论你在运用这些方法到这种语言时遇到的问题。 26. ◑ 4.1 绘制曲线显示查找标注器的性能随模型的大小增加的变化。绘制当训练数据量变化时一元标注器的性能曲线。 27. ◑ 检查 5 中定义的二元标注器`t2`的混淆矩阵,确定简化的一套或多套标记。定义字典做映射,在简化的数据上评估标注器。 @@ -1192,23 +1192,23 @@ Statement User121 18/m pm me if u tryin to chat 30. ◑ 预处理布朗新闻数据,替换低频词为 UNK,但留下标记不变。在这些数据上训练和评估一个二元标注器。这样有多少帮助?一元标注器和默认标注器的贡献是什么? 31. ◑ 修改 4.1 中的程序,通过将`pylab.plot()`替换为`pylab.semilogx()`,在 *x* 轴上使用对数刻度。关于结果图形的形状,你注意到了什么?梯度告诉你什么呢? 32. ◑ 使用`help(nltk.tag.brill.demo)`阅读 Brill 标注器演示函数的文档。通过设置不同的参数值试验这个标注器。是否有任何训练时间(语料库大小)和性能之间的权衡? -33. ◑ 写代码构建一个集合的字典的字典。用它来存储一套可以跟在具有给定词性标记的给定词后面的词性标记,例如 word<sub>i</sub> → tag<sub>i</sub> → tag<sub>i+1</sub>。 +33. ◑ 写代码构建一个集合的字典的字典。用它来存储一套可以跟在具有给定词性标记的给定词后面的词性标记,例如`word[i] → tag[i] → tag[i + 1]`。 34. ★ 布朗语料库中有 264 个不同的词有 3 种可能的标签。 - 1. 打印一个表格,一列中是整数 1..10,另一列是语料库中有 1..10 个不同标记的不同词的数目。 + 1. 打印一个表格,一列中是整数`1..10`,另一列是语料库中有`1..10`个不同标记的不同词的数目。 2. 对有不同的标记数量最多的词,输出语料库中包含这个词的句子,每个可能的标记一个。 -35. ★ 写一个程序,按照词 must 后面的词的标记为它的上下文分类。这样可以区分 must 的“必须”和“应该”两种词意上的用法吗? +35. ★ 写一个程序,按照词`must`后面的词的标记为它的上下文分类。这样可以区分`must`的“必须”和“应该”两种词意上的用法吗? 36. ★ 创建一个正则表达式标注器和各种一元以及 N 元标注器,包括回退,在布朗语料库上训练它们。 1. 创建这些标注器的 3 种不同组合。测试每个组合标注器的准确性。哪种组合效果最好? 2. 尝试改变训练语料的规模。它是如何影响你的结果的? -37. ★ 我们标注生词的方法一直要考虑这个词的字母(使用`RegexpTagger()`),或完全忽略这个词,将它标注为一个名词(使用`nltk.DefaultTagger()`)。这些方法对于有新词却不是名词的文本不会很好。思考句子 I like to blog on Kim's blog。如果 blog 是一个新词,那么查看前面的标记(`TO`和`NP 即我们需要一个对前面的标记敏感的默认标注器。 +37. ★ 我们标注生词的方法一直要考虑这个词的字母(使用`RegexpTagger()`),或完全忽略这个词,将它标注为一个名词(使用`nltk.DefaultTagger()`)。这些方法对于有新词却不是名词的文本不会很好。思考句子`I like to blog on Kim's blog`。如果`blog`是一个新词,那么查看前面的标记(`TO`和`NP`)即我们需要一个对前面的标记敏感的默认标注器。 1. 创建一种新的一元标注器,查看前一个词的标记,而忽略当前词。(做到这一点的最好办法是修改`UnigramTagger()`的源代码,需要 Python 中的面向对象编程的知识。 2. 将这个标注器加入到回退标注器序列(包括普通的三元和二元标注器),放在常用默认标注器的前面。 3. 评价这个新的一元标注器的贡献。 38. ★ 思考 5 中的代码,它确定一个三元标注器的准确性上限。回顾 Abney 的关于精确标注的不可能性的讨论[(Church, Young, & Bloothooft, 1996)](./bibliography.html#abney1996pst)。解释为什么正确标注这些例子需要获取词和标记以外的其他种类的信息。你如何估计这个问题的规模? 39. ★ 使用`nltk.probability`中的一些估计技术,例如 *Lidstone* 或 *Laplace* 估计,开发一种统计标注器,它在训练中没有遇到而测试中遇到的上下文中表现优于 N 元回退标注器。 40. ★ 检查 Brill 标注器创建的诊断文件`rules.out`和`errors.out`。通过访问源代码(`http://www.nltk.org/code`)获得演示代码,创建你自己版本的 Brill 标注器。并根据你从检查`rules.out`了解到的,删除一些规则模板。增加一些新的规则模板,这些模板使用那些可能有助于纠正你在`errors.out`看到的错误的上下文。 -41. ★ 开发一个 N 元回退标注器,允许在标注器初始化时指定“anti-n-grams”,如`["the", "the"]`。一个 anti-n-grams 被分配一个数字 0,被用来防止这个 N 元回退(如避免估计 P(the | the)而只做 P(the))。 -42. ★ 使用布朗语料库开发标注器时,调查三种不同的方式来定义训练和测试数据之间的分割:genre (`category`)、source (`fileid`)和句子。比较它们的相对性能,并讨论哪种方法最合理。(你可能要使用 n-交叉验证,在 3 中讨论的,以提高评估的准确性。) +41. ★ 开发一个 N 元回退标注器,允许在标注器初始化时指定“anti-n-grams”,如`["the", "the"]`。一个 anti-n-grams 被分配一个数字 0,被用来防止这个 N 元回退(如避免估计`P(the | the)`而只做`P(the)`)。 +42. ★ 使用布朗语料库开发标注器时,调查三种不同的方式来定义训练和测试数据之间的分割:类别(`category`)、来源(`fileid`)和句子。比较它们的相对性能,并讨论哪种方法最合理。(你可能要使用`n`交叉验证,在 3 中讨论的,以提高评估的准确性。) 43. ★ 开发你自己的`NgramTagger`,从 NLTK 中的类继承,封装本章中所述的已标注的训练和测试数据的词汇表缩减方法。确保一元和默认回退标注器有机会获得全部词汇。 ## 关于本文档... -- GitLab