条件频率分布就是频率分布的集合,每个频率分布有一个不同的“条件”,这个条件通常是文本的类别。当语料文本分为几类(文体,主题,作者等)时,可以计算每个类别独立的频率分布,这样,就可以通过条件频率分布研究类别之间的系统性差异。通常,我们用nltk的ConditionalFreqDist数据类型来实现的。

1. 条件和事件

频率分布计算观察到的事件,如本文中出现的词汇。条件频率分布需要给每个事件关联一个条件,所以不是处理一个词序列,而是要处理一系列配对序列。

>>> text=['The', 'Fulton', 'County', 'Grand', 'Jury', 'said']
>>> pairs = [('news', 'The'), ('news', 'Fulton'), ('news', 'County')]
>>>

每对的形式是:(条件,事件)。

2. 按文体统计词汇

1)输入

FreqDist()以一个简单的链表作为输入,ConditionalFreqDist()以一个配对链表作为输入。

2)遍历文体,产生配对

对于每个文体,遍历文体中的每个词以产生文体与词的配对。这里以“新闻”和“言情”两种文体为例。

>>> from nltk.corpus import brown
>>> genre_word = [(genre, word)
... for genre in ['news', 'romance']
... for word in brown.words(categories=genre)]
>>> len(genre_word)
170576
>>> genre_word[:4]
[('news', 'The'), ('news', 'Fulton'), ('news', 'County'), ('news', 'Grand')]
>>>

3)使用此配对链表创建一个ConditionalFreqDist,并保存。

>>> cfd = nltk.ConditionalFreqDist(genre_word)
>>> cfd
<ConditionalFreqDist with 2 conditions>
>>> cfd.conditions()
['romance', 'news']
>>> cfd['news']
FreqDist({'the': 5580, ',': 5188, '.': 4030, 'of': 2849, 'and': 2146, 'to': 2116
, 'a': 1993, 'in': 1893, 'for': 943, 'The': 806, ...})
>>> cfd['romance']
FreqDist({',': 3899, '.': 3736, 'the': 2758, 'and': 1776, 'to': 1502, 'a': 1335,
'of': 1186, '``': 1045, "''": 1044, 'was': 993, ...})
>>> cfd['romance']['could']
193
>>>

3.绘制分布图和分布表

除了组合两个或两个以上的频率分布及更容易初始化之外,ConditionalFreqDist还为制表和绘图提供了一些有用的方法。

>>> import nltk
>>> from nltk.corpus import udhr
>>> languages = ['Chickasaw', 'English', 'German_Deutsch', 'Greenlandic_Inuktiku
t', 'Hungarian_Magyar', 'Ibibio_Efik']
>>> cfd = nltk.ConditionalFreqDist(
... (lang, len(word))
... for lang in languages
... for word in udhr.words(lang+'-Latin1'))
>>> cfd.plot(cumulative=True)
>>> cfd.tabulate(conditions=['English', 'German_Deutsch'], samples=range(10), cu
mulative=True)
0 1 2 3 4 5 6 7 8 9
English 0 185 525 883 997 1166 1283 1440 1558 1638
German_Deutsch 0 171 263 614 717 894 1013 1110 1213 1275
>>>

该图是基于上面代码绘制出来的一个条件频率分布图。条件是语言的名称,图中的计数来源于单词长度。它利用了这样一个特点:即每一种语言的文件名是语言名称及后面紧跟着‘-Latin1’(字符编码)。

在plot()和tabulate()方法中,可以使用conditions=参数来指定显示哪些条件。如果我们忽略它,所有条件都会显示出来。同样,可以使用samples=参数来限制要显示的样本,这能将大量数据载入到一个条件频率分布,然后通过选定条件和样品,对完成的绘图或制表进行探索。这也使我们能全面控制条件和样本的显示顺序。如上面,为两种语言和长度少于10个字符的词汇绘制累计频率数据表,如上面代码输出显示。

4.使用双连词生成随机文本

1)产生双连词

>>> sent=['In', 'the', 'begining']
>>> nltk.bigrams(sent)
<generator object bigrams at 0x03C3E4E0>
>>> mt = nltk.bigrams(sent)
>>> mt
<generator object bigrams at 0x0455A058>

2)创建随机本文

>>> sent=['In', 'the', 'begining']
>>> nltk.bigrams(sent)
<generator object bigrams at 0x03C3E4E0>
>>> mt = nltk.bigrams(sent)
>>> mt
<generator object bigrams at 0x0455A058>
>>> cfd=nltk.ConditionalFreqDist(mt)
>>> cfd.tabulate()
begining the
In 0 1
the 1 0
>>> cfd.plot()
>>>

python 自然语言处理(三)____条件频率分布的更多相关文章

  1. 转-Python自然语言处理入门

      Python自然语言处理入门 原文链接:http://python.jobbole.com/85094/ 分享到:20 本文由 伯乐在线 - Ree Ray 翻译,renlytime 校稿.未经许 ...

  2. Python自然语言处理-系列一

    一:python基础,自然语言概念 from nltk.book import * 1,text1.concordance("monstrous")      用语索引 2,tex ...

  3. Python自然语言工具包(NLTK)入门

    在本期文章中,小生向您介绍了自然语言工具包(Natural Language Toolkit),它是一个将学术语言技术应用于文本数据集的 Python 库.称为“文本处理”的程序设计是其基本功能:更深 ...

  4. 《Python自然语言处理》第二章 学习笔记

    import nltk from nltk.book import * nltk.corpus.gutenberg.fileids() emma = nltk.corpus.gutenberg.wor ...

  5. 《Python自然语言处理》

    <Python自然语言处理> 基本信息 作者: (美)Steven Bird    Ewan Klein    Edward Loper 出版社:人民邮电出版社 ISBN:97871153 ...

  6. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

  7. Python自然语言处理(1):初识NLP

    由于我们从美国回来就是想把医学数据和医学人工智能的事认真做起来,所以我们选择了比较扎实的解决方法,想快速出成果的请绕道.我们的一些解决方法是:1.整合公开的所有医学词典,尽可能包含更多的标准医学词汇: ...

  8. python高级(三)—— 字典和集合(泛映射类型)

    本文主要内容 可散列类型 泛映射类型 字典 (1)字典推导式 (2)处理不存在的键 (3)字典的变种 集合 映射的再讨论 python高级——目录 文中代码均放在github上:https://git ...

  9. Python 学习 第三天 课后总结:

    PYTHON学习第三天课后总结: 1,注释:就是对代码起到说明注解的作用.   注释分为单行注释与多行注释.  单行注释:只注释一行代码在需要注释的所在行的行首使用#号来注释此行,注意#与代码之间需要 ...

随机推荐

  1. 借助JCharDet获取文件字符集

    前段时间,在学习lucene的时候,遇到了读取txt文档遇到编码错误的问题.学了几个解决方案,大部分是将文件转十六进制(可以使用UE的Ctrl+H来查看),读取开头的四个标志位来判断.可是总有些文本文 ...

  2. Ajax请求导出Excel的问题

    文章转载自: http://yuwenlin.iteye.com/blog/2275289 Ajax请求导出Excel的问题描述: 前端发起Ajax请求get或post,后台使用Poi生成excel文 ...

  3. Xcode打包上传遇到的坑

    1.安装测试包的时候提示APIInternalError ①是否增加了测试设备的UUID ②是否使用adhoc证书打包 2.打包错误:error: couldn't remove '/Users/xx ...

  4. docker 安装完mysql 后客户端无法访问

    1.在虚拟机的centos 中安装 docker 的mysql 镜像. docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12 ...

  5. 关于 Oracle DB CONSTRAINT约束的一些SQL ORA-02292: integrity constraint violated

    ALTER TABLE table_name DISABLE CONSTRAINT constraint_name; select * from all_constraints where owner ...

  6. proc-virtual-file-system

    内核代码中分别找出一处 proc 和 seq_file 的完整使用过程,记录下来 在用户空间进行相应"读"."写" 介绍 Proc 虚拟文件系统 操作 proc ...

  7. sgu

    dp第几朵花放第几瓶 104 数论 能不能除3:105    106(ex_gcd引入t求范围交)     107(大数乘的FFT) 开空间技巧108 棋盘黑白格消除109(组合数学) java平方根 ...

  8. canvas学习之折线图

    接着上一张柱状图讲,我们是使用折线图: import {canvasPoint} from '../../assets/js/canvas';import {basicInfo,histogramMo ...

  9. matlab:统计矩阵中某元素的个数

    三种统计方法: A=ceil(rand(,)*); a=; %第一种 sum(A(:)==a): %第二种 length(find(A==a); %第三种 logical=(A=a); sum(log ...

  10. VitrualBox、vagrant、homestead的关系

    VitrualBox 是一款非常强大的免费虚拟机软件,使用者可以在 VitrualBox 上安装并运行 Linux.Windows.Mac OS X 等操作系统,类似的软件还有 VMware Vagr ...