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()中字节流转化为字符串流输出。
 

 

posted @ 2021-05-26 17:17  天竹冰程  阅读(97)  评论(0编辑  收藏  举报