最近学习机器学习课程,学到文本分类就研究了下词云如何处理,写下代码和文件以便帮助更多的人,个人变成基础极其薄弱,如有问题请自行修改相关代码。
准备工作
使用命令安装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。
以下为源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 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) |