NLTK学习3:语言计算:简单统计

3语言计算:简单统计

在本节中,我们将探讨使文本与众不同的问题,并使用自动方法来查找文本的特征词和表达。

saying = ['After', 'all', 'is', 'said', 'and', 'done',
          'more', 'is', 'said', 'than', 'done']
tokens = set(saying)
tokens = sorted(tokens)
print(tokens[-2:])

在这里插入图片描述

3.1 频率分布

我们如何自动识别最能提供有关文本主题和体裁信息的文本单词?想象一下如何找到一本书中50个最常见的单词。一种方法是保持每个词汇表的计数,如3.1所示。计数将需要成千上万行,这将是一个非常费力的过程。如此费力,我们宁愿将任务分配给机器。
图3.1:计算文本中出现的单词数(频率分布)
在这里插入图片描述

3.1中的表格称为频率分布,它告诉我们文本中每个词汇项的频率。(通常,它可以计数任何类型的可观察事件。)这是“分布”,因为它告诉我们文本中单词标记的总数如何分布在各个词汇项之间。由于我们在语言处理中经常需要频率分布,因此NLTK为它们提供了内置支持。让我们使用 FreqDist 查找 Moby Dick 的50个最常见的单词:

fdist1 = FreqDist(text1)
print(fdist1)   #具有19317个样本和260819个结果的FreqDist
print(fdist1.most_common(50))  #50种最常见类型的列表
print(fdist1['whale'])

在这里插入图片描述
最后一行示例代码中产生的任何单词都有助于我们掌握本文的主题或体裁吗?whale只有一个词,内容丰富!它发生了900次以上。其余的单词对我们没有任何启示。他们只是英文的“管道”。这些单词占文本的比例是多少?我们可以使用

import matplotlib.pyplot as plt
fdist1.plot(50,cumulative = True)
plt.show()

为这些单词生成一个累积频率图,以生成3.2中的图。这50个字占了整本书的近一半!
图3.2:Moby Dick中50个最常见单词的累积频率图:这些占比例的近一半。
在这里插入图片描述

3.2 单词的细粒度选择

接下来,让我们看一下文本的长词;也许这些将更具特色和提供更多信息。为此,我们采用集合论的一些表示法。我们想从文本词汇中找到超过15个字符的单词。让我们将此属性称为P,这样,当且仅当w的长度超过15个字符时,P(w)才为true 。现在,我们可以使用(1a)中所示的数学集表示法来表达感兴趣的单词。这意味着“所有w的集合,使得 w 是V(词汇​​)的元素,并且w具有属性 P 。
(1)
a. {w | w ∈ V & P(w)}

b. [w for w in V if p(w)]
相应的Python表达式在(1)b 中给出。(请注意,它产生的是列表,而不是集合,这意味着可以重复。)观察这两种表示法有多么相似。让我们再走一步,编写可执行的Python代码:

V = set(text1)
long_words = [w for w in V if len(w) > 15]
print(sorted(long_words))

在这里插入图片描述

对于词汇表V中的每个单词w,我们检查 len(w)是否大于15。其他所有单词将被忽略。稍后我们将更仔细地讨论此语法。
让我们回到寻找文字特征词的任务。请注意,在长字text4反映了国家重点-宪法,跨洲-而那些在text5反映其非正式的内容: boooooooooooglyyyyyy和yuuuuuuuuuuuummmmmmmmmmmm。我们是否成功地自动提取出代表文本的单词?好吧,这些很长的单词通常是词首(即唯一的),也许最好找到经常出现的 长单词。这似乎有希望,因为它消除频繁的短词(例如,在)和罕见的长字(如antiphilosophists)。以下是聊天语料库中所有超过七个字符且重复出现七次以上的单词:

fdist5 = FreqDist(text5)
print(sorted(w for w in set(text5) if len(w) > 7 and fdist5[w] > 7))

在这里插入图片描述

注意我们如何使用两个条件:len(w)> 7确保单词长于七个字母,而fdist5 [w]> 7确保这些单词出现七次以上。最后,我们设法自动识别出文本中经常出现的带有内容的单词。这是一个适度但重要的里程碑:一小段代码,处理成千上万个单词,产生一些有用的输出。

3.3 搭配和二元

搭配是异常经常发生一起字序列。因此,红酒是一种搭配,而红酒不是。搭配的一个特点是它们不易被具有相似含义的单词替代;例如,栗色的酒听起来确实很奇怪。
为了处理并置问题,我们首先从文本中提取单词对列表,也称为 bigrams。这可以通过bigrams()函数轻松实现:

print(list(bigrams(['more','is','said','than','done'])))

在这里插入图片描述
在这里,我们看到成对的单词than-done是一个双字母组,并且在Python中将其编写为(‘than’,‘done’)。现在,并置基本上只是常见的二元组,除了我们希望更多地关注涉及稀有单词的情况。尤其是,我们希望根据各个单词的出现频率,发现比我们期望的更频繁出现的二元词。在搭配()函数做到这一点对我们来说。我们将在以后看到它的工作方式。
在这里插入图片描述
出现的搭配是非常具体的文本类型。为了找到 搭配的红酒,我们需要处理大量文本。

3.4 计算其他事物

数词是有用的,但我们也可以数其他东西。例如,我们可以通过 从一长串数字中创建一个 FreqDist 来查看文本中单词长度的分布,其中每个数字都是text中相应单词的长度:
[1]
在这里插入图片描述
[2]我们通过派生词的长度的名单开始的text1 [1]和FreqDist然后计数次,每次这些发生的数量.
[3]是一个分布,其中包含四分之一的百万个项目,每个项目都是与文本中的单词标记相对应的数字。但是最多只计数20个不同的项目(数字1到20),因为只有20个不同的字长。即,有些单词仅由一个字符,两个字符,…,二十个字符组成,但没有一个包含二十一个或多个字符。
在这里插入图片描述
人们可能会想知道单词的不同长度有多频繁(例如,文本中出现了多少个长度为4的单词,长度为5的单词多于长度4的单词,等等)。我们可以这样做,如下所示:
在这里插入图片描述
在这里插入图片描述

从中我们可以看到,最常见的单词长度是3,而长度3的单词大约占构成该书的单词的50,000(或20%)。尽管我们不会在此处继续进行介绍,但对字长的进一步分析可能有助于我们理解作者,体裁或语言之间的差异。

表3.4:为NLTK的频率分布定义的功能
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值