超级详细使用jieba分词用wordcloud制作词云并进行词频统计实例

最近学习机器学习课程,学到文本分类就研究了下词云如何处理,写下代码和文件以便帮助更多的人,个人变成基础极其薄弱,如有问题请自行修改相关代码。

准备工作

使用命令安装jieba 分词,这里已经帮大家写好了阿里云的镜像复制使用即可。

pip install jieba -i https://mirrors.aliyun.com/pypi/simple/

另外一个下载下我的文件,我这里使用的是长篇小说《白鹿原》,有需要的可以使用。

文件中包含了:文本(白鹿原.txt)(废都.txt)、jieba自定义词典(dictionary.txt)、调停词4个(cn_stopwords.txt(哈工大)、hit_stopwords.txt、baidu_stopwords.txt、scu_stopwords.txt)、词云背景图(bailuyuan.png)。
https://download.csdn.net/download/microspore/13626754

处理文本

处理文档分文三部分:自定义字典、文本处理、停用词处理。
**自定义字典。**主要是补充jieba的词典,分词时会将自定义词典里的词进行区分开,注意定义时是txt格式单个字占一行,护体详见我文本。
**文本处理。**主要是利用jieba,cut将文本区分开,当然jieba有三种分词方式,具体可以看一些官方文档介绍。
**停用词处理。**停用词处理这里不是在jieba中屏蔽停用词,而是词云中屏蔽停用词。
这里需要注意的是读取文本时,可能有一些编码错误,如果是utf-8,就不需要增加编码了,如果是GBK,就需要了。

报错 UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x9c in position 28: illegal multibyte sequence

另外分词时,会分出单个词,很多时候单个词没必要,可以将单个词进行屏蔽。
在这里插入图片描述

词云

以下是词云的相关参数,这里说一点如果字体不清晰就调整scale参数。
另外如果提示,则说明可能字体问题,报以下错误

OSError: cannot open resource

以下是词云的相关参数:

这里是引用某位兄台博客 https://blog.csdn.net/kouyi5627/article/details/80530569
font_path : string #字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = ‘黑体.ttf’
width : int (default=400) #输出的画布宽度,默认为400像素
height : int (default=200) #输出的画布高度,默认为200像素
prefer_horizontal : float (default=0.90) #词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
mask : nd-array or None (default=None) #如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread(‘读取一张图片.png’),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。
scale : float (default=1) #按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍
min_font_size : int (default=4) #显示的最小的字体大小
font_step : int (default=1) #字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差
max_words : number (default=200) #要显示的词的最大个数
stopwords : set of strings or None #设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
background_color : color value (default=”black”) #背景颜色,如background_color=‘white’,背景颜色为白色
max_font_size : int or None (default=None) #显示的最大的字体大小
mode : string (default=”RGB”) #当参数为“RGBA”并且background_color不为空时,背景为透明
relative_scaling : float (default=.5) #词频和字体大小的关联性
color_func : callable, default=None #生成新颜色的函数,如果为空,则使用 self.color_func
regexp : string or None (optional) #使用正则表达式分隔输入的文本
collocations : bool, default=True #是否包括两个词的搭配
colormap : string or matplotlib colormap, default=”viridis” #给每个单词随机分配颜色,若指定color_func,则忽略该方法
random_state : int or None #为每个单词返回一个PIL

词频统计

遍历所有值进行统计,最后偷懒使用pandas转成txt。

以下为源代码

import  jieba   #jieba分词包  
from PIL import Image #图片的处理
import matplotlib.pyplot as plt # 主要进行词云绘图
import numpy as np  #进行转换
import  wordcloud  #词云
import pandas as pd #保存词频
#使用jieba对文本进行处理
#读取自定义词典。
jieba.load_userdict(r"C:\Users\Administrator\Desktop\bailuyaun\dictionary.txt") #读取自定义词典
#进行文本处理
file=open(r"C:\Users\Administrator\Desktop\bailuyaun\白鹿原.txt",encoding ="utf-8")#打开要制作词云的文本
text=file.read()#读取文本
file.close()#关闭文件
wordlist = list(jieba.cut(text)) #进行分词处理,这里使用cut,
print(type(wordlist))
wordlist = [word for word in wordlist if len(word)>1]# 该条主要是为了排除一个字符以下的词,没有这条文本将会分出都是单字。

#print(type(wordlist))
word = " ".join(wordlist)#该条将分好的列表词,转为空格分隔的字符串
#print(type(word))

#停用词处理
stopfile=open(r"C:\Users\Administrator\Desktop\bailuyaun\cn_stopwords.txt",encoding ="utf-8")#读取停用词
stopword=stopfile.read().split("\n")#读取的停用词都带"\n"需要进行删除
stopfile.close #关闭文档


# 词云处理
imgpath=np.array(Image.open( r"C:\Users\Administrator\Desktop\bailuyaun\bailuyuan.png"))#定义下词云背景图片路径
wc = wordcloud.WordCloud( font_path='C:\Windows\Fonts\STSONG.TTF',  #注意不一定有这个字体自己到 fonts下找个即可。
                          background_color='white',
                          mask=imgpath,
                          max_words=200,
                          max_font_size=100,
                          width=900,
                          height=900,
                          scale=17,
                          random_state=5,stopwords=stopword)
wc.generate(word)#传入需画词云图的文本
#对词云进行展示
plt.imshow(wc)

plt.axis("off")# 隐藏图像坐标轴
plt.savefig(r"bar_img.png", dpi=400)#保存图片
plt.show()# 展示图片
plt.close()#关闭图片
#词频统计
counts = {} # 新建立一个空的字典
for i in wordlist: # 循环遍历所有的单词
    counts[i] = counts.get(i,0)+1 # 返回word这个键对应的值,只要是出现的单词都默认值为 1,下次如果再遇到就加一
items = list(counts.items()) # 将字典中的值都放入列表中,这个时候应该是一个元组类型的列表
#对列表大到小排序
items.sort(key=lambda x:x[1],reverse=True) # lambda关键字表示按照后面指定的方式进行排序,这里表示元组中的第二个元素,也就是单词出现的次数
# for i in range(500): # 循环的打印出出现频率最高的前20个单词
#     word,count = items[i]
#     print("{0:<10}{1:>5}".format(word,count))
# print(items)
#使用pandas将表格转为txt
data=pd.DataFrame(items) 
data.to_csv(r"C:\Users\Administrator\Desktop\bailuyuanlist.txt",sep='\t',index=0,header=0)
  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值