3.3 中的列表演示了一个重要的按值排序一个字典的习惯用法,来按频率递减顺序显示词汇。`sorted()`的第一个参数是要排序的项目,它是由一个词性标记和一个频率组成的元组的列表。第二个参数使用函数`itemgetter()`指定排序的键。在一般情况下,`itemgetter(n)`返回一个函数,这个函数可以在一些其他序列对象上被调用获得这个序列的第 n 个元素,例如:
在基于一元处理一个语言处理任务时,我们使用上下文中的一个项目。标注的时候,我们只考虑当前的词符,与更大的上下文隔离。给定一个模型,我们能做的最好的是为每个词标注其*先验的*最可能的标记。这意味着我们将使用相同的标记标注一个词,如 wind,不论它出现的上下文是 the wind 还是 to wind。
一个 N 元标注器是一个一元标注器的一般化,它的上下文是当前词和它前面 *n*-1 个标识符的词性标记,如图 5.1 所示。要选择的标记是圆圈里的 *t*<sub>n</sub>,灰色阴影的是上下文。在 5.1 所示的 N 元标注器的例子中,我们让 *n*=3;也就是说,我们考虑当前词的前两个词的标记。一个 N 元标注器挑选在给定的上下文中最有可能的标记。
一般情况下,标注过程会损坏区别:例如当所有的人称代词被标注为`PRP`时,词的特性通常会失去。与此同时,标注过程引入了新的区别从而去除了含糊之处:例如 deal 标注为`VB`或`NN`。这种消除某些区别并引入新的区别的特点是标注的一个重要的特征,有利于分类和预测。当我们引入一个标记集的更细的划分时,在 N 元标注器决定什么样的标记分配给一个特定的词时,可以获得关于左侧上下文的更详细的信息。然而,标注器同时也将需要做更多的工作来划分当前的词符,只是因为有更多可供选择的标记。相反,使用较少的区别(如简化的标记集),标注器有关上下文的信息会减少,为当前词符分类的选择范围也较小。
Brill 标注是一种*基于转换的学习*,以它的发明者命名。一般的想法很简单:猜每个词的标记,然后返回和修复错误。在这种方式中,Brill 标注器陆续将一个不良标注的文本转换成一个更好的。与 N 元标注一样,这是有*监督的学习*方法,因为我们需要已标注的训练数据来评估标注器的猜测是否是一个错误。然而,不像 N 元标注,它不计数观察结果,只编制一个转换修正规则列表。
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
16. ★ 宾州树库样例包含一部分已标注的《华尔街日报》文本,已经按名词短语划分词块。其格式使用方括号,我们已经在本章遇到它了几次。该语料可以使用`for sent in nltk.corpus.treebank_chunk.chunked_sents(fileid)`来访问。这些都是平坦的树,正如我们使用`nltk.corpus.conll2000.chunked_sents()`得到的一样。