手把手教你:基于python+Django的英文数据分析与可视化系统

news2024/11/17 21:53:39

系列文章

  • 手把手教你:基于Django的新闻文本分类可视化系统(文本分类由bert实现)
  • 手把手教你:基于python的文本分类(sklearn-决策树和随机森林实现)
  • 手把手教你:基于TensorFlow的语音识别系统

目录

  • 系列文章
  • 一、项目简介
  • 二、系统功能
    • 1、数据导入
    • 2、数据清洗
    • 3、词频统计
    • 4、情感分析
    • 5、可视化
    • 6、用户交互
  • 三.界面简介
    • 1、首页
    • 2、题库界面
    • 3、数据分析可视化界面
    • 4、用户管理界面
  • 四、界面架构
  • 五、代码功能介绍
    • 1、依赖环境
    • 2、创建数据库
    • 3、数据分析模块
    • 4、用户管理模块
    • 5、Django展示界面构建
  • 六、代码下载地址


一、项目简介

本文主要介绍的基于Python和Django框架构建的英文数据分析与可视化系统。

该系统使用的是英语四六级考试相关文章、题目、答案,并对各种文本进行分析,包括且不限于以下关键技术:

实现了对英文文本数据的处理,包括词频统计、情感分析等,并将分析结果以图表形式进行展示。通过这个系统,用户可以便捷地进行英文数据的分析和可视化。

完整代码在最下方,想要先看源码的同学可以移步本文最下方进行下载。

博主也参考过文本分类相关模型的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个可视化系统即可。

也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。

如果您有以上想法,那就找对地方了!


不多废话,直接进入正题!

二、系统功能

1、数据导入

支持多种格式的英文文本数据导入,如.txt, .csv, .json等。

2、数据清洗

提供数据清洗功能,包括去除停用词、标点符号、数字等。

3、词频统计

统计文本中单词的频率,并以词云图、条形图等形式展示。

4、情感分析

基于NLP技术对文本进行情感分析,判断文本的积极、消极或中性情绪。

5、可视化

采用多种图表进行数据可视化,如折线图、饼图、散点图等。

6、用户交互

提供友好的用户界面,方便用户进行操作和交互。

三.界面简介

系统完成后界面如下:

1、首页

  • 首页:提供了三个模块:MaterialsBusiness IntelligenceUser Management
  • 分别为:1、CET的题目信息查询。2、数据分析与可视化。3、用户注册与登录
    在这里插入图片描述

2、题库界面

  • 页面二:可以查看CET的2016年-2020年的题目和答案,用于自行练习。

在这里插入图片描述

  • 页面三:答题界面
    在这里插入图片描述

3、数据分析可视化界面

  • 页面四:题目及答案的数据分析及词频统计界面
    在这里插入图片描述

  • 单词长度统计

在这里插入图片描述

  • 高频单词统计
    在这里插入图片描述

4、用户管理界面

  • 用户注册

在这里插入图片描述

  • 用户登录

在这里插入图片描述

四、界面架构

整个系统架构以及功能模块不复杂,可以参考下图:

在这里插入图片描述


五、代码功能介绍

1、依赖环境

本项目使用的是pycharm的python编译环境,如不清楚如何使用的同学可以参考csdn上其他博主的基础教程,这里就不进行赘述。

后端:Python, Django, NLTK(自然语言处理工具包)

前端:HTML, CSS, JavaScript, Bootstrap, jQuery

数据库:MySQL

可视化库:Matplotlib, Pyecharts, WordCloud

2、创建数据库

  • 创建mysql数据库,并写入相关数据
import mysql.connector
import pandas as pd


class DbCreate:
    def __init__(self):
        self.my_db = mysql.connector.connect(
            host="localhost",
            user="root",
            passwd="123456",
            auth_plugin='mysql_native_password'
        )

    def create_database(self, database_name):
        """
        创建database
        database_name:数据库名
        """
        # 实例化
        db_cursor = self.my_db.cursor()
        try:
            sql = "CREATE DATABASE " + database_name + ";"
            db_cursor.execute(sql)
            # 提交
            self.my_db.commit()
        except Exception as e:
            print("create_database 失败,错误信息:", str(e))
        else:
            print("create_database 成功......")

    def drop_database(self, database_name):
        """
        删除database
        database_name:数据库名
        """
        # 实例化
        db_cursor = self.my_db.cursor()
        try:
            sql = "DROP DATABASE " + database_name + ";"
            db_cursor.execute(sql)
            # 提交
            self.my_db.commit()
        except Exception as e:
            print("drop_database 失败,错误信息:", str(e))
        else:
            print("drop_database 成功......")


class DbConnect:
    def __init__(self, dbname):
        self.my_db = mysql.connector.connect(
            host="localhost",
            user="root",
            passwd="123456",
            auth_plugin='mysql_native_password',
            database=dbname
        )

    def insert_user(self, email, name, password):
        """
        创建用户
        """
        my_cursor = self.my_db.cursor()
        try:
            sql = "INSERT INTO user (email,name,password) VALUES (%s, %s, %s);"
            val = (email, name, password)
            # 执行
            my_cursor.execute(sql, val)
            # 提交
            self.my_db.commit()
        except Exception as e:
            print("insert_user 失败,错误信息:", str(e))
        else:
            print('insert_user 成功......')

    def create_tb_user(self):
        """
        创建user表
        """
        my_cursor = self.my_db.cursor()
        try:
            # 用户表建表语句
            sql = "CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255), name VARCHAR(255)" \
                  ", password VARCHAR(255));"
            my_cursor.execute(sql)
            # 提交
            self.my_db.commit()
        except Exception as e:
            print("create_tb_user 失败,错误信息:", str(e))
        else:
            print('create_tb_user 成功......')
        # 创建管理员
        print("创建管理员......")
        self.insert_user("email@163.com", "test", "123456")

    def create_tb_cet(self):
        """
        创建题库表
        """
        my_cursor = self.my_db.cursor()
        try:
            # 用户表建表语句
            sql = "CREATE TABLE exam (id INT AUTO_INCREMENT PRIMARY KEY, 编号 VARCHAR(255),级别 VARCHAR(255)" \
                  ", 年份 VARCHAR(255),月份 VARCHAR(255),套数 VARCHAR(255),题型 VARCHAR(255),内容 TEXT," \
                  "选项 TEXT,答案 TEXT ,翻译 TEXT );"
            my_cursor.execute(sql)
            # 提交
            self.my_db.commit()
        except Exception as e:
            print("create_tb_cet 失败,错误信息:", str(e))
        else:
            print('create_tb_cet 成功......')

    def insert_exam(self, nbr, level, year, month, t_nbr, tx, text, choose, answer, translation):
        """
        执行单个插入题库信息
        """

        my_cursor = self.my_db.cursor()
        try:
            sql = "INSERT INTO exam (编号,级别,年份,月份,套数,题型,内容,选项,答案,翻译) VALUES " \
                  "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"
            val = (nbr, level, year, month, t_nbr, tx, text, choose, answer, translation)
            # 执行
            my_cursor.execute(sql, val)
            # 提交
            self.my_db.commit()
        except Exception as e:
            print("insert_user 失败,错误信息:", str(e))

    def insert_exam_all(self):
        """
        读取Excel信息,插入所有题库
        """
        data_exam = pd.read_excel("data/data_exam.xlsx", engine='openpyxl')
        print("读取题库信息成功,开始更新题库信息至数据库......")
        for i in range(len(data_exam)):
            try:
                self.insert_exam(
                    str(data_exam['编号'][i]),
                    str(data_exam['级别'][i]),
                    str(data_exam['年份'][i]),
                    str(data_exam['月份'][i]),
                    str(data_exam['套数'][i]),
                    str(data_exam['题型'][i]),
                    str(data_exam['内容'][i]),
                    str(data_exam['选项'][i]),
                    str(data_exam['答案'][i]),
                    str(data_exam['翻译'][i])
                )
            except Exception as e:
                print("insert_exam_all 执行异常,错误信息如下:", e)
            else:
                print("第", i + 1, "条题库信息插入成功......")
        print("完成题库信息导入.......")

    def create_tb_text(self):
        """
        创建文章表
        """
        my_cursor = self.my_db.cursor()
        try:
            # 用户表建表语句
            sql = "CREATE TABLE text (id INT AUTO_INCREMENT PRIMARY KEY,  级别 VARCHAR(255)" \
                  ", 年份 VARCHAR(255),月份 VARCHAR(255),套数 VARCHAR(255),题型 VARCHAR(255),内容 TEXT)"
            my_cursor.execute(sql)
            # 提交
            self.my_db.commit()
        except Exception as e:
            print("create_tb_text 失败,错误信息:", str(e))
        else:
            print('create_tb_text 成功......')

    def insert_text(self, level, year, month, t_nbr, tx, text):
        """
        执行单个插入文章信息
        """
        my_cursor = self.my_db.cursor()
        try:
            sql = "INSERT INTO text (级别,年份,月份,套数,题型,内容) VALUES " \
                  "(%s, %s, %s, %s, %s, %s);"
            val = (level, year, month, t_nbr, tx, text)
            # 执行
            my_cursor.execute(sql, val)
            # 提交
            self.my_db.commit()
        except Exception as e:
            print("insert_text 失败,错误信息:", str(e))

    def insert_text_all(self):
        """
        读取Excel信息,插入所有文章
        """
        data_exam = pd.read_excel("data/data_text.xlsx", engine='openpyxl')
        print("读取题库信息成功,开始更新题库信息至数据库......")
        for i in range(len(data_exam)):
            try:
                self.insert_text(
                    str(data_exam['级别'][i]),
                    str(data_exam['年份'][i]),
                    str(data_exam['月份'][i]),
                    str(data_exam['套数'][i]),
                    str(data_exam['题型'][i]),
                    str(data_exam['内容'][i])
                )
            except Exception as e:
                print("insert_text_all 执行异常,错误信息如下:", e)
            else:
                print("第", i + 1, "条题库信息插入成功......")
        print("完成题库信息导入.......")


if __name__ == '__main__':
    # 建库名
    db_name = 'exam'

    # # 建库
    # my_db_create = DbCreate()
    # # my_db_create.drop_database('english')
    # my_db_create.drop_database(db_name)
    # my_db_create.create_database(db_name)

    # mysql创建连接
    my_db_connect = DbConnect(db_name)

    # # 创建user表
    # my_db_connect.create_tb_user()
    # # 创建题库表
    # my_db_connect.create_tb_cet()
    # # 插入题库信息
    # my_db_connect.insert_exam_all()

    # 创建文章表
    my_db_connect.create_tb_text()
    # 插入题库信息
    my_db_connect.insert_text_all()

3、数据分析模块

from collections import Counter
import mysql.connector
import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.charts import Pie


class DbConnect:
    def __init__(self):
        self.my_db = mysql.connector.connect(
            host="localhost",
            user="root",
            passwd="123456",
            auth_plugin='mysql_native_password',
            database='exam'
        )

    def select_text_len(self):
        """
        获取文章内容、年度、AB
        """
        text_result = {}
        try:
            my_cursor = self.my_db.cursor()
            print("连接数据库成功,开始读取数据......")
            sql = "SELECT 内容,年份 FROM text WHERE 题型 = 'A' AND 级别=4"
            my_cursor.execute(sql)
            result = my_cursor.fetchall()
            text_4_a = []
            text_year = []
            # 获取4级文章和年度
            for i in range(len(result)):
                text_4_a.append(result[i][0])
                text_year.append(result[i][1])

            sql = "SELECT 内容 FROM text WHERE 题型 = 'A' AND 级别=6"
            my_cursor.execute(sql)
            result = my_cursor.fetchall()
            text_6_a = []
            # 获取6级文章
            for i in range(len(result)):
                text_6_a.append(result[i][0])

            sql = "SELECT 内容 FROM text WHERE 题型 = 'B' AND 级别=4"
            my_cursor.execute(sql)
            result = my_cursor.fetchall()
            text_4_b = []
            # 获取B卷4级文章
            for i in range(len(result)):
                text_4_b.append(result[i][0])

            sql = "SELECT 内容 FROM text WHERE 题型 = 'B' AND 级别=6"
            my_cursor.execute(sql)
            result = my_cursor.fetchall()
            text_6_b = []
            # 获取B卷6级文章
            for i in range(len(result)):
                text_6_b.append(result[i][0])
            text_result = {
                'year': text_year,
                '4_a': text_4_a,
                '4_b': text_4_b,
                '6_a': text_6_a,
                '6_b': text_6_b
            }
        except Exception as e:
            msg = "查询失败,错误信息:", str(e)
            print(msg)

        return text_result


def deal_length(my_l):
    """
    处理文章长度
    """
    result = []
    for text in my_l:
        result.append(len(text.split(" ")))
    return result


def show_length():
    """
    展示A、B文章长度
    """
    my_dbc = DbConnect()
    result = my_dbc.select_text_len()
    year = result['year']
    text_4a = result['4_a']
    text_4b = result['4_b']
    text_6a = result['6_a']
    text_6b = result['6_b']
    # 处理文章长度
    text_4a_l = deal_length(text_4a)
    text_4b_l = deal_length(text_4b)
    text_6a_l = deal_length(text_6a)
    text_6b_l = deal_length(text_6b)
    # 生成4级网页
    print("开始生成网页......")
    bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px", page_title="img_view",
                                      ))
    # 展示cet4的文章长度
    bar.add_xaxis(year)
    bar.add_yaxis("CET4 A Length", text_4a_l)
    bar.add_yaxis("CET4 B Length", text_4b_l)
    bar.set_global_opts(title_opts=opts.TitleOpts(title="CET4", subtitle="Statistical"))
    bar.render("./templates/bi_show_cet4l.html")
    print("生成成功,请见目录:/templates/bi_show_cet4l.html ......")
    # 生成6级网页
    bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px", page_title="img_view",
                                      ))
    # 展示cet6的文章长度
    bar.add_xaxis(year)
    bar.add_yaxis("CET6 A Length", text_6a_l)
    bar.add_yaxis("CET6 B Length", text_6b_l)
    bar.set_global_opts(title_opts=opts.TitleOpts(title="CET6", subtitle="Statistical"))
    bar.render("./templates/bi_show_cet6l.html")
    print("生成成功,请见目录:/templates/bi_show_cet6l.html ......")


def read_stop_txt(rootdir):
    """
    读取停用词表
    """
    lines = []
    with open(rootdir, 'r', encoding="utf-8") as file_to_read:
        while True:
            line = file_to_read.readline()
            if not line:
                break
            line = line.strip('\n').strip(' ')
            lines.append(line)
    return lines


def words_clean(data):
    """数据清洗"""
    lines = []
    for word in data:
        word = word.replace("\n", '').replace("\\u", '').replace("\\", '').replace("_", '') \
            .replace("—", '').replace("-", '').replace("?", '').replace("[", '').replace("]", '') \
            .replace(".", '').replace("“", '').replace(",", '').replace("$", '').replace(";", '') \
            .replace("(", '').replace(")", '').replace("\"", '').replace(":", '').replace("”", '')
        # if word.isalpha():
        #     lines.append(word)
        # else:
        #     print(word)
        lines.append(word)
    return lines


def show_words_length():
    """
    展示A、B文章单词长度占比
    """
    my_dbc = DbConnect()
    result = my_dbc.select_text_len()
    list_4_a = result['4_a']
    list_4_b = result['4_b']
    list_6_a = result['6_a']
    list_6_b = result['6_b']
    # 合并文章,处理分词
    text_4_a = words_clean(' '.join(list_4_a).split(" "))
    text_4_b = words_clean(' '.join(list_4_b).split(" "))
    text_6_a = words_clean(' '.join(list_6_a).split(" "))
    text_6_b = words_clean(' '.join(list_6_b).split(" "))

    len_4a = [len(word) for word in text_4_a if word != '']
    len_4b = [len(word) for word in text_4_b if word != '']
    len_6a = [len(word) for word in text_6_a if word != '']
    len_6b = [len(word) for word in text_6_b if word != '']
    # 获取单词长度
    c_4a = Counter(len_4a).most_common(12)
    c_4b = Counter(len_4b).most_common(12)
    c_6a = Counter(len_6a).most_common(12)
    c_6b = Counter(len_6b).most_common(12)

    # 设置主标题与副标题,标题设置居中,设置宽度
    w = "700px"
    h = "600px"
    center = [400, 300]
    pos_left = 200
    # 生成4级网页
    pie = Pie(init_opts=opts.InitOpts(width=w, height=h, page_title="img_view",
                                      ))
    # 加入数据,上方的colums选项取消显示
    # 文章A
    pie.add("words length", c_4a, center=center)
    pie.set_global_opts(title_opts=opts.TitleOpts(title="CET4-A", subtitle="words length statistical")
                        , legend_opts=opts.LegendOpts(pos_left=pos_left)
                        )
    pie.render("./templates/bi_show_cet4pa.html")
    print("生成成功,请见目录:/templates/bi_show_cet4pa.html ......")
    # 文章B
    pie = Pie(init_opts=opts.InitOpts(width=w, height=h, page_title="img_view",
                                      ))
    # 加入数据,上方的colums选项取消显示
    pie.add("words length", c_4b, center=center)
    pie.set_global_opts(title_opts=opts.TitleOpts(title="CET4-B", subtitle="words length statistical")
                        , legend_opts=opts.LegendOpts(pos_left=pos_left)
                        )
    pie.render("./templates/bi_show_cet4pb.html")
    print("生成成功,请见目录:/templates/bi_show_cet4pb.html ......")

    # 生成6级网页
    # 设置主标题与副标题,标题设置居中,设置宽度
    # 文章A
    pie = Pie(init_opts=opts.InitOpts(width=w, height=h, page_title="img_view",
                                      ))
    # 加入数据,上方的colums选项取消显示
    pie.add("words length", c_6a, center=center)
    pie.set_global_opts(title_opts=opts.TitleOpts(title="CET6-A", subtitle="words length statistical"),
                        legend_opts=opts.LegendOpts(pos_left=pos_left))
    pie.render("./templates/bi_show_cet6pa.html")
    print("生成成功,请见目录:/templates/bi_show_cet6pa.html ......")
    # 文章B
    pie = Pie(init_opts=opts.InitOpts(width=w, height=h, page_title="img_view",
                                      ))
    # 加入数据,上方的colums选项取消显示
    pie.add("words length", c_6b, center=center)
    pie.set_global_opts(title_opts=opts.TitleOpts(title="CET6-B", subtitle="words length statistical"),
                        legend_opts=opts.LegendOpts(pos_left=pos_left))
    pie.render("./templates/bi_show_cet6pb.html")
    print("生成成功,请见目录:/templates/bi_show_cet6pb.html ......")


def show_words(top=20):
    """
    展示A、B文章Top关键词
    """
    my_dbc = DbConnect()
    result = my_dbc.select_text_len()
    list_4 = result['4_a'] + result['4_b']
    list_6 = result['6_a'] + result['6_b']
    # 合并文章,处理分词
    text_4 = words_clean(' '.join(list_4).split(" "))
    text_6 = words_clean(' '.join(list_6).split(" "))
    # 去停用词
    stop_words = read_stop_txt('./data/stopwords.txt')
    stop_4 = [word for word in text_4 if word not in stop_words and word != '']
    stop_6 = [word for word in text_6 if word not in stop_words and word != '']

    # 获取关键词
    c_4 = Counter(stop_4).most_common(top)
    c_4.reverse()
    show_x = list(dict(c_4).keys())
    show_y = list(dict(c_4).values())

    # 生成4级网页
    print("开始生成网页......")
    bar = Bar(init_opts=opts.InitOpts(width="800px", height="700px", page_title="img_view",
                                      ))
    # 展示cet4的高频词
    bar.add_xaxis(show_x)
    bar.add_yaxis("Frequency of high frequency words", show_y, itemstyle_opts=opts.ItemStyleOpts(color='#8f4b2e'))
    bar.reversal_axis()
    bar.set_global_opts(title_opts=opts.TitleOpts(title="CET4", subtitle="Statistical"))
    bar.set_series_opts(label_opts=opts.LabelOpts(position="right"))
    bar.render("./templates/bi_show_cet4f.html")
    print("生成成功,请见目录:/templates/bi_show_cet4f.html ......")

    # 生成6级网页
    c_6 = Counter(stop_6).most_common(top)
    c_6.reverse()
    show_x = list(dict(c_6).keys())
    show_y = list(dict(c_6).values())
    bar = Bar(init_opts=opts.InitOpts(width="800px", height="700px", page_title="img_view",
                                      ))
    # 展示cet6的高频词
    bar.add_xaxis(show_x)
    bar.add_yaxis("Frequency of high frequency words", show_y, itemstyle_opts=opts.ItemStyleOpts(color='#2a5caa'))
    bar.reversal_axis()
    bar.set_global_opts(title_opts=opts.TitleOpts(title="CET6", subtitle="Statistical"))
    bar.set_series_opts(label_opts=opts.LabelOpts(position="right"))
    bar.render("./templates/bi_show_cet6f.html")
    print("生成成功,请见目录:/templates/bi_show_cet6f.html ......")


if __name__ == '__main__':
    show_words_length()
    show_words()
    show_length()

4、用户管理模块

  • 用户注册
def do_signup(request):
    email = request.POST['email']
    name = request.POST['name']
    password1 = request.POST['password1']
    password2 = request.POST['password2']
    if email == '' or name == '' or password1 == '' or password2 == '':
        context = {
            "text": "Input error, please complete all forms above!"
        }
    elif password1 != password2:
        context = {
            "text": "Operation error. The passwords you entered twice are inconsistent!"
        }
    else:
        import app.db_model as db_model
        db_c = db_model.DbConnect()
        msg = db_c.insert_user(email, name, password1)
        context = {
            "text": msg
        }
    return render(request, 'user_signup_result.html', context)
  • 用户登录
def user_login(request):
    """
    访问登录界面
    """
    rep = render(request, 'user_login.html', {})
    return rep


def get_ans(request):
    """
    登录界面跳转
    """
    import app.db_model as db_model

    try:
        # if user_name is None or password is None:
        user_name = request.POST["user_name"]
        password = request.POST["password"]
    except KeyError:
        # 无登录信息
        try:
            # 是否已登录,已登录直接返回主页
            user_name = json.loads(request.COOKIES.get('user_name'))
            password = json.loads(request.COOKIES.get('password'))
            # user_name = request.COOKIES.get('user_name')
            # password = request.COOKIES.get('password')
            print(user_name, password)
        except TypeError:
            context = {
                "state": "1",
                "text": "Login status has expired, please login again!"
            }
            return render(request, 'user_error.html', context)

    # print("获取的用户名和密码:", user_name, ';', password)
    if password is "" or user_name is "":
        context = {
            "state": "1",
            "text": "The entered content is empty, please re-enter the login information!"
        }
        return render(request, 'user_error.html', context)
    else:
        db_c = db_model.DbConnect()
        login_msg = db_c.user_login(user_name, password)
        if login_msg['state'] == 0:
            context = {
                "state": login_msg['state'],
                "text": "The user name does not exist, please enter the correct user name!"
            }
            return render(request, 'user_error.html', context)
        if login_msg['state'] == -1:
            context = {
                "state": login_msg['state'],
                "text": login_msg['msg']
            }
            return render(request, 'user_error.html', context)
        elif login_msg['state'] == 2:
            context = {
                "state": login_msg['state'],
                "text": "Wrong password, please enter the correct password!"
            }
            return render(request, 'user_error.html', context)
        else:
            """登录成功,设置cookie"""
            rep = render(request, 'user_home.html', login_msg)
            '''字符转换'''
            user_name = json.dumps(user_name)
            password = json.dumps(password)
            ''' max_age 设置过期时间,单位是秒 '''
            rep.set_cookie('user_name', str(user_name), max_age=1200)
            rep.set_cookie('password', str(password), max_age=1200)
            return rep

5、Django展示界面构建

由于展示界面代码较多,这里就不一一进行展示,感兴趣的同学可以在文章下方找到完整代码下载地址。

  • 这里就附上加载较为关键的前端代码。
  • 展示数据分析结果页面:
{% extends 'base_user.html' %}
{% block content %}
{% load static %}
<div class="container">
    <!--<img id="home_img" class="img-thumbnail" src="{% static 'img/home_img.jpg' %}">-->
    <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
        <ol class="carousel-indicators">
            <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
            <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
            <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
        </ol>
        <div class="carousel-inner" id="home_carousel">
            <div class="carousel-item active">
                <img src="{% static 'img/bi_img1.jpg' %}" class="d-block w-100" alt="home_img1">
            </div>
            <div class="carousel-item">
                <img src="{% static 'img/bi_img2.jpg' %}" class="d-block w-100" alt="home_img2">
            </div>
            <div class="carousel-item">
                <img src="{% static 'img/bi_img3.jpg' %}" class="d-block w-100" alt="home_img3">
            </div>
        </div>
        <button class="carousel-control-prev" type="button" data-target="#carouselExampleIndicators" data-slide="prev">
            <span class="carousel-control-prev-icon" aria-hidden="true"></span>
            <span class="sr-only">Previous</span>
        </button>
        <button class="carousel-control-next" type="button" data-target="#carouselExampleIndicators" data-slide="next">
            <span class="carousel-control-next-icon" aria-hidden="true"></span>
            <span class="sr-only">Next</span>
        </button>
    </div>
</div>

<div class="container">
    <div class="jumbotron">
        <div class="row">
            <div class="col-md-12">
                <div class="card text-left">
                    <h4 class="card-header">Articles Length Analysis</h4>
                    <div class="card-body">
                        <div class="tab-content">
                            <p class="card-title">Length analysis of reading comprehension articles over the years</p>
                            <hr class="my-4">
                            <div id="img_l_cet4">
                                <iframe src="l_show_cet4" width="100%" height="450" scrolling="no" frameborder="0"
                                        οnlοad="changeFrameHeight()"></iframe>
                            </div>
                            <hr class="my-4">
                            <div id="img_l_cet6">
                                <iframe src="l_show_cet6" width="100%" height="450" scrolling="no" frameborder="0"
                                        οnlοad="changeFrameHeight()"></iframe>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <br>
        <div class="row">
            <div class="col-md-12">
                <div class="card text-left">
                    <h4 class="card-header">CET4: Word Length Analysis</h4>
                    <div class="card-body">
                        <div class="tab-content">
                            <p class="card-title">Analysis of word length in reading comprehension articles</p>
                            <hr class="my-4">


                            <div id="img_p_cet4a">
                                <iframe src="p_show_cet4a" width="100%" height="650" scrolling="no"
                                        frameborder="0"
                                        οnlοad="changeFrameHeight()"></iframe>
                            </div>

                            <hr class="my-4">
                            <div id="img_p_cet4b">
                                <iframe src="p_show_cet4b" width="100%" height="650" scrolling="no"
                                        frameborder="0"
                                        οnlοad="changeFrameHeight()"></iframe>
                            </div>


                        </div>
                    </div>
                </div>
            </div>
        </div>
        <br>
        <div class="row">
            <div class="col-md-12">
                <div class="card text-left">
                    <h4 class="card-header">CET6: Word Length Analysis</h4>
                    <div class="card-body">
                        <div class="tab-content">
                            <p class="card-title">Analysis of word length in reading comprehension articles</p>
                            <hr class="my-4">


                            <div id="img_p_cet6a">
                                <iframe src="p_show_cet6a" width="100%" height="650" scrolling="no"
                                        frameborder="0"
                                        οnlοad="changeFrameHeight()"></iframe>
                            </div>

                            <hr class="my-4">
                            <div id="img_p_cet6b">
                                <iframe src="p_show_cet6b" width="100%" height="650" scrolling="no"
                                        frameborder="0"
                                        οnlοad="changeFrameHeight()"></iframe>
                            </div>


                        </div>
                    </div>
                </div>
            </div>
        </div>
        <br>
        <div class="row">
            <div class="col-md-12">
                <div class="card text-left">
                    <h4 class="card-header">High frequency words</h4>
                    <div class="card-body">
                        <div class="tab-content">
                            <p class="card-title">High frequency words and their frequency in reading comprehension A
                                and reading comprehension B</p>
                            <hr class="my-4">
                            <div id="img_f_cet4">
                                <iframe src="f_show_cet4" width="100%" height="750" scrolling="no" frameborder="0"
                                        οnlοad="changeFrameHeight()"></iframe>
                            </div>
                            <hr class="my-4">
                            <div id="img_f_cet6">
                                <iframe src="f_show_cet6" width="100%" height="750" scrolling="no" frameborder="0"
                                        οnlοad="changeFrameHeight()"></iframe>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>


    </div>
</div>
{% endblock %}






  • 展示词频统计:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>img_view</title>
            <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>

</head>
<body>
    <div id="52278b250e324ef4b6962156dc3c3ce8" class="chart-container" style="width:800px; height:700px;"></div>
    <script>
        var chart_52278b250e324ef4b6962156dc3c3ce8 = echarts.init(
            document.getElementById('52278b250e324ef4b6962156dc3c3ce8'), 'white', {renderer: 'canvas'});
        var option_52278b250e324ef4b6962156dc3c3ce8 = {
    "animation": true,
    "animationThreshold": 2000,
    "animationDuration": 1000,
    "animationEasing": "cubicOut",
    "animationDelay": 0,
    "animationDurationUpdate": 300,
    "animationEasingUpdate": "cubicOut",
    "animationDelayUpdate": 0,
    "color": [
        "#c23531",
        "#2f4554",
        "#61a0a8",
        "#d48265",
        "#749f83",
        "#ca8622",
        "#bda29a",
        "#6e7074",
        "#546570",
        "#c4ccd3",
        "#f05b72",
        "#ef5b9c",
        "#f47920",
        "#905a3d",
        "#fab27b",
        "#2a5caa",
        "#444693",
        "#726930",
        "#b2d235",
        "#6d8346",
        "#ac6767",
        "#1d953f",
        "#6950a1",
        "#918597"
    ],
    "series": [
        {
            "type": "bar",
            "name": "Frequency of high frequency words",
            "legendHoverLink": true,
            "data": [
                9,
                9,
                9,
                10,
                10,
                10,
                11,
                11,
                12,
                12,
                12,
                14,
                18,
                18,
                19,
                19,
                20,
                21,
                26,
                28
            ],
            "showBackground": false,
            "barMinHeight": 0,
            "barCategoryGap": "20%",
            "barGap": "30%",
            "large": false,
            "largeThreshold": 400,
            "seriesLayoutBy": "column",
            "datasetIndex": 0,
            "clip": true,
            "zlevel": 0,
            "z": 2,
            "label": {
                "show": true,
                "position": "right",
                "margin": 8
            },
            "itemStyle": {
                "color": "#2a5caa"
            },
            "rippleEffect": {
                "show": true,
                "brushType": "stroke",
                "scale": 2.5,
                "period": 4
            }
        }
    ],
    "legend": [
        {
            "data": [
                "Frequency of high frequency words"
            ],
            "selected": {
                "Frequency of high frequency words": true
            },
            "show": true,
            "padding": 5,
            "itemGap": 10,
            "itemWidth": 25,
            "itemHeight": 14
        }
    ],
    "tooltip": {
        "show": true,
        "trigger": "item",
        "triggerOn": "mousemove|click",
        "axisPointer": {
            "type": "line"
        },
        "showContent": true,
        "alwaysShowContent": false,
        "showDelay": 0,
        "hideDelay": 100,
        "textStyle": {
            "fontSize": 14
        },
        "borderWidth": 0,
        "padding": 5
    },
    "xAxis": [
        {
            "show": true,
            "scale": false,
            "nameLocation": "end",
            "nameGap": 15,
            "gridIndex": 0,
            "inverse": false,
            "offset": 0,
            "splitNumber": 5,
            "minInterval": 0,
            "splitLine": {
                "show": false,
                "lineStyle": {
                    "show": true,
                    "width": 1,
                    "opacity": 1,
                    "curveness": 0,
                    "type": "solid"
                }
            }
        }
    ],
    "yAxis": [
        {
            "show": true,
            "scale": false,
            "nameLocation": "end",
            "nameGap": 15,
            "gridIndex": 0,
            "inverse": false,
            "offset": 0,
            "splitNumber": 5,
            "minInterval": 0,
            "splitLine": {
                "show": false,
                "lineStyle": {
                    "show": true,
                    "width": 1,
                    "opacity": 1,
                    "curveness": 0,
                    "type": "solid"
                }
            },
            "data": [
                "So",
                "learning",
                "research",
                "photos",
                "screen",
                "make",
                "children",
                "percent",
                "social",
                "devices",
                "year",
                "found",
                "online",
                "data",
                "people",
                "years",
                "parents",
                "technology",
                "wellbeing",
                "time"
            ]
        }
    ],
    "title": [
        {
            "text": "CET6",
            "subtext": "Statistical",
            "padding": 5,
            "itemGap": 10
        }
    ]
};
        chart_52278b250e324ef4b6962156dc3c3ce8.setOption(option_52278b250e324ef4b6962156dc3c3ce8);
    </script>
</body>
</html>

六、代码下载地址

由于项目代码量和数据集较大,感兴趣的同学可以直接下载代码,使用过程中如遇到任何问题可以在评论区进行评论,我都会一一解答。

代码下载:

  • 代码分享:基于python+Django的英文数据分析与可视化系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1264626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Agent探针技术

前言 Java Agent基于字节码增强技术研发&#xff0c;支持自动埋点完成数据上报&#xff0c;Java Agent包含(并二次分发)opentelemetry-java-instrumentation CNCF的开源代码&#xff0c;遵循Apache License 2.0协议&#xff0c;在Java Agent包中对opentelemetry License进行了…

为什么国密SSL证书越来越受市场青睐

随着信息技术的迅猛发展&#xff0c;网络安全问题备受关注。在这个背景下&#xff0c;越来越多的单位纷纷选择国密SSL证书&#xff0c;以构建更为安全可靠的网络环境。那么&#xff0c;为什么这么多单位选择国密SSL证书呢&#xff1f; 1&#xff0c;国家政策支持 近年来&#…

战略制定|竞争战略管理分析六大常用工具

企业战略可从多个角度理解&#xff0c;体现为著名的5P模型。首先&#xff0c;从未来发展视角看&#xff0c;战略是一种计划(Plan)&#xff0c;指导企业朝向既定目标前进。而从过去的发展历程看&#xff0c;它呈现为一种模式(Pattern)&#xff0c;反映了企业的历史行为趋势。在产…

【Python】Selenium自动化测试框架

设计思路 本文整理归纳以往的工作中用到的东西&#xff0c;现汇总成基础测试框架提供分享。 框架采用python3 selenium3 PO yaml ddt unittest等技术编写成基础测试框架&#xff0c;能适应日常测试工作需要。 1、使用Page Object模式将页面定位和业务操作分开&#xff0…

uniapp+微信小程序监听返回事件

代码附在最后 适用场景&#xff1a;uniapp开发微信小程序 需求是我点击列表进入数据信息的详情界面&#xff0c;点击详情界面的收藏&#xff0c;返回上一界面后&#xff0c;更新列表中的收藏情况。 目录 一、使用onUnload监听页面卸载 二、使用getCurrentPages()获取当前页…

关于网站的favicon.ico图标的设置需要注意的几点

01-必须在网页的head标签中放上下面的说明&#xff1a; <link rel"shortcut icon" href"/favicon.ico">否则&#xff0c;浏览器虽然能读到图标&#xff0c;但是不会把图标显示在标签上。 02-浏览器会默认到网站根目录中读取文件favicon.ico&#x…

Java线程通信

线程通信 案例 package com.itheima.d4;public class ThreadTest {public static void main(String[] args) {Desk desk new Desk();//创建3个生产者线程new Thread(() -> {while (true) {desk.put();}}, "厨师1").start();new Thread(() -> {while (true) {…

MySQL数据库入门到大牛_基础_18_MySQL8其它新特性(MySQL基础部分最后一章;新特性概述;窗口函数;公用表表达式)

文章目录 1. MySQL8新特性1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性 2. 新特性1&#xff1a;窗口函数2.1 使用窗口函数前后对比2.2 窗口函数分类2.3 语法结构2.4 分类讲解1. 序号函数2. 分布函数3. 前后函数4. 首尾函数5. 其他函数 2.5 小 结 3. 新特性2&#xff1a;公用…

vsphere系列 :虚拟机配置直通GPU后,启动时出现 模块“DevicePowerOn”打开电源失败 的解决方案

vsphere中的虚拟机配置直通GPU后&#xff0c;启动时出现 模块“DevicePowerOn”打开电源失败 的解决方案 vsphere中的虚拟机配置直通GPU后&#xff0c;启动时出现 模块“DevicePowerOn”打开电源失败 的解决方案1、虚拟机配置GPU直通1、打开虚拟机选项2、点击编辑配置3、添加如…

SpringBoot+VUE3前后端分离-【支付宝支付】

1、支付宝沙箱应用申请 https://open.alipay.com/develop/sandbox/app 打开支付宝沙箱能够看到如下信息&#xff1a; 获取到appid&#xff1b; 2、获取应用私钥以及支付宝公钥 在接口加密方式选择公钥模式启用&#xff0c;根据操作即可获取应用公钥、应用私钥以及支付宝公钥…

别再让假的fiddler教程毒害你了,来看这套最全最新的fiddler全工具讲解

fiddler界面工具栏介绍 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; &#xff08;1&#xff09;WinConfig&#xff1a;windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig…

【蓝桥杯选拔赛真题26】C++字符串逆序 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++字符串逆序 一、题目要求 1、编程实现 2、输入输出 二、算法分析

Web框架与Django路由层

Web框架 一 web框架 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式&#xff0c;也为web行为提供了一套通用的方法。web框架已经实现了很多功能&…

11-28渗透

用nmap扫描靶机1进行主机发现 已知靶机1的主机在172.16.17.0/24下 扫描结果如下 根据扫描结果看开启的服务怀疑172.16.17.177是靶机1 浏览器访问172.16.17.177页面得到如下 我们知道织梦cms系统默认管理路径是dede&#xff0c;登陆管理后台可以通过地址172.16.17.177/dede/i…

使用Sui天气预言机获取全球实时天气数据

新的Sui天气预言机为全球1000多个城市的建设者提供天气数据&#xff0c;并作为一个独特的随机数生成器&#xff0c;适用于需要可信赖的随机结果的游戏和投注应用。它由基于Sui的智能合约和一个从OpenWeather API获取天气数据的后端服务组成&#xff0c;任何人都可以将天气数据集…

OPENWRT解决配置pppoe后无法光猫路由管理界面

一、新建一个wan口 二、设置流量转发 设置完成后保存应用即可

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control 个人理解思考基本信息摘要背景挑战方法结果 引言方法论结果讨论引用 个人理解 通过将caption的注意力图注入到目标caption注意力中影响去噪过程以一种直观和便于理解的形式通过修改交叉注意力的…

深入了解MD5加密技术及其应用与局限

一、MD5简介 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种单向散列函数&#xff0c;由美国密码学家罗纳德李维斯特&#xff08;Ronald Linn Rivest&#xff09;于1991年发明。它主要用于将任意长度的消息映射成固定长度的摘要&#xff0c;从而实现消息的完整…

优雅编写测试代码:在pytest中利用Fixture实现自动化测试!

什么是固件 Fixture 翻译成中文即是固件的意思。它其实就是一些函数&#xff0c;会在执行测试方法/测试函数之前&#xff08;或之后&#xff09;加载运行它们&#xff0c;常见的如接口用例在请求接口前数据库的初始连接&#xff0c;和请求之后关闭数据库的操作。 我们之前已经…