5.4 组合标注器

解决精度和覆盖范围之间的权衡的一个办法是尽可能的使用更精确的算法,但却在很多时候落后于具有更广覆盖范围的算法。例如,我们可以按如下方式组合二元标注器、一元注器和一个默认标注器,如下:

  1. 尝试使用二元标注器标注标识符。
  2. 如果二元标注器无法找到一个标记,尝试一元标注器。
  3. 如果一元标注器也无法找到一个标记,使用默认标注器。

大多数 NLTK 标注器允许指定一个回退标注器。回退标注器自身可能也有一个回退标注器:

  1. >>> t0 = nltk.DefaultTagger('NN')
  2. >>> t1 = nltk.UnigramTagger(train_sents, backoff=t0)
  3. >>> t2 = nltk.BigramTagger(train_sents, backoff=t1)
  4. >>> t2.evaluate(test_sents)
  5. 0.844513...

注意

轮到你来: 通过定义一个名为t3TrigramTagger,扩展前面的例子,它是t2的回退标注器。

请注意,我们在标注器初始化时指定回退标注器,从而使训练能利用回退标注器。于是,在一个特定的上下文中,如果二元标注器将分配与它的一元回退标注器一样的标记,那么二元标注器丢弃训练的实例。这样保持尽可能小的二元标注器模型。我们可以进一步指定一个标注器需要看到一个上下文的多个实例才能保留它,例如nltk.BigramTagger(sents, cutoff=2, backoff=t1)将会丢弃那些只看到一次或两次的上下文。