4.1 默认标注器

最简单的标注器是为每个词符分配同样的标记。这似乎是一个相当平庸的一步,但它建立了标注器性能的一个重要的底线。为了得到最好的效果,我们用最有可能的标记标注每个词。让我们找出哪个标记是最有可能的(现在使用未简化标记集):

  1. >>> tags = [tag for (word, tag) in brown.tagged_words(categories='news')]
  2. >>> nltk.FreqDist(tags).max()
  3. 'NN'

现在我们可以创建一个将所有词都标注成NN的标注器。

  1. >>> raw = 'I do not like green eggs and ham, I do not like them Sam I am!'
  2. >>> tokens = word_tokenize(raw)
  3. >>> default_tagger = nltk.DefaultTagger('NN')
  4. >>> default_tagger.tag(tokens)
  5. [('I', 'NN'), ('do', 'NN'), ('not', 'NN'), ('like', 'NN'), ('green', 'NN'),
  6. ('eggs', 'NN'), ('and', 'NN'), ('ham', 'NN'), (',', 'NN'), ('I', 'NN'),
  7. ('do', 'NN'), ('not', 'NN'), ('like', 'NN'), ('them', 'NN'), ('Sam', 'NN'),
  8. ('I', 'NN'), ('am', 'NN'), ('!', 'NN')]

不出所料,这种方法的表现相当不好。在一个典型的语料库中,它只标注正确了八分之一的标识符,正如我们在这里看到的:

  1. >>> default_tagger.evaluate(brown_tagged_sents)
  2. 0.13089484257215028

默认的标注器给每一个单独的词分配标记,即使是之前从未遇到过的词。碰巧的是,一旦我们处理了几千词的英文文本之后,大多数新词都将是名词。正如我们将看到的,这意味着,默认标注器可以帮助我们提高语言处理系统的稳定性。我们将很快回来讲述这个。