3.6 复杂的键和值

我们可以使用具有复杂的键和值的默认字典。让我们研究一个词可能的标记的范围,给定词本身和它前一个词的标记。我们将看到这些信息如何被一个词性标注器使用。

  1. >>> pos = defaultdict(lambda: defaultdict(int))
  2. >>> brown_news_tagged = brown.tagged_words(categories='news', tagset='universal')
  3. >>> for ((w1, t1), (w2, t2)) in nltk.bigrams(brown_news_tagged): ![[1]](/projects/nlp-py-2e-zh/Images/7a979f968bd33428b02cde62eaf2b615.jpg)
  4. ... pos[(t1, w2)][t2] += 1 ![[2]](/projects/nlp-py-2e-zh/Images/6ac827d2d00b6ebf8bbc704f430af896.jpg)
  5. ...
  6. >>> pos[('DET', 'right')] ![[3]](/projects/nlp-py-2e-zh/Images/934b688727805b37f2404f7497c52027.jpg)
  7. defaultdict(<class 'int'>, {'ADJ': 11, 'NOUN': 5})

这个例子使用一个字典,它的条目的默认值也是一个字典(其默认值是int(),即 0)。请注意我们如何遍历已标注语料库的双连词,每次遍历处理一个词-标记对[1]。每次通过循环时,我们更新字典pos中的条目(t1, w2),一个标记和它 后面 的词[2]。当我们在pos中查找一个项目时,我们必须指定一个复合键[3],然后得到一个字典对象。一个词性标注器可以使用这些信息来决定词 right,前面是一个限定词时,应标注为ADJ