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

    JS 相信看这篇文章的你们,都和我一样对Hadoop和Apache Spark的选择有一定的疑惑,今天查了不少资料,我们就来谈谈这两种 平台的比较与选择吧,看看对于工作和发展,到底哪个更好. 一.Ha ...

  2. 《剑指offer》第六十三题(股票的最大利润)

    // 面试题63:股票的最大利润 // 题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股 // 票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5 ...

  3. dockerfile debian 和pip使用国内源

    python官方镜像是基于debian的.国内使用时定制一下,加快下载速度. 1 debian本身使用国内源 dockfile中: #国内debian源 ADD sources.list /etc/a ...

  4. Codeforces 1005 F - Berland and the Shortest Paths

    F - Berland and the Shortest Paths 思路: bfs+dfs 首先,bfs找出1到其他点的最短路径大小dis[i] 然后对于2...n中的每个节点u,找到它所能改变的所 ...

  5. 虚拟机中不能连接usb设备解决办法

    虚拟机中不能连接usb设备解决办法 1.点击开始->运行,在对话框中输入"services.msc",确定,打开windows服务管理器.2.在服务列表中选中"VM ...

  6. JavaScript学习第一天(一)

    JavaScript介绍 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本 ...

  7. java学习进度

    上周日玩的比较high,忘记写进度报告,今天补上.通过这些天的学习,我对java有了初步的认识,java和c有很多的不同和相同之处,然后就是java的代码在记事本里写,等慢慢深入之后又可以用eclip ...

  8. 20170914xlVBA通讯公司分类汇总

    Sub 租房() Dim Wb As Workbook Dim Sht As Worksheet Dim OpenWb As Workbook Dim OpenSht As Worksheet Dim ...

  9. HDOJ 1022 Train Problem

    两个数组存进出顺序,如果不同进栈,相同出栈.

  10. android -------- 常用依赖库

    //  bannercompile 'com.youth.banner:banner:1.4.9' // recyclecompile 'com.android.support:recyclervie ...