欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python词频统计 生成词云

程序员文章站 2024-03-07 17:59:39
...

博客简介

本篇博客介绍2个第三方库,中文分词库jieba和词云库WordCloud,我们将完成三个例子:

  • 统计英文词汇频率
  • 统计中文文本词汇频率使用jieba库
  • 生成词云

在正式开始之前,我们先安装两个第三方库:中文分词库jieba和词云库WordCloud
python词频统计 生成词云
python词频统计 生成词云

统计英文词汇频率

英文词汇统计十分简单,因为每个单词之间都是用空格分开的的,当然也有一些特殊模号,我们将对整个文本进行噪音处理,然后将其分割成单词,存入字典中,再给词汇按照频率排序,步骤如下:

  • 从文件流 中读取一段全英文文本
  • 将文本用lower()归一化成小写形式
  • 将文本中的特殊符号:;<>"aaa@qq.com#$%^&*()-+[]|{}/*.,?过滤,替换成空格for ch in ';<>"aaa@qq.com#$%^&*()-+[]|{}/*.,?':replace
  • 将文本split,划分成单个单词,返回一个列表
  • 遍历这个列表,按照单词=>出现次存入字典中:counts[x]=counts.get(x,0)+1
  • 使用items()返回一个列表,给列表排序
  • 格式化输出这个列表
  • 代码如下:
#coding=gbk
def getText(fileName):
	f=open(fileName,'r')
	txt=f.read().lower()
	for ch in ';<>"aaa@qq.com#$%^&*()-+[]|{}/*.,?':
		txt=txt.replace(ch,' ')
	f.close()
	return txt
	
def comp(x):
	return x[1]
	
def main():
	
	txt=getText('English.txt')
	words=txt.split()
	counts={}
	for x in words:
		counts[x]=counts.get(x,0)+1
	items=list(counts.items())
	items.sort(key=comp,reverse=True)

	for i in range(10):
		key,value = items[i]
		print("{0:<10} {1:>5}".format(key,value))
main()
  • 读入文件:
    python词频统计 生成词云
  • 输出结果:
you           32
to            19
the           10
who           10
those          9
have           8
and            8
that           6
want           6
make           6

统计中文词汇频率

中文语句和英文不一样,中文词汇之间没有空格而是连续的字段,如何对一段文本进行分词处理呢?我们可以安装第三方库jeiba,它使用中文词库的方式来识别词汇:依靠中文词库计算出某个词汇的概率,从而确定某段文字是不是词汇,我们只需要在cmd中打开script目录,输入pip install jieba即可完成安装,常用函数如下:

函数 描述 举例
jieba.lcut(s) 精确模式,把文本精确地切分开,不存在冗余,返回一个列表类型的分词结果 jieba.lcut('中国是一个伟大的国家')
jieba.lcut(s,cut_all=True) 全模式,把文本中所有可能的词汇都扫描出来,存在冗余,返回一个列表类型的分词结果 jieba.lcut('中国是一个伟大的国家',cut_all=True)
jieba.lcut_for_search(s) 搜索引擎模式,在精确模式的基础上对长词进行切分,返回一个列表类型的分词结果 jieba.lcut_for_search('中国是一个伟大的国家')
jieba.add_word(s) 将新词汇添加到词库中 jieba.add_word(‘我爱python’)
  • 举例:
#coding=gbk
import jieba
def main():
	print(jieba.lcut('中国是一个十分美丽的国家'))
	print(jieba.lcut('中国是一个十分美丽的国家',cut_all=True))
	print(jieba.lcut_for_search('中国是一个十分美丽的国家'))
main()
'''
['中国', '是', '一个', '十分', '美丽', '的', '国家']
['中国', '国是', '一个', '一个十', '十分', '美丽', '的', '国家']
['中国', '是', '一个', '十分', '美丽', '的', '国家']
'''

说完jieba库,我们要开始统计词频了,如何统计?步骤和统计英文相似,不过有了jieba的加持,这变得更为简单:

  • 从文件流 中读取一段全中文文本
  • 直接使用jieba.lcut(txt)将文本切分,返回一个列表
  • 当然这个列表中包含了字符,我们可以直接在遍历过程中不统计len=1的字符
  • 遍历这个列表,按照单词=>出现次存入字典中:counts[x]=counts.get(x,0)+1
  • 使用items()返回一个列表,给列表排序
  • 格式化输出这个列表
  • 代码如下:
#coding=utf-8
import jieba
def getText(fileName):
	f=open(fileName,'r',encoding='utf-8')
	txt=f.read()
	f.close()
	return txt
	
def comp(x):
	return x[1]
	
def main():
	txt=getText('Chinese.txt')
	words=jieba.lcut(txt)
	counts={}
	for x in words:
		if len(x)==1:
			continue
		else:
			counts[x]=counts.get(x,0)+1
	items=list(counts.items())
	items.sort(key=comp,reverse=True)

	for i in range(10):
		key,value = items[i]
		print("{0:<10} {1:>5}".format(key,value))
main()

  • 文本读入
    python词频统计 生成词云
  • 统计结果:
'''
可以             9
藏不住            4
如果             3
一天             3
我们             3
一个             3
男人             3
每个             3
那里             3
不怪             3
'''

生成词云

生成词云我们是用的是wordcloud库,这个库可以将给定的一段文本按照空格镜像区分,按照频率显示在一张图片上,频率越高,字体越大,函数以及参数如下:

  • 生成词云对象wordcloud.WordCloud([width][,height][,min_font_size],[,max_font_size][,font_path][,max_words][,stop_words][,mask])
  • 参数属性:
函数 描述 举例
width 词云对象的宽度,默认400 w=wordcloud.WorldCloud(width=800)
height 词云对象的高度,默认600 w=wordcloud.WorldCloud(height=800)
min_font_size 指定词云中字体的最小号,默认为4号 w=wordcloud.WorldCloud(min_font_size=10)
max_font_size 指定词云字体的最大号,默认根据高度自动调节 w=wordcloud.WorldCloud(max_font_size=20)
font_step 指定词云中字体字号的步进间隔,默认为1 w=wordcloud.WorldCloud(font_step=2)
font_path 指定字体文件的路径,默认为None w=wordcloud.WorldCloud(font_path='msyh.ttc')
max_words 指定词云中的最大显示单词数量,默认200 w=wordcloud.WorldCloud(max_words=100)
stop_words 指定词云中的排除词列表,列表中的词汇将不会出现在词云中 w=wordcloud.WorldCloud(stop_words={"python"})
mask 指定词云形状,默认为长方形,需要引用imread()函数 >>> from scipy.misc import imread >>> mk=imread('pic.png') >>>w=wordcloud.WordCloud(mask=mk)
background_color 指定词云图片的背景颜色,默认为黑色 w=wordcloud.WorldCloud(background_color='white')
  • 将文本加载到词云对象:w.generate(txt)
  • 将词云对象导出成文件: w.to_file(fileName)
  • wordcloud根据空格来区分单词,并且会自动过滤符号
  • 代码如下:(根据QQ消息记录,过滤掉头衔和@后生成词云)
#coding=gbk
#coding=utf-8
import wordcloud
import jieba
def getText(fileName):
	f=open(fileName,'r',encoding='gbk')
	txt=''
	for line in f:
		if ('【' in line) or ('】' in line) or ('@' in line):continue
		else:txt+=line
	f.close()
	txt=' '.join(jieba.lcut(txt))
	return txt
def main():
	txt=getText('test.txt')
	w=wordcloud.WordCloud(font_path='msyh.ttc',width=800,height=600,max_words=40,font_step=3)
	w.generate(txt)
	w.to_file('wordcloud3.png')
	print('make wordCloud successfully!')
main()

  • 复制好友的消息记录
    python词频统计 生成词云
  • 展示效果:
    python词频统计 生成词云
相关标签: Python