美文网首页
超好玩的性格标签图生成

超好玩的性格标签图生成

作者: 刘永勇 | 来源:发表于2020-01-03 18:16 被阅读0次

柏拉图性格标签图
曾经风靡微信朋友圈、公众号的柏拉图性格标签,一夜带来千万粉丝的爆发式增长!如何生成一张性格标签图?调研了对比方案,我采用Python词云去绘制对应的图片。看一张效果图


h11.jpg

词云wordcloud可以用来做什么?
词云是文本大数据可视化的重要方式,可以将大段文本中的关键语句和词汇高亮展示。
可视化生动直观展示出枯燥文字背后的核心概念。进一步实现修改字体、字号、背景颜色、词云形状、勾勒边框、颜色渐变、分类填色、情感分析等高级玩法。简单的总结就是很牛逼。

词云的应用场景:
* 会议记录
* 海报制作
* PPT制作
* 生日表白
* 数据挖掘
* 情感分析
* 用户画像
* 微信聊天记录分析
* 微博情感分析
* Bilibili弹幕情感分析
* 年终总结

如何使用词云来绘制专属标签图?

1、安装对应的依赖包 sudo pip3 install wordcloud
2、wordcloud 的参数如下:

class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None, background_color='black', max_font_size=None, font_step=1, mode='RGB', relative_scaling=0.5, regexp=None, collocations=True, colormap=None, normalize_plurals=True)

3、这是wordcloud的所有参数,下面具体介绍一下各个参数:
font_path: string
    字体路径,需要使用的字体路径(支持OTF和TTF)。Linux系统上默认指向DroidSansMono路径。若使用其他操作系统或者没有DroidSansMono字体,需要指定字体路径。
width: int(default=400)
    画布宽度
height : int (default=200)
    画布高度
prefer_horizontal : float (default=0.90)
    尝试水平摆放字体和垂直摆放字体的比例,若prefer_horizontal < 1,当摆放不合适的时候,算法将尝试旋转单词。目前没有内置的方法来获取垂直单词
mask : nd-array or None(default=None)
    如果不是None,则在哪里绘制单词时给出二进制掩码。 如果mask不是None,那么宽度和高度将被忽略,并且将使用mask的形状。 所有白色(#FF或#FFFFFF)条目将被视为“被遮盖”,而其他条目将被自由绘制。
scale : float (default=1)
    计算值和绘图之间的缩放比例。 对于大型文字云图像,使用缩放而不是较大的画布尺寸要快得多,但可能导致较粗糙的文字。
min_font_size : int (default=4)
    使用最小的字体大小。 当没有更多的空间时停止绘制。
font_step : int (default=1)
    字体的步长。 font_step > 1时可能会加快计算速度,但会导致糟糕的字体适应性布局。
max_words : number (default=200)
单词的最大数目。
stopwords : set of strings or None
    敏感词集合,这些词将被忽略。 如果没有,则将使用内置的STOPWORDS列表。
background_color : color value (default=”black”)
    词云图像的背景颜色。
max_font_size : int or None (default=None)
    使用的最大字体大小。 默认使用图像的高度。
mode : string (default=”RGB”)
    当模式为“RGBA”且background_color为None时,会生成透明背景。
relative_scaling : float (default=.5)
    字体大小的相对单词频率的重要性。 relative_scaling = 0时,只考虑单词等级。 使用relative_scaling = 1时,频繁两倍的单词将具有两倍的大小。 如果你想考虑单词的频率,而不仅仅是他们的等级,那么0.5左右的relative_scaling通常看起来不错。
color_func : callable, default=None
    可用参数关键字font_size, position, orientation, font_path, random_state调用,它为每个单词返回一个PIL颜色。 覆盖"colormap"。 请参阅colormap来指定matplotlib的颜色映射。
regexp : string or None (optional)
    正则表达式将输入文本拆分为待处理文本中的标记。 如果指定None,则使用r“\ w [\ w'] +”。
collocations : bool, default=True
    是否包含两个词的搭配(bigrams),默认为True。
colormap : string or matplotlib colormap, default=”viridis”
    Matplotlib色彩映射表为每个单词随机绘制颜色。 如果指定了“color_func”,则忽略。
normalize_plurals : bool, default=True
    是否从文字中删除“尾随”。 如果为真,当出现以's'结尾的单词,则以's'结尾的单词将被删除,并将其计数添加到没有's'结尾的版本 ,以'ss'结尾的单词被忽略。

4、开始编码

import colorsys

import numpy as np

from PIL import Image,ImageColor


class GroupedColorFunc(object):
  
  def __init__(self, color_to_words, default_color):
    self.color_func_to_words = [
      (self.get_single_color_func_override(color), set(words))
      for (color, words) in color_to_words.items()
    ]
    self.default_color_func = self.get_single_color_func_override(default_color)
  
  def get_single_color_func_override(self, color):
    old_r, old_g, old_b = ImageColor.getrgb(color)
    rgb_max = 255.
    h, s, v = colorsys.rgb_to_hsv(old_r / rgb_max, old_g / rgb_max,
                                  old_b / rgb_max)
    
    def single_color_func(word=None, font_size=None, position=None,
                          orientation=None, font_path=None, random_state=None):
      r, g, b = colorsys.hsv_to_rgb(h, s, 1)
      return 'rgb({:.0f}, {:.0f}, {:.0f})'.format(r * rgb_max, g * rgb_max,
                                                    b * rgb_max)
    return single_color_func
  
  def get_color_func(self, word):
    try:
      color_func = next(
          color_func for (color_func, words) in self.color_func_to_words
          if word in words)
    except StopIteration:
      color_func = self.default_color_func
  
    return color_func
  
  def __call__(self, word, **kwargs):
    return self.get_color_func(word)(word, **kwargs)

import os
from os import path
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.pyplot as plt
import colorsys
import io
import base64
from .group_color_func import GroupedColorFunc

try:
  from urllib.parse import quote
except ImportError:
  from urllib import quote

import numpy as np
from PIL import Image,ImageColor


d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()

def word_cloud(object):
  wordcloud = WordCloud(
    font_path=path.join(d, '1.ttf'),
    width=550,
    height=550,
    max_font_size=70,
    min_font_size=20,
    random_state=30,
    margin=20,
    prefer_horizontal=1,
    background_color='#0C1027'
  ).generate_from_frequencies(object["words"])

  color_to_words = object["colorConfigs"]
  default_color = 'white'

  grouped_color_func = GroupedColorFunc(color_to_words, default_color)

  wordcloud.recolor(color_func=grouped_color_func)

  img = wordcloud.to_image()
  output_buffer = io.BytesIO()
  img.save(output_buffer, format='png')

  binary_data = output_buffer.getvalue()
  base64_data = base64.b64encode(binary_data).decode('ascii')
  return base64_data

遇到的坑:
1、docker 打包构建基础包 使用 python:3-alpine 构建一直失败,原因未找到。如果有大佬知道原因可以告知一下。后面该用乌班图的基础镜像打包正常。
2、词云包颜色背景做了随机函数颜色,我重写了包里面的方法 GroupedColorFunc可以自定义设置颜色。
3、文字的位置可以根据文档自行修改自定义,在这里就不做过多的展示。
4、注意下Node -> Python的base64图片的不一样。base64.b64encode(binary_data).decode('ascii')

相关文章

网友评论

      本文标题:超好玩的性格标签图生成

      本文链接:https://www.haomeiwen.com/subject/gmqsnctx.html