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()中字节流转化为字符串流输出。
     
  • 相关阅读:
    持续集成环境搭建(一)
    The POSIX API/nss/nscd
    [postfix]转发邮件设置
    [python]python安装包错误
    栈及栈帧讲解
    kernel-init-bash
    nginx no input file specified
    Lumen/Laravel调试API接口利器laravel-debugbar
    homestead实现外部局域网络其他主机的访问
    PHP rabbitmq扩展安装
  • 原文地址:https://www.cnblogs.com/chengxiaoxiao/p/14814278.html
Copyright © 2011-2022 走看看