1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 超级详细使用jieba分词用wordcloud制作词云并进行词频统计实例

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

时间:2024-05-18 04:52:37

相关推荐

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

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

准备工作

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

pip install jieba -i /pypi/simple/

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

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

/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

以下是词云的相关参数:

这里是引用某位兄台博客 /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将表格转为txtdata=pd.DataFrame(items) data.to_csv(r"C:\Users\Administrator\Desktop\bailuyuanlist.txt",sep='\t',index=0,header=0)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。