zoukankan      html  css  js  c++  java
  • workdaily-Python-词云的展示及在docker上的部署(三)

    实际在(一)(二)的词云生成过程中都是都是有一些问题的,就是不够优化,以前的思路是“前端上传文件在后端的服务器中生成文件, 然后后端去读取文件,然后再把生成的

    的词云图片保存在指定路径中,最后去指定的路径下去取出回传给前端页面”。

    优化思路:前端上传的文件以文件流的形式,跳过第一次生成文件,然后再读取文件,直接把文件转化为字符串,然后通过词云方法生成文件流跳过保持文件这一步。

    直接上代码:

    import os
    import string
    import base64
    import random
    from io import BytesIO
    import jieba.analyse
    import numpy as np
    import matplotlib.pyplot as plt
    from wordcloud import WordCloud
    from PIL import Image
    from flask import Flask,  render_template,request, jsonify
    
    
    app = Flask(__name__)
    
    # 对字符串进行分析,应用jieba.analyse.textrank()的方法分词
    def textAnalysis(txt):  # 统计分析文章中每个词出现的次数
        result = jieba.analyse.textrank(txt,topK=50, withWeight=True)
        keywords = dict()
        for i in result:  # 遍历列表,生成字典
            keywords[i[0]] = i[1]
        return keywords  # 返回关键字与权值字典
    
    
    # 绘制词云
    def draw(keywords):
        wc = WordCloud(font_path='msyh.ttc',  # 中文字体,未指定中文字体时词云的汉字显示为方框,可修改字体名
                       background_color='White',  # 设置背景颜色                 
                       width=500,       # 设置背景宽                
                       height=350,        # 设置背景高             
                       max_font_size=50,   # 最大字体              
                       min_font_size=10, # 最小字体                     
                       )
        img=wc.generate_from_frequencies(keywords).to_image()
        img_byte = BytesIO()
        img.save(img_byte, format='JPEG')
        binary_content = img_byte.getvalue()
        img.show()
        return binary_content  #返回图片的字节流
    
    
    
    @app.route('/api/wordcloud', methods=['POST','GET'], strict_slashes=False)
    def api_upload():
    
        f = request.files.get('file')  # 从表单的file字段获取文件,myfile为该表单的name值
        if  f is not None:
            txt=str(f.stream.read(), encoding="utf-8")
            keywords = textAnalysis(txt)  # 利用jieba对文本进行分词,并统计词频
            img_stream=draw(keywords)  # 绘制词云
            img_stream = base64.b64encode(img_stream).decode()
            return jsonify({"errno": 1000, "data": img_stream})
        else:
            return jsonify({"errno": 1001, "errmsg": "生成词云失败"})
    
    
    
    
    
    if __name__ == '__main__':  #定义app在8080端口运行
        app.run(port=8080)

     

     最后的展示效果:


    之前;

     

    现在通过一行代码搞定,跳过了生成文件读取文件的过程
    txt=str(f.stream.read(), encoding="utf-8")


      现在过这一步直接,转化成图片字节流

        img_byte = BytesIO()
        img.save(img_byte, format='JPEG')
        binary_content = img_byte.getvalue()
       img_stream=draw(keywords)  # 绘制词云
       img_stream = base64.b64encode(img_stream).decode()中字节流转化为字符串流输出。
     
  • 相关阅读:
    nginx+upsync+consul 构建动态nginx配置系统
    服务容错保护断路器Hystrix之六:缓存功能的使用
    consul之:ACL配置使用
    Consul之:服务健康监测
    Consul实践指导-DNS接口
    Spring 整合Mybatis实例
    ORACLE SEQUENCE 具体解释
    python高速排序
    降阶法计算行列式方法有个地方有Bug(原文也已更正,此为更正后部分)
    MyBatis在Oracle中插入数据并返回主键的问题解决
  • 原文地址:https://www.cnblogs.com/chengxiaoxiao/p/14814278.html
Copyright © 2011-2022 走看看