1.1 古腾堡语料库

NLTK 包含古腾堡项目(Project Gutenberg)电子文本档案的经过挑选的一小部分文本,该项目大约有 25,000 本免费电子图书,放在http://www.gutenberg.org/上。我们先要用 Python 解释器加载 NLTK 包,然后尝试nltk.corpus.gutenberg.fileids(),下面是这个语料库中的文件标识符:

  1. >>> import nltk
  2. >>> nltk.corpus.gutenberg.fileids()
  3. ['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt',
  4. 'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt',
  5. 'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt',
  6. 'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt',
  7. 'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt',
  8. 'shakespeare-macbeth.txt', 'whitman-leaves.txt']

让我们挑选这些文本的第一个——简·奥斯丁的 《爱玛》——并给它一个简短的名称emma,然后找出它包含多少个词:

  1. >>> emma = nltk.corpus.gutenberg.words('austen-emma.txt')
  2. >>> len(emma)
  3. 192427

注意

在第1章中,我们演示了如何使用text1.concordance()命令对text1这样的文本进行索引。然而,这是假设你正在使用由from nltk.book import *导入的 9 个文本之一。现在你开始研究nltk.corpus中的数据,像前面的例子一样,你必须采用以下语句对来处理索引和第1章中的其它任务:

  1. >>> emma = nltk.Text(nltk.corpus.gutenberg.words('austen-emma.txt'))
  2. >>> emma.concordance("surprize")

在我们定义emma, 时,我们调用了 NLTK 中的corpus包中的gutenberg对象的words()函数。但因为总是要输入这么长的名字很繁琐,Python 提供了另一个版本的import语句,示例如下:

  1. >>> from nltk.corpus import gutenberg
  2. >>> gutenberg.fileids()
  3. ['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', ...]
  4. >>> emma = gutenberg.words('austen-emma.txt')

让我们写一个简短的程序,通过循环遍历前面列出的gutenberg文件标识符列表相应的fileid,然后计算统计每个文本。为了使输出看起来紧凑,我们将使用round()舍入每个数字到最近似的整数。

  1. >>> for fileid in gutenberg.fileids():
  2. ... num_chars = len(gutenberg.raw(fileid)) ![[1]](/projects/nlp-py-2e-zh/Images/eeff7ed83be48bf40aeeb3bf9db5550e.jpg)
  3. ... num_words = len(gutenberg.words(fileid))
  4. ... num_sents = len(gutenberg.sents(fileid))
  5. ... num_vocab = len(set(w.lower() for w in gutenberg.words(fileid)))
  6. ... print(round(num_chars/num_words), round(num_words/num_sents), round(num_words/num_vocab), fileid)
  7. ...
  8. 5 25 26 austen-emma.txt
  9. 5 26 17 austen-persuasion.txt
  10. 5 28 22 austen-sense.txt
  11. 4 34 79 bible-kjv.txt
  12. 5 19 5 blake-poems.txt
  13. 4 19 14 bryant-stories.txt
  14. 4 18 12 burgess-busterbrown.txt
  15. 4 20 13 carroll-alice.txt
  16. 5 20 12 chesterton-ball.txt
  17. 5 23 11 chesterton-brown.txt
  18. 5 18 11 chesterton-thursday.txt
  19. 4 21 25 edgeworth-parents.txt
  20. 5 26 15 melville-moby_dick.txt
  21. 5 52 11 milton-paradise.txt
  22. 4 12 9 shakespeare-caesar.txt
  23. 4 12 8 shakespeare-hamlet.txt
  24. 4 12 7 shakespeare-macbeth.txt
  25. 5 36 12 whitman-leaves.txt

这个程序显示每个文本的三个统计量:平均词长、平均句子长度和本文中每个词出现的平均次数(我们的词汇多样性得分)。请看,平均词长似乎是英语的一个一般属性,因为它的值总是4。(事实上,平均词长是3而不是4,因为num_chars变量计数了空白字符。)相比之下,平均句子长度和词汇多样性看上去是作者个人的特点。

前面的例子也表明我们怎样才能获取“原始”文本[1]而不用把它分割成词符。raw()函数给我们没有进行过任何语言学处理的文件的内容。因此,例如len(gutenberg.raw('blake-poems.txt'))告诉我们文本中出现的 字符 个数,包括词之间的空格。sents()函数把文本划分成句子,其中每一个句子是一个单词列表:

  1. >>> macbeth_sentences = gutenberg.sents('shakespeare-macbeth.txt')
  2. >>> macbeth_sentences
  3. [['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare',
  4. '1603', ']'], ['Actus', 'Primus', '.'], ...]
  5. >>> macbeth_sentences[1116]
  6. ['Double', ',', 'double', ',', 'toile', 'and', 'trouble', ';',
  7. 'Fire', 'burne', ',', 'and', 'Cauldron', 'bubble']
  8. >>> longest_len = max(len(s) for s in macbeth_sentences)
  9. >>> [s for s in macbeth_sentences if len(s) == longest_len]
  10. [['Doubtfull', 'it', 'stood', ',', 'As', 'two', 'spent', 'Swimmers', ',', 'that',
  11. 'doe', 'cling', 'together', ',', 'And', 'choake', 'their', 'Art', ':', 'The',
  12. 'mercilesse', 'Macdonwald', ...]]

注意

除了words(), raw()sents()之外,大多数 NLTK 语料库阅读器还包括多种访问方法。一些语料库提供更加丰富的语言学内容,例如:词性标注,对话标记,语法树等;在后面的章节中,我们将看到这些。