用python写一个词云图生成器

雁陎 • 2019 年 10 月 01 日

Loading...

请注意,本文编写于 421 天前,最后修改于 163 天前,其中某些信息可能已经过时。

前几天做ppt,要展示的内容有很多关键词,就想到了云字图这种玩意,没想到网上一搜,在线生成的网站要么需要付费,要么不支持指定形状生成,一气之下干脆自己写了一个。幸好python有这个库`wordcloud`,所以很快就实现了这个功能。后续优化了一下(渣优化),觉得基本能用了。

做好后的成果如下图:

![词云图](https://im.yanshu.work/article/20191013000425084_11353.png)

[github地址](https://github.com/caly5144/shu-s-project/tree/master/wordcloud)

## 依赖

所使用的版本为python3.6.5(Anaconda)

- wordcloud 云字图生成库

- matplotlib 绘图库,常和numpy一起使用

- numpy 数组函数库,矩阵运算必用

- PIL 图像操作模块

- random 随机数模块

- jieba 中文分词模块

## 代码

```python

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

"""

Created on Fri Sep 29 13:14:22 2019

self.

@author: 雁陎

"""

from wordcloud import (WordCloud, ImageColorGenerator)

from matplotlib import pyplot as plt

import numpy as np

from PIL import Image

from random import randint

import jieba

lines=[]

with open('config.txt','r') as handler:

lines = handler.readlines()

a,b = map(int,lines[3].split(',')) # 颜色h的范围

bgcolor = lines[7].strip('\n').lower() # 背景颜色

if bgcolor == 'none':

bgcolor = None

w,h = map(int,lines[9].split(',')) # 云字图尺寸

def font_select():

font_input = lines[5].strip('\n')

font_dict = {'微软雅黑':r'\msyh.ttc','楷体':r'\simkai.ttf','宋体':r'\simsun.ttc',

'仿宋':r'\simfang.ttf','隶书':r'\SIMLI.TTF','Times New Roman':r'times.ttf'}

return r'C:\Windows\Fonts' + font_dict[font_input] # 字体

def shape_judge(): # 判断用户选择的形状

cloud_shape = lines[11].strip('\n').lower() # 云字图形状

if cloud_shape == 'rectangle':

mask = None

elif cloud_shape == 'round':

x,y = np.ogrid[:w,:w]

mask = 255*((x-w/2) ** 2 + (y-w/2) ** 2 > 4.2*w ** 2).astype(int)

# 以(w/2,w/2)为圆心,半径为4.2*w的圆,255不知道干什么的,但是必须有

else:

mask = np.array(Image.open(r"shape.jpg"))

return mask

def color_judge():

font_color_input = int(lines[1].strip('\n'))

if font_color_input == 1:

random_color = np.array(Image.open(r"shape.jpg"))

return ImageColorGenerator(random_color)

#字体颜色为背景图片的颜色

else:

def random_color_func(word=None, font_size=None, position=None,

orientation=None, font_path=None, random_state=None):

h,s,l = randint(a,b),randint(80,100),randint(25,50)

# h即表示颜色的取值范围,我们可以谷歌colour picker 查看各颜色的取值范围对应的h值

# 然后在参数中设置 color_func = random_color_func即可令字按照该范围设定颜色

return "hsl({}, {}%, {}%)".format(h, s, l)

def segment_words(text):

article_contents = ""

#使用jieba进行分词

words = jieba.cut(text,cut_all=False)

for word in words:

#使用空格来分割词,否则词组仍是一起的

article_contents += word+" "

return article_contents

def segment_judge(): # 判断分词模式

segment_mode = int(lines[13].strip('\n'))

text=open(u'word.txt','r').read().lower()

if segment_mode == 1:

return text

else:

return segment_words(text)

stopwords = {'.',',','"',':','(',')','.','。','(',')','[',']','”','“','\n','\t',' '}

wordcloud= WordCloud(font_path=font_select(), background_color=bgcolor, mode="RGBA",

color_func = color_judge(),mask= shape_judge(),width=w,

height=h,stopwords = stopwords,margin=2).generate(segment_judge())

# 你可以通过font path参数来设置字体集

# width, height, margin可以设置图片属性

# backgroud_color = "black",可以设定背景颜色,默认黑色,如果想要设定透明的可以按照上面代码做

# stopwords 停用词,即云字图中不展示的词组,如各种标点、换行。

plt.axis("off") # 是否绘制坐标轴

plt.show()

wordcloud.to_file('wordcloud.png')

```

## 配置文件

为了方便用户(也就是我)使用,所以配置了一个`config.txt`文件(不要吐槽txt,纯小白~),代码中所有的输入均来自congfig。

```

# 1、字体颜色模式,可选:图片颜色(1,按照即选项6中picture模式的图片颜色进行绘制,选择模式1就无需改动选项2,同时需保持选项6为picture),自定义颜色(2,即自定义颜色的范围,需要设定选项2)

2

# 2、字体颜色H的取值范围,参见https://www.webfx.com/web-design/color-picker/

40,80

# 3、字体,可选:微软雅黑,楷体,宋体,仿宋,隶书,Times New Roman

微软雅黑

# 4、背景颜色,英文书写如white,默认为透明(None)

None

# 5、云字图尺寸,宽,高

1000,800

# 6、云字图形状,可选:方形(rectangle,尺寸为宽,高),圆形(round,尺寸为宽,宽),或图片形状(picture,按照同目录下shape.jpg的形状绘制,尺寸为图片尺寸)

picture

# 7、分词模式,可选:自定义模式(1,即按照你所给的词组进行绘制,词组之间用空格分隔),自动分词模式(2,即给定一段话,程序自动进行分词并按照频率进行绘制)

1

```

## 使用

你的项目目录中应该有以下文件:

```

云字图生成

config.txt

shape.jpg

word.txt

云字图生成.py

```

其中,`shape.jpg`是所选定的图片形状,在config中设定选项6为`picture`后会按照这个图片的形状来生成云字图。

shape最好背景为白色,这样效果最好。

说到这里,你能看出来文章开头的效果图是谁吗?

猜猜他是谁

## 常见问题

有个很常见的问题就是我的字体该如何配置,如果你实际操作起来就会发现,“诶我明明指向了Font文件夹中的微软雅黑.ttf”,为什么报错说没有这个字体呢?

很简单,因为你在font中看到的字体名并不是它真正的字体名,比如“微软雅黑”实际上是“msyh”。那么我该如何查看它真实的文件名?一个方便的做法是把它复制到桌面上,它就会自动显示真正的名字了。

哦对了font文件夹的地址是`C:\Windows\Fonts`

地址栏拼接的时候报错

大家可以看到在拼接字体文件字符串的时候用的是`r'C:\Windows\Fonts'+r'\SIMLI.TTF'`而非`r'C:\Windows\Fonts\' & r'SIMLI.TTF'`,因为当字符串最后一位是`\`时,无法对字符串进行拼接等操作,即使用`r'`转义也不行,会报错`SyntaxError: EOL while scanning string literal`。这貌似是python的一个bug,解决方法如上,`\`放到第二个字符串开头即可。

## 更新:GUI界面

写了一个GUI,不需要再考虑配置了,https://www.sitstars.com/archives/83/


版权属于:雁陎

本文链接:https://www.sitstars.com/archives/33/

转载时须注明出处及本声明

python中文词云图代码_用python写一个词云图生成器相关推荐

  1. python画pr曲线代码_利用Python中的numpy包实现PR曲线和ROC曲线的计算

    闲来无事,边理解PR曲线和ROC曲线,边写了一下计算两个指标的代码.在 python 环境下,sklearn里有现成的函数计算ROC曲线坐标点,这里为了深入理解这两个指标,写代码的时候只用到numpy ...

  2. python推箱子游戏代码_用python入门知识做推箱子游戏,若能打过第三关,则可以学会编程...

    不得不说,Python小游戏是最适合入门编程的项目,因为太简单! 无论懂或完全不懂python,这样的小游戏,你都可以直接开发出来,原因很简单: 在详细教程里,会有从零基础开始,一步一步的教你完成这个 ...

  3. python英文词云代码_使用python实现个性化词云的方法

    先上图片 词云图 需要模板 pip install jieba pip install wordcloud 还需要安装另外两个东西这两个我也不太懂借鉴百度写上去的 pip install scipy ...

  4. python中文模糊关键词提取_用Python给你的文本提取关键词

     对代码.编程感兴趣的可以关注「老K玩代码」公众号和我交流!分享代码.经验.项目和资讯 用Python给你的文本提取关键词 关键词提取是自然语言处理中常见的业务模块; 要实现关键词提取,Python ...

  5. python输入汉字的代码_基于python的汉字转GBK码实现代码

    如图,"广"的编码为%B9%E3,暂且把%B9称为节编码,%E3为字符编码(第二编码). 思路: 从GBK编码页面收集汉字 http://ff.163.com/newflyff/g ...

  6. python绘制繁花曲线代码_使用python和pygame绘制繁花曲线的方法

    前段时间看了一期<最强大脑>,里面各种繁花曲线组合成了非常美丽的图形,一时心血来潮,想尝试自己用代码绘制繁花曲线,想怎么组合就怎么组合. 真实的繁花曲线使用一种称为繁花曲线规的小玩意绘制, ...

  7. python怎么运行matlab代码_用python运行matlab代码

    我得到了一个错误:Traceback (most recent call last): File "", line 1, in File "C:\Users\XYZ\Ap ...

  8. python 打卡记录代码_利用Python实现对考勤打卡数据处理的总结

    利用Python实现对考勤打卡数据处理的总结 一.背景交代 二.说明 三. 8种方法 1. 查看文件是否存在 2. 导入excel文件,并把数据保存为dataframe格式 3. 计算程序运行时间 4 ...

  9. 用python画小猪佩奇代码_用python画个小猪佩奇(turtle示例源码)

    [实例简介]来副小猪佩奇,用python画个小猪佩奇 [实例截图] [核心代码]# coding:utf-8 import turtle as t def nose(x,y):#鼻子 t.pu() t ...

  10. 用python画小猪佩奇代码_用Python画小猪佩奇

    猪年农历春节前,朋友圈被一则走心的广告刷屏了.很多伙伴直呼:看哭了.当爷爷电话里听到儿子说「不回来啊」的打击是很沉重的,这位父亲想念自己的儿子和孙子,总想把最好的给他们. 如果你的孩子问你要佩奇,你除 ...

最新文章

  1. 在CentOS 6.8 x86_64上安装nghttp2最新版及让curl具有http2特性
  2. 菜鸟物流云是如何帮助快递合作伙伴解决双11巨大业务负荷的?
  3. vivado烧录flash过程
  4. oracle的结构是什么,Oracle的软件结构是什么呢?
  5. C++ MFC控制台输出调试信息
  6. 【根据网上其他没有解决】XAMPP报错Error: Apache shutdown unexpectedly
  7. 【CoppeliaSim】使用 Lua 语言控制麦轮小车行走
  8. spring学习(5):spring简介
  9. java mac 转换 整形_JAVA的整型与字符串相互转换
  10. Ceres Solver: 高效的非线性优化库(二)实战篇
  11. shell 结束指定端口
  12. 使用音频转换器怎么转换电影的格式?
  13. SharePoint 2013 对象模型操作网站设置菜单
  14. latex 如何添加圆圈数字?
  15. java mencoder_java 用ffmpeg和mencoder进行视频转码
  16. Netmeeting 安装步骤
  17. 计算机主机可以有几个硬盘,一台电脑可以安装盘几个硬盘?
  18. microsoftfixitoffice官方清理软件_电脑卡?试试这几款电脑必备清理优化软件
  19. 大批程序员可能面临被劝退!
  20. unity制作mmd视频

热门文章

  1. Spring WebFlux - WebClient连接池简单测试和代码分析
  2. 【MySQL】Online DDL详解
  3. easyui1.5:combobox:onSelect
  4. dw什么运行php,php新手求助,为什么在DW中设计里能看到运行php程序的结果,但…...
  5. openwrt官方固件怎么中继网络
  6. 毕业设计:基于STM32的智能家居无线(蓝牙wifi)语音控制系统
  7. Html5 通用布局方式
  8. android灰度发布平台,安卓版微信灰度发布购物直播功能 小程序直播上线公域流量入口...
  9. 用python来开发webgame服务端(2)
  10. Unable to instantiate application 解决方法