2.2 读取已标注的语料库

NLTK 中包括的若干语料库已标注了词性。下面是一个你用文本编辑器打开一个布朗语料库的文件就能看到的例子:

The/at Fulton/np-tl County/nn-tl Grand/jj-tl Jury/nn-tl said/vbd Friday/nr an/at investigation/nn of/in Atlanta’s/np$ recent/jj primary/nn election/nn produced/vbd / no/at evidence/nn ‘’/‘’ that/cs any/dti irregularities/nns took/vbd place/nn ./.

其他语料库使用各种格式存储词性标记。NLTK 的语料库阅读器提供了一个统一的接口,使你不必理会这些不同的文件格式。与刚才提取并显示的上面的文件不同,布朗语料库的语料库阅读器按如下所示的方式表示数据。注意,词性标记已转换为大写的,自从布朗语料库发布以来这已成为标准的做法。

  1. >>> nltk.corpus.brown.tagged_words()
  2. [('The', 'AT'), ('Fulton', 'NP-TL'), ...]
  3. >>> nltk.corpus.brown.tagged_words(tagset='universal')
  4. [('The', 'DET'), ('Fulton', 'NOUN'), ...]

只要语料库包含已标注的文本,NLTK 的语料库接口都将有一个tagged_words()方法。下面是一些例子,再次使用布朗语料库所示的输出格式:

  1. >>> print(nltk.corpus.nps_chat.tagged_words())
  2. [('now', 'RB'), ('im', 'PRP'), ('left', 'VBD'), ...]
  3. >>> nltk.corpus.conll2000.tagged_words()
  4. [('Confidence', 'NN'), ('in', 'IN'), ('the', 'DT'), ...]
  5. >>> nltk.corpus.treebank.tagged_words()
  6. [('Pierre', 'NNP'), ('Vinken', 'NNP'), (',', ','), ...]

并非所有的语料库都采用同一组标记;看前面提到的标记集的帮助函数和readme()方法中的文档。最初,我们想避免这些标记集的复杂化,所以我们使用一个内置的到“通用标记集“的映射:

  1. >>> nltk.corpus.brown.tagged_words(tagset='universal')
  2. [('The', 'DET'), ('Fulton', 'NOUN'), ...]
  3. >>> nltk.corpus.treebank.tagged_words(tagset='universal')
  4. [('Pierre', 'NOUN'), ('Vinken', 'NOUN'), (',', '.'), ...]

NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语,葡萄牙语,西班牙语,荷兰语和加泰罗尼亚语。这些通常含有非 ASCII 文本,当输出较大的结构如列表时,Python 总是以十六进制显示这些。

  1. >>> nltk.corpus.sinica_treebank.tagged_words()
  2. [('ä', 'Neu'), ('åæ', 'Nad'), ('åç', 'Nba'), ...]
  3. >>> nltk.corpus.indian.tagged_words()
  4. [('মহিষের', 'NN'), ('সন্তান', 'NN'), (':', 'SYM'), ...]
  5. >>> nltk.corpus.mac_morpho.tagged_words()
  6. [('Jersei', 'N'), ('atinge', 'V'), ('m\xe9dia', 'N'), ...]
  7. >>> nltk.corpus.conll2002.tagged_words()
  8. [('Sao', 'NC'), ('Paulo', 'VMI'), ('(', 'Fpa'), ...]
  9. >>> nltk.corpus.cess_cat.tagged_words()
  10. [('El', 'da0ms0'), ('Tribunal_Suprem', 'np0000o'), ...]

如果你的环境设置正确,有适合的编辑器和字体,你应该能够以人可读的方式显示单个字符串。例如,2.1显示的使用nltk.corpus.indian访问的数据。

Images/tag-indian.png

图 2.1:四种印度语言的词性标注数据:孟加拉语、印地语、马拉地语和泰卢固语

如果语料库也被分割成句子,将有一个tagged_sents()方法将已标注的词划分成句子,而不是将它们表示成一个大列表。在我们开始开发自动标注器时,这将是有益的,因为它们在句子列表上被训练和测试,而不是词。