2.4 使用双连词生成随机文本

我们可以使用条件频率分布创建一个双连词表(词对)。(我们在3中介绍过。)bigrams()函数接受一个单词列表,并建立一个连续的词对列表。记住,为了能看到结果而不是神秘的”生成器对象”,我们需要使用list()函数︰

  1. >>> sent = ['In', 'the', 'beginning', 'God', 'created', 'the', 'heaven',
  2. ... 'and', 'the', 'earth', '.']
  3. >>> list(nltk.bigrams(sent))
  4. [('In', 'the'), ('the', 'beginning'), ('beginning', 'God'), ('God', 'created'),
  5. ('created', 'the'), ('the', 'heaven'), ('heaven', 'and'), ('and', 'the'),
  6. ('the', 'earth'), ('earth', '.')]

2.2中,我们把每个词作为一个条件,对每个词我们有效的创建它的后续词的频率分布。函数generate_model()包含一个简单的循环来生成文本。当我们调用这个函数时,我们选择一个词(如'living')作为我们的初始内容,然后进入循环,我们输入变量word的当前值,重新设置word为上下文中最可能的词符(使用max());下一次进入循环,我们使用那个词作为新的初始内容。正如你通过检查输出可以看到的,这种简单的文本生成方法往往会在循环中卡住;另一种方法是从可用的词汇中随机选择下一个词。

  1. def generate_model(cfdist, word, num=15):
  2. for i in range(num):
  3. print(word, end=' ')
  4. word = cfdist[word].max()
  5. text = nltk.corpus.genesis.words('english-kjv.txt')
  6. bigrams = nltk.bigrams(text)
  7. cfd = nltk.ConditionalFreqDist(bigrams) ![[1]](/projects/nlp-py-2e-zh/Images/eeff7ed83be48bf40aeeb3bf9db5550e.jpg)

条件频率分布是一个对许多 NLP 任务都有用的数据结构。2.1总结了它们常用的方法。

表 2.1:

NLTK 中的条件频率分布:定义、访问和可视化一个计数的条件频率分布的常用方法和习惯用法。

  1. print('Monty Python')

你也可以输入from monty import *,它将做同样的事情。

从现在起,你可以选择使用交互式解释器或文本编辑器来创建你的程序。使用解释器测试你的想法往往比较方便,修改一行代码直到达到你期望的效果。测试好之后,你就可以将代码粘贴到文本编辑器(去除所有>>>...提示符),继续扩展它。给文件一个小而准确的名字,使用所有的小写字母,用下划线分割词汇,使用.py文件名后缀,例如monty_python.py

注意

要点: 我们的内联代码的例子包含>>>...提示符,好像我们正在直接与解释器交互。随着程序变得更加复杂,你应该在编辑器中输入它们,没有提示符,如前面所示的那样在编辑器中运行它们。当我们在这本书中提供更长的程序时,我们将不使用提示符以提醒你在文件中输入它而不是使用解释器。你可以看到2.2已经这样了。请注意,这个例子还包括两行代码带有 Python 提示符;它是任务的互动部分,在这里你观察一些数据,并调用一个函数。请记住,像2.2这样的所有示例代码都可以从http://nltk.org/下载。