深度有趣 | 03 高端又一般的词云

栏目: Python · 发布时间: 6年前

内容简介:词云是一种数据呈现方式掌握用安装包

词云是一种数据呈现方式

  • 不会的时候,感觉很厉害、很高大上
  • 会用了之后,感觉到哪都看到别人在用

掌握用 Python 实现词云的方法

准备

安装包

pip install wordcloud matplotlib jieba PIL
复制代码

准备一些文本,英文或中文皆可

一个简单的例子

WordCloud() 可选的参数

  • font_path :可用于指定字体路径,包括 otfttf
  • width :词云的宽度,默认为400
  • height :词云的高度,默认为200
  • mask :蒙版,可用于定制词云的形状
  • min_font_size :最小字号,默认为4
  • max_font_size :最大字号,默认为词云的高度
  • max_words :词的最大数量,默认为200
  • stopwords :将被忽略的停用词,如果不指定则使用默认的停用词词库
  • background_color :背景颜色,默认为 black
  • mode :默认为 RGB 模式,如果为 RGBA 模式且 background_color 设为 None ,则背景将透明
# -*- coding: utf-8 -*-

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 打开文本
text = open('constitution.txt').read()
# 生成对象
wc = WordCloud().generate(text)

# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')
复制代码
深度有趣 | 03 高端又一般的词云

由于英文单词之间有空格分隔,因此大多不需要额外的处理

中文词云

中文一般需要经过分词处理,先看下不分词的效果

以《西游记》为例,可以看到结果中会出现各种双字、三字和四字等,但很多并不是合理的词语

# -*- coding: utf-8 -*-

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 打开文本
text = open('xyj.txt').read()
# 生成对象
wc = WordCloud(font_path='Hiragino.ttf', width=800, height=600, mode='RGBA', background_color=None).generate(text)

# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')
复制代码
深度有趣 | 03 高端又一般的词云

这次我们先用 jieba 进行中文分词,可以看到生成的词云里,基本上都是合理的词语了

# -*- coding: utf-8 -*-

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba

# 打开文本
text = open('xyj.txt').read()

# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])

# 生成对象
wc = WordCloud(font_path='Hiragino.ttf', width=800, height=600, mode='RGBA', background_color=None).generate(text)

# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')
复制代码
深度有趣 | 03 高端又一般的词云

使用蒙版

这里将 mask 翻译为蒙版,是因为感觉它和Photoshop中蒙版的作用很类似

使用蒙版之后,可以根据提供的蒙版图片,生成指定形状的词云

# -*- coding: utf-8 -*-

from wordcloud import WordCloud
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba

# 打开文本
text = open('xyj.txt').read()

# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])

# 生成对象
mask = np.array(Image.open("black_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)

# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')
复制代码
深度有趣 | 03 高端又一般的词云

颜色

词云的颜色可以从蒙版中抽取,使用 ImageColorGenerator() 即可

# -*- coding: utf-8 -*-

from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba

# 打开文本
text = open('xyj.txt').read()

# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])

# 生成对象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)

# 从图片中生成颜色
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)

# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')
复制代码
深度有趣 | 03 高端又一般的词云

当然也可以设置为纯色,增加一个配色函数即可

# -*- coding: utf-8 -*-

from wordcloud import WordCloud
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import random
import jieba

# 打开文本
text = open('xyj.txt').read()

# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])

# 颜色函数
def random_color(word, font_size, position, orientation, font_path, random_state):
	s = 'hsl(0, %d%%, %d%%)' % (random.randint(60, 80), random.randint(60, 80))
	print(s)
	return s

# 生成对象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(color_func=random_color, mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)

# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')
复制代码
深度有趣 | 03 高端又一般的词云

关于HSL配色方案可以参考

www.w3.org/wiki/CSS3/C…

精细控制

如果希望精细地控制词云中出现的词,以及每个词的大小,可以尝试 generate_from_frequencies() ,包括两个参数

  • frequencies :一个字典,用于指定词和对应的大小
  • max_font_size :最大字号,默认为 None

generate() = process_text() + generate_from_frequencies()

以下用jieba提取出关键词和权重,再以此绘制词云

# -*- coding: utf-8 -*-

from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba.analyse

# 打开文本
text = open('xyj.txt').read()

# 提取关键词和权重
freq = jieba.analyse.extract_tags(text, topK=200, withWeight=True)
print(freq[:20])
freq = {i[0]: i[1] for i in freq}

# 生成对象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate_from_frequencies(freq)

# 从图片中生成颜色
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)

# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Blockchain Basics

Blockchain Basics

Daniel Drescher / Apress / 2017-3-16 / USD 20.99

In 25 concise steps, you will learn the basics of blockchain technology. No mathematical formulas, program code, or computer science jargon are used. No previous knowledge in computer science, mathema......一起来看看 《Blockchain Basics》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码