Jieba库使用和好玩的词云
一、关于词云
WordCloud库常规方法
- 以WordCloud对象为基础
- 配置参数、加载文本、输出文件
函数 | 简述 |
w.generate(txt) | 向WordCloud对象w中加载文本txt |
w.to_file(file name) | 将词云输出为图像文件,例如.png格式 |
方法
步骤:
- 配置对象参数
- 加载词云文本
- 输出词云文件
配置对象参数
函数 | 简述 |
font_path | 字体路径,做中文词云必须设置字体,否则无法显示 |
width | 输出的画布宽度,默认为400像素 |
height | 输出的画布高度,默认为200像素 |
max_words | 要显示的词的最大个数,默认为200 |
stop_words | 指定词云的排除词列表,即不显示的单词列表 |
max_font_size | 显示的最大字体大小 |
min_font_size | 显示的最小字体大小 |
background_color | 指定词云图片的背景颜色,默认为黑色 |
mask | 指定词云形状,默认为长方形,需要引用imread()函数 |
二、文本词频统计(以《红楼梦》为例)
- 下载一个《红楼梦》文本 这里将文本命名为 hongloumeng.txt
- 编写代码如下:
#DreaminRedMansions.py import jieba #调用jieba库 txt = open("hongloumeng.txt","r",encoding="UTF-8").read() #打开txt文件阅读 words = jieba.lcut(txt) #分词 counts = {} #建立一个空字典 for word in words: if len(word)==1: continue else: counts[word]=counts.get(word,0) + 1 #遍历每个中文单词,通过字典来计数 items = list(counts.items()) #将字典counts转换为列表类型 items.sort(key=lambda x:x[1],reverse = True) #对列表进行排序 for i in range(20): word,count = items[i] print("{0:<10}{1:>5}".format(word,count)) #打印出前20个词
但是运行出现错误,
这是因为没有写明文本所在的绝对路径,以致找不到文本,打开文本属性找到位置复制即可。
执行任有错误,
win10电脑文本编码默认为ASCII码,我们应将其改为UTF-8编码,打开 hongloumeng.txt --文件--另存为--编码--UTF-8,取名为 shitouji.txt ,按照上述方法找到新的文本位置即可。改正的代码如下:
#DreaminRedMansions.py import jieba #调用jieba库 txt = open("D:\我爱学习\python3\wenben\shitouji.txt","r",encoding="UTF-8").read() #打开txt文件阅读 words = jieba.lcut(txt) #分词 counts = {} #建立一个空字典 for word in words: if len(word)==1: continue else: counts[word]=counts.get(word,0) + 1 #遍历每个中文单词,通过字典来计数 items = list(counts.items()) #将字典counts转换为列表类型 items.sort(key=lambda x:x[1],reverse = True) #对列表进行排序 for i in range(20): word,count = items[i] print("{0:<10}{1:>5}".format(word,count)) #打印出前20个词
效果如下:
三、词云展现
1、运用jieba库和wordcloud库,代码如下:注: .join( )函数: 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的长字符串
from wordcloud import WordCloud import jieba def create_word_cloud(): path_txt = 'D:\我爱学习\python3\wenben\\shitouji.txt' text = open(path_txt,"r",encoding="UTF-8").read() wordlist = jieba.lcut(text) # jieba分词 wl = " ".join(wordlist) # 设置词云 w = WordCloud( # 设置背景颜色为白色 background_color="white", # 设置最大显示的词云数为200 max_words=200, # 字体的一般路径--宋体 font_path='simsun.ttc', height=1200, width=1600, # 设置字体最大的字体大小 max_font_size=100, # 设置配色方案 random_state=100, ) w.generate(wl) # 生成词云 w.to_file('img_book1.png') # 把词云保存下 if __name__ == '__main__': create_word_cloud()
效果如下:
2、指定词云形状
mask:指定词云形状
需要引用imread函数,目前 scipy库不包含 imread 函数,imread函数在imageio库里。
from imageio import imread mk = imread("cloud.png") #存为图片 cloud w = wordcloud.WordCloud(mask = mk)
也可以用其他库,
- numpy库:numpy库是Python的一个扩展程序库,能够支持维度数组与矩阵运算。
- matplotlib库:matplotlib是python上的一个2D绘图库,它可以在夸平台上边出很多高质量的图像。
- PIL库:PIL 库是python中很有用的处理图像的库,对图像进行操作处理, 包括对原图处理,以及产生新的图片。从文件加载图像,可以使用Image.open( )函数,需要给出图片的绝对路径,例如:
from PIL import Image im = Image.open('chrome.png') #图片的绝对路径
指定词云形状的代码如下:
from wordcloud import WordCloud from matplotlib import pyplot as plt from PIL import Image import numpy as np import jieba def create_word_cloud(): path_txt = 'D:\\我爱学习\\python3\\wenben\\shitouji.txt' text = open(path_txt,"r",encoding="UTF-8").read() wordlist = jieba.lcut(text) # jieba分词 wl = " ".join(wordlist) images = Image.open("C:\\Users\\邓若言\\Desktop\\timg.jpg") maskImages = np.array(images) # 设置词云 w = WordCloud( # 设置背景颜色为白色 background_color="white", # 设置最大显示的词云数为2000 max_words=2000, # 字体的一般路径--宋体 font_path='simsun.ttc', height=1200, width=1600, # 设置字体最大的字体大小 max_font_size=100, # 设置配色方案 random_state=100, mask=maskImages ) w.generate(wl) # 生成词云 plt.imshow(w) w.to_file('img_book2.png') # 把词云保存下 if __name__ == '__main__': create_word_cloud()
原图片
新词云图片如下