- 1.1 古腾堡语料库
1.1 古腾堡语料库
NLTK 包含古腾堡项目(Project Gutenberg)电子文本档案的经过挑选的一小部分文本,该项目大约有 25,000 本免费电子图书,放在http://www.gutenberg.org/上。我们先要用 Python 解释器加载 NLTK 包,然后尝试nltk.corpus.gutenberg.fileids(),下面是这个语料库中的文件标识符:
>>> import nltk>>> nltk.corpus.gutenberg.fileids()['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt','blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt','carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt','chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt','milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt','shakespeare-macbeth.txt', 'whitman-leaves.txt']
让我们挑选这些文本的第一个——简·奥斯丁的 《爱玛》——并给它一个简短的名称emma,然后找出它包含多少个词:
>>> emma = nltk.corpus.gutenberg.words('austen-emma.txt')>>> len(emma)192427
注意
在第1章中,我们演示了如何使用text1.concordance()命令对text1这样的文本进行索引。然而,这是假设你正在使用由from nltk.book import *导入的 9 个文本之一。现在你开始研究nltk.corpus中的数据,像前面的例子一样,你必须采用以下语句对来处理索引和第1章中的其它任务:
>>> emma = nltk.Text(nltk.corpus.gutenberg.words('austen-emma.txt'))>>> emma.concordance("surprize")
在我们定义emma, 时,我们调用了 NLTK 中的corpus包中的gutenberg对象的words()函数。但因为总是要输入这么长的名字很繁琐,Python 提供了另一个版本的import语句,示例如下:
>>> from nltk.corpus import gutenberg>>> gutenberg.fileids()['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', ...]>>> emma = gutenberg.words('austen-emma.txt')
让我们写一个简短的程序,通过循环遍历前面列出的gutenberg文件标识符列表相应的fileid,然后计算统计每个文本。为了使输出看起来紧凑,我们将使用round()舍入每个数字到最近似的整数。
>>> for fileid in gutenberg.fileids():... num_chars = len(gutenberg.raw(fileid)) ![[1]](/projects/nlp-py-2e-zh/Images/eeff7ed83be48bf40aeeb3bf9db5550e.jpg)... num_words = len(gutenberg.words(fileid))... num_sents = len(gutenberg.sents(fileid))... num_vocab = len(set(w.lower() for w in gutenberg.words(fileid)))... print(round(num_chars/num_words), round(num_words/num_sents), round(num_words/num_vocab), fileid)...5 25 26 austen-emma.txt5 26 17 austen-persuasion.txt5 28 22 austen-sense.txt4 34 79 bible-kjv.txt5 19 5 blake-poems.txt4 19 14 bryant-stories.txt4 18 12 burgess-busterbrown.txt4 20 13 carroll-alice.txt5 20 12 chesterton-ball.txt5 23 11 chesterton-brown.txt5 18 11 chesterton-thursday.txt4 21 25 edgeworth-parents.txt5 26 15 melville-moby_dick.txt5 52 11 milton-paradise.txt4 12 9 shakespeare-caesar.txt4 12 8 shakespeare-hamlet.txt4 12 7 shakespeare-macbeth.txt5 36 12 whitman-leaves.txt
这个程序显示每个文本的三个统计量:平均词长、平均句子长度和本文中每个词出现的平均次数(我们的词汇多样性得分)。请看,平均词长似乎是英语的一个一般属性,因为它的值总是4。(事实上,平均词长是3而不是4,因为num_chars变量计数了空白字符。)相比之下,平均句子长度和词汇多样性看上去是作者个人的特点。
前面的例子也表明我们怎样才能获取“原始”文本
而不用把它分割成词符。raw()函数给我们没有进行过任何语言学处理的文件的内容。因此,例如len(gutenberg.raw('blake-poems.txt'))告诉我们文本中出现的 字符 个数,包括词之间的空格。sents()函数把文本划分成句子,其中每一个句子是一个单词列表:
>>> macbeth_sentences = gutenberg.sents('shakespeare-macbeth.txt')>>> macbeth_sentences[['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare','1603', ']'], ['Actus', 'Primus', '.'], ...]>>> macbeth_sentences[1116]['Double', ',', 'double', ',', 'toile', 'and', 'trouble', ';','Fire', 'burne', ',', 'and', 'Cauldron', 'bubble']>>> longest_len = max(len(s) for s in macbeth_sentences)>>> [s for s in macbeth_sentences if len(s) == longest_len][['Doubtfull', 'it', 'stood', ',', 'As', 'two', 'spent', 'Swimmers', ',', 'that','doe', 'cling', 'together', ',', 'And', 'choake', 'their', 'Art', ':', 'The','mercilesse', 'Macdonwald', ...]]
注意
除了words(), raw()和sents()之外,大多数 NLTK 语料库阅读器还包括多种访问方法。一些语料库提供更加丰富的语言学内容,例如:词性标注,对话标记,语法树等;在后面的章节中,我们将看到这些。
