3.1 读取 IOB 格式与 CoNLL2000 语料库

使用corpus模块,我们可以加载已经标注并使用 IOB 符号划分词块的《华尔街日报》文本。这个语料库提供的词块类型有NPVPPP。正如我们已经看到的,每个句子使用多行表示,如下所示:

  1. he PRP B-NP
  2. accepted VBD B-VP
  3. the DT B-NP
  4. position NN I-NP
  5. ...

tree_images/ch07-tree-2.png

我们可以使用 NLTK 的 corpus 模块访问较大量的已经划分词块的文本。CoNLL2000 语料库包含 27 万词的《华尔街日报文本》,分为“训练”和“测试”两部分,标注有词性标记和 IOB 格式词块标记。我们可以使用nltk.corpus.conll2000访问这些数据。下面是一个读取语料库的“训练”部分的第 100 个句子的例子:

  1. >>> from nltk.corpus import conll2000
  2. >>> print(conll2000.chunked_sents('train.txt')[99])
  3. (S
  4. (PP Over/IN)
  5. (NP a/DT cup/NN)
  6. (PP of/IN)
  7. (NP coffee/NN)
  8. ,/,
  9. (NP Mr./NNP Stone/NNP)
  10. (VP told/VBD)
  11. (NP his/PRP$ story/NN)
  12. ./.)

正如你看到的,CoNLL2000 语料库包含三种词块类型:NP词块,我们已经看到了;VP词块如 has already delivered;PP块如 because of。因为现在我们唯一感兴趣的是NP词块,我们可以使用chunk_types参数选择它们:

  1. >>> print(conll2000.chunked_sents('train.txt', chunk_types=['NP'])[99])
  2. (S
  3. Over/IN
  4. (NP a/DT cup/NN)
  5. of/IN
  6. (NP coffee/NN)
  7. ,/,
  8. (NP Mr./NNP Stone/NNP)
  9. told/VBD
  10. (NP his/PRP$ story/NN)
  11. ./.)