第7节 条件频率分布
目录
1 按文体计数词汇
2 绘制分布图和分布表
3 使用双连词生成随机文本
1 按文体计数词汇
前面我们学习过使用FreqDist(textlist)函数来计算textlist链表中每个项目出现的次数,现在我们推广这一想法。
当语料文本分为几类(文体、主题、作者)时,可以计算每个类别独立的频率分布,这样就可以研究类别之间的系统性差异。——nltk.ConditionalFreqDist来实现。
条件频率分布是频率分布的集合,每个频率分布有一个不同的‘条件’(通常为文本的类别)——(条件,事件)的形式。
如果我们按照问题处理整个布朗语料库,将得到15个条件(一个文体一个条件)和1161192个事件(一个词一个事件):
上面两行代码就是对brown语料库按照问题进行统计单词的数量,我们也可以只看部分问题,例如:新闻和言情
genre_word = [(genre, word)
for genre in [‘news’, ‘romance’]
for word in brown.words(categories=genre)]
m = len(genre_word)
print(m)
上面生成的genre_word前面配对会是(‘news’,word)的形式,而后面会是(‘romance’,word)的形式
现在我们就可以对此链表创建一个ConditionalFreqDist:
cfd = nltk.ConditionalFreqDist(genre_word)
n = cfd.conditions()
print(cfd)
print(n)
这两个条件他们每一个只有一个频率分布。要访问某个条件的某个单词的频率,只需和访问字典元素一样操作即可:例如访问’Romance’下的’could’频率:
n1 = cfd[‘romance’][‘could’]
print(n1)
2 绘制分布图和分布表
除了组合两个或两个以上的频率分布和更容易初始化之外,ConditionalFreqDist 还为制表和绘图提供了一些有用的方法。
频率分布图是基于下面的代码产生的一个条件频率分布绘制的。条件是词 freedom或 hope,被绘图的计数是在特定演讲中出现的词的次数。
【例2-1】绘制分布图:cfd.plot(),绘制特定演讲中出现[’ freedom’,‘hope’]的次数随时间变化情况。
【例2-1】代码如下:
cfd=nltk.ConditionalFreqDist((target,fileid[:4])
for fileid in inaugural.fileids()
for w in inaugural.words(fileid)
for target in [‘freedom’,‘hope’]
if w.lower().startswith(target))
cfd.plot()
【例2-1】运行结果如下:
在使用plot和tabulate时候可以使用condition=参数来制定显示哪些条件。同样也可以使用samples=参数 来限制要显示的样本。
【例2-2】查看英语和德语中单词长度小于10个字符的词汇个数。
【例2-2】代码如下:
【例2-2】运行结果如下:
3 使用双连词生成随机文本
使用条件频率分布创建一个双连词表。bigrams()函数接受一个词汇链表,并建立一个连续的词对链表。
sent=[‘In’,‘the’,‘begining’,‘God’,‘created’,‘the’,‘heaven’,‘and’,‘the’,‘earth’,‘.’]
print(list(nltk.bigrams(sent)))
【例2-3】产生随机文本:程序获得《创世纪》文本中所有的双连词,然后构造一个条件频率分布来记录哪些词汇最有可能会跟在给定词后面。generate_model()函数适用这些数据和种子词来产生随机文本。
【例2-3】代码如下:
【例2-3】运行结果如图
thank you