一元标注器基于一个简单的统计算法:对每个标识符分配这个独特的标识符最有可能的标记。例如,它将分配标记`JJ`给词 frequent 的所有出现,因为 frequent 用作一个形容词(例如 a frequent word)比用作一个动词(例如 I frequent this cafe)更常见。一个一元标注器的行为就像一个查找标注器`(4)`,除了有一个更方便的建立它的技术,称为训练。在下面的代码例子中,我们训练一个一元标注器,用它来标注一个句子,然后评估:
一元标注器基于一个简单的统计算法:对每个标识符分配这个独特的标识符最有可能的标记。例如,它将分配标记`JJ`给词`frequent`的所有出现,因为`frequent`用作一个形容词(例如`a frequent word`)比用作一个动词(例如`I frequent this cafe`)更常见。一个一元标注器的行为就像一个查找标注器`(4)`,除了有一个更方便的建立它的技术,称为训练。在下面的代码例子中,我们训练一个一元标注器,用它来标注一个句子,然后评估:
```py
>>>fromnltk.corpusimportbrown
...
...
@@ -928,9 +928,9 @@ def display():
## 5.3 一般的 N 元标注
在基于一元处理一个语言处理任务时,我们使用上下文中的一个项目。标注的时候,我们只考虑当前的词符,与更大的上下文隔离。给定一个模型,我们能做的最好的是为每个词标注其*先验的*最可能的标记。这意味着我们将使用相同的标记标注一个词,如 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 元标注器挑选在给定的上下文中最有可能的标记。
一般情况下,标注过程会损坏区别:例如当所有的人称代词被标注为`PRP`时,词的特性通常会失去。与此同时,标注过程引入了新的区别从而去除了含糊之处:例如 deal 标注为`VB`或`NN`。这种消除某些区别并引入新的区别的特点是标注的一个重要的特征,有利于分类和预测。当我们引入一个标记集的更细的划分时,在 N 元标注器决定什么样的标记分配给一个特定的词时,可以获得关于左侧上下文的更详细的信息。然而,标注器同时也将需要做更多的工作来划分当前的词符,只是因为有更多可供选择的标记。相反,使用较少的区别(如简化的标记集),标注器有关上下文的信息会减少,为当前词符分类的选择范围也较小。
一般情况下,标注过程会损坏区别:例如当所有的人称代词被标注为`PRP`时,词的特性通常会失去。与此同时,标注过程引入了新的区别从而去除了含糊之处:例如`deal`标注为`VB`或`NN`。这种消除某些区别并引入新的区别的特点是标注的一个重要的特征,有利于分类和预测。当我们引入一个标记集的更细的划分时,在 N 元标注器决定什么样的标记分配给一个特定的词时,可以获得关于左侧上下文的更详细的信息。然而,标注器同时也将需要做更多的工作来划分当前的词符,只是因为有更多可供选择的标记。相反,使用较少的区别(如简化的标记集),标注器有关上下文的信息会减少,为当前词符分类的选择范围也较小。
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`。手工标注这些头条,看看词性标记的知识是否可以消除歧义。
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`)即我们需要一个对前面的标记敏感的默认标注器。