频道栏目
首页 > 资讯 > 其他综合 > 正文

nltk(2)频率分布

17-01-03        来源:[db:作者]  
收藏   我要投稿

nltk(2)频率分布&词操作:函数FreqDist,函数FreqDist方法获取在文本中每个出现的标识符的频率分布。通常情况下,函数得到的是每个标识符出现的次数与标识符的map映射。

标识符 出现次数
are 209
the 660
people 550

fdist = FreqDist(text1)
fdist

FreqDist的常用函数

keys() #获取map对象的键值,返回一个数组
获取文本中最常出现的前20的词
vocabulary = fdist.keys()
vocabulary[1:20]

freq() #获取标识符的频率
获取词whale的频率
fdist.freq('whale') * 100

tabulate() 制表函数,将文本的出现次数绘制成一张二维表格,横向表格。函数首先绘制的是频率分布样本中出现频率最高的。如果给函数提供一个Integer参数P,那么函数将绘制前P个标识符。
参数cumulative用来设置次数是否累加
fdist.tabulate(20, cumulative=True) # 绘制前20个标识符,并出现次数累加

plot()函数绘制图,用法和tabulate相同。
fdist.plot(20, cumulativce=True)

注意从图中可以看出一些介词和冠词占据了词总量的很大一部分,但是这些词却对我们了解文章没有什么帮助,所以要过滤掉这些词

inc(sample)函数,增加样本

fdist.inc(["In","the","beginning"])

N()函数,获取样本总数

fdistN()

max()函数,数值最大的样本

fdist.max()

表达式:for sample in fdist: 以频率递减遍历样本

细粒度的选择词

采用集合论的一些方法和符号进行过滤筛选,这是最基本的。当然还有更好的方法。
#获取文章中词长度大于15的单词
V = set(text1)
long_words = [w for w n V if len(w) > 15]

现在我们已经知道如何找词的频率,并且也知道如何过滤掉长度过长的词。那么可以想象一下,一篇文章中较短的词,例如介词to,of等是一些高频词,但对了解文章无用。同样,一些长度过长的词,一般都是低频词,这些词也不能代表文章的特征。即这些词都不能作为文章的特征词汇。
fdist = FreqDist(text3)
sorted([w for w in set(text3) if len(w) > 7 and fdist[w] > 7])
获取文章中词长在7位以上且词频在7次以上的单词这些词往往能代表文章的特点。

单个元素操作

函数 含义
s.startswith(t) 测试s是否以t开头
s.endswith(t) 测试s是否以t结尾
t in s 测试s是否包含t
s.islower() 测试s中所有字符是否都是小写字母
s.isupper() 测试s中所有字符是否都是大写字母
s.isalpha() 测试s中所有字符是否都是字母
s.isalnum() 测试s中所有字符是否都是字母或数字
s.isdigit() 测试s中所有字符是否都是数字
s.istitle() 测试s是否首字母大写
s.upper() 将s转成大写
s.lower() 将s转成小写
#以-ableness结尾的词
sorted([w for w in set(text1) if (not) w.endswith("ableness")])
#包含gnt的词
sorted([w for in set(text1) if (not) 'gnt' in w])
#首字符大写的词
sorted([w for w in set(text1) if (not) w.istitle()])
#完全由数字组成的词
sorted([w for w in set(text1) if (not) w.isdigit()])
#获取文本中的单词数量,过滤掉大小写,标识符,数字
len(set([w.lower() for w in text1 if w.isalpha()]))

马尔科夫假设

马尔科夫假设,将其应用在词频的检测上就是:文章的单词往往存在依赖关系,即有很多的词是以词组的形式出现的。如red wine,而不是the wine,所以我们假设下一个词的出现之与其前一个词的出现有关,而与之前出现的词无关。(虽然这个假设存在问题,因为我们都知道,有很多的词组不是相邻依赖,而是非相邻依赖,而且词的出现还和上下文有关)

bgrams = nltk.bigrams(text2)     #返回一个generate
bgfdist = FreqDist(list(bgrams))    #返回搭配的频率
bgfdist.plot(10)   #查看前10个出现频率最高的搭配



可以看出这里出现了我们处理单个词频率时出现的问题,介词和一些标识符

nltk给我们提供了获取这种二元组中最频繁搭配的函数——collocations

text2.collocations()

现在假设我们要统计一下在文章中单词长度为多少出现的次数对多。

fdist = FreqDist([len(w) for w in text1])
fdist.items()

相关TAG标签
上一篇:numpy.random.shuffle打乱顺序函数
下一篇:Spring面试题总结
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站