介绍
小伙伴们入门词云图是不是各个网站、帖子一搜一大堆,却总是生成不了想要的词云图效果。要么就是方方正正的没有轮廓;要么就是图形还行,但是显示的词语很杂乱,比如一些不想要的词语也在图里面;要么就是想要的词语被拆分成多个词语了。还有就是有多个文本要生成词云图,只能一便一遍的循环。
博主拿出压箱底的优质代码,和小伙伴们一起品鉴!
效果
在文件夹下面有多个子文件夹,每个子文件夹都有很多文本,每个文本要画一个词云图,并且要进行词语筛选,以及一些词语保留。在这里,我们假设A文件夹下面有两个子文件夹B、C。在B文件夹下面有3个文件,C文件夹下面有2个文件。指定词云图生成的轮廓,拿出经典图,哈哈哈!
生成的效果
功能
- 画出词云图
- 指定词云图形状
- 多个文本批量生成多张词云图
- 加词库,添加所有感兴趣的词语
- 停词库,筛选掉所有不感兴趣的词语,融合了四个国内主流停词库(
7352个停词
) - 忽略单个字符
- 控制图片大小、颜色、字体与频率大小
- 自动保存高分辨率词云图到本地
停词库、加词库
绘制词云图的过程中,停词库(Stop Words)是指在文本分析过程中被排除在外的高频无实际含义的词语列表。这些词通常是指代一些常见的连接词、介词、代词等,它们虽然在文本中出现频率高,但是它们并不能给我们带来很多实际信息。因此,在分析文本时,我们通常会把这些高频无用的词从文本中剔除掉,以避免它们对结果的影响。
在中文文本分析中,常见的中文停词库包括“哈工大停用词表”、“百度停用词表”、“四川大学机器智能实验室停用词库”等。其中,“哈工大停用词表”是目前最常用的中文停用词库之一,由哈尔滨工业大学自然语言处理实验室发布。此外,还有一些其他的中文停用词库,可以根据具体需要选择使用。
在文本分析过程中,加词库(Custom Dictionary)是指用户可以根据自己的需要,向词库中添加自定义的词语,以增强对文本的分析效果。
在 Python 中,加词库通常是通过指定一个包含用户自定义词语的文本文件或列表来实现的。对于不同的文本分析工具和库,具体的加词库方法可能会有所不同。
以中文分词为例,jieba是一个常用的中文分词库,在其中,用户可以通过调用 add_word() 方法,向词库中添加自定义词语。例如:
import jieba
# 添加自定义词语
jieba.add_word('自定义词1')
jieba.add_word('自定义词2')
# 对文本进行分词
text = '我喜欢自定义词1和自定义词2'
seg_list = jieba.cut(text, cut_all=False)
print("分词结果:", "/".join(seg_list))
输出结果为:
分词结果: 我/喜欢/自定义词1/和/自定义词2
通过加词库,我们可以更好地适应具体的文本分析场景,提高文本分析的准确性和效率。
本文将“哈工大停用词表”、“百度停用词表”、“四川大学机器智能实验室停用词库”等融合在一个txt文件中,形成本文的“stop_words.txt”
。
加词库在jieba中只能一个一个词语的添加,十分麻烦,于是本文通过设计程序,只需要将你需要的词语放在“add_word.txt”
中即可,十分便捷。
代码
pathwen = r'D:\desktop\词云图\yuan'
savepath = r'D:\desktop\词云图\生'
picnamea = r'D:\desktop\词云图\原始图片\t0.png'
# ---------改上面两行代码即可-------------下面的代码无需更改-------------------------
import matplotlib.pyplot as plt #数据可视化
import jieba #词语切割
import wordcloud #分词
from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS #词云,颜色生成器,停止词
import numpy as np #科学计算
from PIL import Image #处理图片
import os
def stopwordslist(filepath):
stopwords = [line.strip().split('\n')[0] for line in open(filepath, 'r', encoding='utf-8').readlines()]
return stopwords
def movestopwords(sentence,stopwords):
stopwords = stopwords #stopwordslist('stop_words.txt') # 这里加载停用词的路径
#print(stopwords[:10])
outstr = []
for word in sentence: #句子中的每一个字,
if len(word) >= 2:
if word not in stopwords: #这里和英文不一样,应为如果这样用,就是字母了
if word != '\t'and'\n':
outstr.append(word)
#outstr += word
#outstr += " " #确实不需要这句,word本身就有可能是空格
return outstr
##print(movestopwords(['中国','美国','日本']))
def ciyun(ciyunname, picname, stopwords, resultfile):
try:
with open(ciyunname,'r',encoding='utf-8') as f: #打开新的文本转码为utf-8
textfile= f.read() #读取文本内容
except:
with open(ciyunname,'r',encoding='gbk') as f: #打开新的文本转码为utf-8
textfile= f.read() #读取文本内容
wordlist = jieba.lcut(textfile)#切割词语
space_list1 = movestopwords(wordlist,stopwords)
#print(len(space_list1))
#print(type( wordlist))
#print(wordlist[:10])
space_list = ' '.join(space_list1) #空格链接词语
#print(space_list[:30])
#print(type(space_list))
#picname = 'pic.png' #更改名字
backgroud = np.array(Image.open(picname))
wc = WordCloud(width=1400, height=2200, #图片大小
background_color='white',
mode='RGB',
mask=backgroud,
max_words= 300, # 高频词语数量
stopwords=STOPWORDS.add('.'),
font_path='C:\Windows\Fonts\STZHONGS.ttf',
max_font_size=250, #最大字号
relative_scaling=0.6, #设置字体大小与词频的关联程度为0.4
random_state=50,
scale=2
).generate(space_list)
image_color = ImageColorGenerator(backgroud)#设置生成词云的颜色,如去掉这两行则字体为默认颜色
wc.recolor(color_func=image_color)
plt.imshow(wc) #显示词云
plt.axis('off') #关闭x,y轴
#plt.show()#显示
wc.to_file(resultfile) #保存词云图
## print('已经生成:','result_'+ k +'.png')
if __name__ == '__main__':
stopwords = stopwordslist(r'D:\desktop\词云图\stop_words.txt')
jieba.load_userdict(r"D:\desktop\词云图\add_word.txt")
picname = picnamea
pathwen = pathwen
savepath = savepath
filejias = os.listdir(pathwen)
for filejia in filejias:
newpath = pathwen+'\\'+ filejia
files = os.listdir(newpath)
print(filejia)
for file in files:
readfile = newpath+'\\'+file
k = file[:-4]
resultfile = savepath+'\\'+str(picnamea[-5])+k+'.png'
ciyun(readfile, picname, stopwords, resultfile)
print(file)
print('执行结束')
完整项目
千言万语比不过自己动手,难免在调试的过程出现这样或者哪样的问题。
所以我把完整项目放在GitHub上面了,如果你访问 Github 比较慢,
也可以点击这里【我的资源】,
或者访问我的公众号【guog算法笔记】回复“词云图啊
”,获取完整项目。