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

超好玩的性格标签图生成

作者: 刘永勇 | 来源:发表于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