2.4 使用双连词生成随机文本
我们可以使用条件频率分布创建一个双连词表(词对)。(我们在3中介绍过。)bigrams()
函数接受一个单词列表,并建立一个连续的词对列表。记住,为了能看到结果而不是神秘的”生成器对象”,我们需要使用list()
函数︰
>>> sent = ['In', 'the', 'beginning', 'God', 'created', 'the', 'heaven',
... 'and', 'the', 'earth', '.']
>>> list(nltk.bigrams(sent))
[('In', 'the'), ('the', 'beginning'), ('beginning', 'God'), ('God', 'created'),
('created', 'the'), ('the', 'heaven'), ('heaven', 'and'), ('and', 'the'),
('the', 'earth'), ('earth', '.')]
在2.2中,我们把每个词作为一个条件,对每个词我们有效的创建它的后续词的频率分布。函数generate_model()
包含一个简单的循环来生成文本。当我们调用这个函数时,我们选择一个词(如'living'
)作为我们的初始内容,然后进入循环,我们输入变量word
的当前值,重新设置word
为上下文中最可能的词符(使用max()
);下一次进入循环,我们使用那个词作为新的初始内容。正如你通过检查输出可以看到的,这种简单的文本生成方法往往会在循环中卡住;另一种方法是从可用的词汇中随机选择下一个词。
def generate_model(cfdist, word, num=15):
for i in range(num):
print(word, end=' ')
word = cfdist[word].max()
text = nltk.corpus.genesis.words('english-kjv.txt')
bigrams = nltk.bigrams(text)
cfd = nltk.ConditionalFreqDist(bigrams) ![[1]](/projects/nlp-py-2e-zh/Images/eeff7ed83be48bf40aeeb3bf9db5550e.jpg)
条件频率分布是一个对许多 NLP 任务都有用的数据结构。2.1总结了它们常用的方法。
表 2.1:
NLTK 中的条件频率分布:定义、访问和可视化一个计数的条件频率分布的常用方法和习惯用法。
print('Monty Python')
你也可以输入from monty import *
,它将做同样的事情。
从现在起,你可以选择使用交互式解释器或文本编辑器来创建你的程序。使用解释器测试你的想法往往比较方便,修改一行代码直到达到你期望的效果。测试好之后,你就可以将代码粘贴到文本编辑器(去除所有>>>
和...
提示符),继续扩展它。给文件一个小而准确的名字,使用所有的小写字母,用下划线分割词汇,使用.py
文件名后缀,例如monty_python.py
。
注意
要点: 我们的内联代码的例子包含>>>
和...
提示符,好像我们正在直接与解释器交互。随着程序变得更加复杂,你应该在编辑器中输入它们,没有提示符,如前面所示的那样在编辑器中运行它们。当我们在这本书中提供更长的程序时,我们将不使用提示符以提醒你在文件中输入它而不是使用解释器。你可以看到2.2已经这样了。请注意,这个例子还包括两行代码带有 Python 提示符;它是任务的互动部分,在这里你观察一些数据,并调用一个函数。请记住,像2.2这样的所有示例代码都可以从http://nltk.org/
下载。