条件频率分布就是频率分布的集合,每个频率分布有一个不同的“条件”,这个条件通常是文本的类别。当语料文本分为几类(文体,主题,作者等)时,可以计算每个类别独立的频率分布,这样,就可以通过条件频率分布研究类别之间的系统性差异。通常,我们用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. tp框架之函数调用

    1.如果要在一个方法里面调用另一个方法,可以先用A方法实例化控制器 $m = A("控制器名"); ,然后根据方法名调用 $m->方法名(可传参数); 2.自定义函数库  ( ...

  2. 为什么要重写hashcode() 方法

    Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 那么我们怎么判断两个元素是否重复呢? 这就是 ...

  3. <s:url>指向的Action只执行一次,清除浏览器缓存文件后又可执行一次。

    Action中的方法仅为静态变量赋值,而其他访问数据库的Action可以被重复执行. 起初判断可能是静态变量的内存机制导致不能重复执行. 然后发现清楚浏览器缓存文件后又可以执行一次了,看来原因在Jsp ...

  4. 【iOS】屏幕旋转,屏幕自适应方向变化

    1. iOS有四个方向的旋转,为了保证自己的代码能够支持旋转,我们必须首先处理一个函数: - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInter ...

  5. 源泉书签,助您管理海量收藏。www.yuanquanshuqian.com,今日更新:多标签功能已实现

    源泉书签.助您管理海量收藏.www.yuanquanshuqian.com,今日更新:多标签功能已实现

  6. ubuntu mysql编码设置5.5以后

    安装了mysql. 版本:5.5.28 操作系统 :ubuntu 12.10 mysql> show variables like 'character%'; +---------------- ...

  7. Docker 创建容器以及管理命令(三)

    1. 创建 Apache 容器 [root@centos7 ~]# docker run -d -p : httpd // -d: 放入后台运行 // -p: 指定端口映射关系(第一个为本地端口.第二 ...

  8. 用FPGA对ASIC进行原型验证的过程(转)

    用FPGA对ASIC进行原型验证的过程   reference:http://xilinx.eetrend.com/d6-xilinx/article/2018-10/13736.html     鉴 ...

  9. dedecms {dede:php}标签用法介绍

    最简单的输入如 代码如下 复制代码 {dede:php} $numA = 1; $numB = 2; echo $numA + $numB; {/dede:php} 从上面语句可以看出dede:php ...

  10. linux对文件赋权限的命令chmod的详细说明

    指令名称 : chmod使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案调 ...