词云
词云: 也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,使得浏览者只要一眼扫过文本就可领略文本的主旨。
效果图:
制作词云需要的模块:
- jieba(结巴):切割中文的模块;
- wordcloud:使文本数据可视化
- pillow:python3中专门用来处理图像的模块;
- numpy
- matplotlib
处理英文的词云
实现处理英文的词云比较简单,因为每个英文单词中间都有空格作为分隔符。
代码:
import re
import numpy as np
from PIL import Image
from wordcloud import wordcloud
import matplotlib
# 1.切割和处理英文字符
data = []
with open('/tmp/passwd') as f:
for line in f:
result = re.split(r'\s|:|/',line)
result = [item for item in result if not re.findall(r'\s+|\d+',item) and item]
data.extend(result)
# 2.打开图片,获取图片的数据信息 ----> 设置为你想要生成的词云的形状
imgObj = Image.open('./doc/wordcloud.jpg')
img_mask = np.array(imgObj)
# 3.创建词云对象,设置属性
wcObj = wordcloud.WordCloud(
mask=img_mask, # 数据如何填充到图片
background_color='snow', # 背景颜色
min_font_size=5, # 图片中最小的字体大小
max_font_size=50, # 图片中最小的字体大小
width=1000, # 图片宽度
height=1000 # 图片高度
)
# 4.生成词云图片
# 词云绘制时,默认只处理字符串类型
# 怎么分割每个单词? ----> 必须以逗号分隔符分割
wcObj.generate(','.join(data))
wcObj.to_file('doc/passwd.png')
原图:
词云图:
处理中文的词云
实现处理中文的词云比较困难,因为分割中文比较麻烦,这就需要jieba模块来实现分割中文。
代码:
import jieba
import numpy as np
from PIL import Image
from wordcloud import wordcloud
import matplotlib
def gen_wordcloud(text, filename):
# 1.切割和处理中文字符
# 2).强调分割中有问题的词
jieba.suggest_freq(('微博'), True)
jieba.suggest_freq(('热搜'), True)
# 1).难点:如何分割中文(jieba --> lcut)
result = jieba.lcut(text)
# print(result)
# 2.打开图片,获取图片的数据信息
imgObj = Image.open('./doc/wordcloud.jpg')
img_mask = np.array(imgObj)
# 3.创建词云对象,设置属性
wcObj = wordcloud.WordCloud(
mask=img_mask,
background_color='snow',
# fc-list :lang=zh linux命令行查看当前支持的中文
# 指定字体库
font_path='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc',
min_font_size=5,
max_font_size=50,
width=1000,
height=1000
)
# 4.生成词云图片
# 词云绘制时,默认只处理字符串类型
# 怎么分割每个单词? ----> 必须以逗号分隔符分割
wcObj.generate(','.join(result))
wcObj.to_file(filename)
print("生成图片%s成功......." %(filename))
if __name__ == '__main__':
text = '马云曾公开表态称对钱没兴趣称其从来没碰过钱上了微博热搜'
filename = "doc/text.png"
gen_wordcloud(text, filename)
词云图(文字比较少,效果图不是很明显,也不太好看):
案例_对mooc课程信息词云分析
对之前爬取的mooc课程信息进行处理
代码:
import csv
import re
import numpy as np
import jieba
from PIL import Image
from wordcloud import wordcloud
import matplotlib
def dealCourseInfo(filename):
wordcloudString = ''
with open(filename) as f:
reader = csv.reader(f)
pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z0-9]+)')
for item in reader:
name = ''.join(re.findall(pattern,item[0]))
detail = ''.join(re.findall(pattern,item[2]))
wordcloudString += name
wordcloudString += detail
# print(wordcloudString)
# 去掉你认为不重要的词
return re.sub(r'(学习|使用|入门|基础|实现|掌握)', '', wordcloudString)
def gen_wordcloud(text, filename):
# 1.切割和处理中文字符
# 2).强调分割中有问题的词
jieba.suggest_freq(('微博'), True)
jieba.suggest_freq(('热搜'), True)
# 1).难点:如何分割中文(jieba --> lcut)
result = jieba.lcut(text)
# print(result)
# 2.打开图片,获取图片的数据信息
imgObj = Image.open('./doc/wordcloud.jpg')
img_mask = np.array(imgObj)
# 3.创建词云对象,设置属性
wcObj = wordcloud.WordCloud(
mask=img_mask,
background_color='snow',
# fc-list :lang=zh 查看当前支持的中文
font_path='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc',
min_font_size=5,
max_font_size=50,
width=1000,
height=1000
)
# 4.生成词云图片
# 词云绘制时,默认只处理字符串类型
# 怎么分割每个单词? ----> 必须以逗号分隔符分割
wcObj.generate(','.join(result))
wcObj.to_file(filename)
print("生成图片%s成功......." %(filename))
if __name__ == '__main__':
# 分析爬取的数据
text = dealCourseInfo('doc/mooc.csv')
filename = "doc/mooc.png"
gen_wordcloud(text, filename)
词云图: