django项目 法律法规管理系统

1.项目结构

2.项目需求
  1.用户管理模块
  2.数据采集模块
  3.知识管理模块
  4.智能匹配模块
  5.个人收藏模块
  6.数据分析模块
  7.页面展示模块

3.知识点

  1.智能匹配模块推荐算法的实现原理

        TF (Term Frequency):词频,表示一个词在文档中出现的频率。如果一个词在文档中出现的次数越多,那么它的 TF 值就越大。

        IDF (Inverse Document Frequency):逆文档频率,表示一个词的稀有程度。如果一个词在很多文档中都出现过,那么它的 IDF 值就越低,说明这个词的重要性可能不高。IDF 的计算方式是对总文档数目除以包含该词的文档数目,然后取对数。

        TF-IDF 的计算方式是将 TF 和 IDF 相乘,以衡量一个词在文档中的重要性。TF-IDF 旨在找出在当前文档中频繁出现,但在整个文集中很少出现的词,这些词可能具有较高的区分度。

        接下来,使用 TF-IDF 转换文本内容为特征向量,主要步骤如下:

        分词:首先将文本内容进行分词,将其划分为单词或者短语。

        计算词频 TF:对于每个词或短语,计算其在文档中出现的频率。

        计算逆文档频率 IDF:对于整个文集中的每个词或短语,计算其逆文档频率。

        计算 TF-IDF 值:将每个词或短语的 TF 乘以 IDF,得到 TF-IDF 值。

        特征向量表示:将每个文档表示为一个向量,其中向量的每个维度对应一个词或短语的 TF-IDF 值。

        一旦文本内容被转换为 TF-IDF 特征向量,就可以使用余弦相似度来计算文档之间的相似度。余弦相似度是一种常用的相似度度量方法,计算两个向量之间的余弦值,值越接近1表示两个向量越相似,值越接近0表示两个向量越不相似。在这个场景下,使用余弦相似度可以度量用户收藏的法律文件与所有法律文件之间的相似度,从而找出最相似的法律文件进行推荐。

  2.余弦相似度是什么?

        余弦相似度是一种用于衡量两个向量之间相似度的方法。在机器学习和信息检索等领域经常会用到余弦相似度来比较文本、图像、音频等数据之间的相似程度。

余弦相似度通常用于处理高维度的数据,特别是文本数据。在文本数据中,每个文档可以表示为一个向量,其中每个维度对应于一个单词,并且向量的值表示该单词在文档中的出现频率或权重。然后可以使用余弦相似度来比较两个文档之间的相似程度。

余弦相似度的计算公式如下:

similarity(𝐴,𝐵)=𝐴⋅𝐵∥𝐴∥∥𝐵∥similarity(A,B)=∥A∥∥B∥A⋅B​

其中,𝐴A 和 𝐵B 是两个向量,𝐴⋅𝐵A⋅B 是它们的点积,∥𝐴∥∥A∥ 和 ∥𝐵∥∥B∥ 分别是它们的范数(长度)。

余弦相似度的取值范围在 -1 到 1 之间,当两个向量方向相同时取得最大值1,方向相反时取得最小值-1,如果两个向量正交(垂直),则相似度为0。

在实际应用中,通常将余弦相似度用于计算两个文档之间的相似程度,以便进行文本分类、信息检索、推荐系统等任务。

4.主要代码(部分)

#用户数据分析
def data_analysis(request):
    if 'user_id' in request.session:
        user_id = request.session['user_id']
        
        # 执行SQL查询
        with connection.cursor() as cursor:
            cursor.execute("""
                SELECT 法律.*
                FROM 用户收藏
                INNER JOIN 法律 ON 用户收藏.legal_id = 法律.ID
                WHERE 用户收藏.user_id = %s
            """, [user_id])
            rows = cursor.fetchall()
        cursor.close()
        if rows:
                
            # 将查询结果转换成DataFrame
            columns = ['ID', '标题', '办公室', '发布日期', '到期日期', '类型', '状态', 'URL', '点击量']
            df = pd.DataFrame(rows, columns=columns)
            
            # 统计分析
            num_collections = len(df)
            type_counts = df['类型'].value_counts()
            
            plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体
            plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题
            
            # 可视化分析
            plt.figure(figsize=(8, 6))
            type_counts.plot(kind='bar')
            plt.title('收藏法律文件类型统计')
            plt.xlabel('文件类型')
            plt.ylabel('收藏数量')
            plt.xticks(rotation=45)
            plt.tight_layout()
            
            # 将图表数据转换成base64编码的字符串
            buffer = io.BytesIO()
            plt.savefig(buffer, format='png')
            buffer.seek(0)
            plot_data = base64.b64encode(buffer.read()).decode('utf-8')
            plt.close()
            
            # 查询时间序列数据
            with connection.cursor() as cursor:
                cursor.execute("""
                    SELECT DATE(timestamp) AS date, COUNT(*) AS num_collections
                    FROM 用户收藏
                    WHERE user_id = %s
                    GROUP BY DATE(timestamp)
                    ORDER BY DATE(timestamp)
                """, [user_id])
                rows = cursor.fetchall()
            cursor.close()
            
            # 将查询结果转换成DataFrame
            columns = ['date', 'num_collections']
            time_series_df = pd.DataFrame(rows, columns=columns)
            
            # 时间序列可视化分析
            plt.figure(figsize=(10, 6))
            plt.plot(time_series_df['date'], time_series_df['num_collections'], marker='o', linestyle='-')
            plt.title('收藏数量随时间变化趋势')
            plt.xlabel('日期')
            plt.ylabel('收藏数量')
            plt.xticks(rotation=45)
            plt.tight_layout()
            
            # 将时间序列图表数据转换成base64编码的字符串
            buffer = io.BytesIO()
            plt.savefig(buffer, format='png')
            buffer.seek(0)
            time_series_plot_data = base64.b64encode(buffer.read()).decode('utf-8')
            plt.close()
            
            # 查询与当前用户共享收藏的其他用户数量
            with connection.cursor() as cursor:
                cursor.execute("""
                    SELECT COUNT(DISTINCT user_id) AS shared_users
                    FROM 用户收藏
                    WHERE legal_id IN (
                        SELECT legal_id
                        FROM 用户收藏
                        WHERE user_id = %s
                    )
                    AND user_id != %s
                """, [user_id, user_id])
                shared_users_count = cursor.fetchone()[0]
            cursor.close()

            
            # 将统计分析和时间序列分析的结果和图表数据传递给模板
            context = {
                'num_collections': num_collections,
                'type_counts': type_counts,
                'plot_data': plot_data,
                'time_series_plot_data': time_series_plot_data,
                'shared_users_count': shared_users_count,
                
            }
            return render(request, 'data_analysis.html', context)
        else:
            return render(request, 'data_analysis.html', context = {
                'num_collections': '',
                'type_counts': '',
                'plot_data': '',
                'time_series_plot_data': '',
                'shared_users_count': '',
            })
    else:
        return render(request, 'login.html')
def user_management(request):
    if 'user_id' in request.session:
        if request.method == 'POST':
            email = request.POST.get('email')
            new_password = request.POST.get('new_password')
            user_id = request.session['user_id']
            # 检查用户输入的邮箱是否存在于数据库中
            try:
                user = User.objects.get(email=email,id=user_id)
            except User.DoesNotExist:
                return render(request, 'user_management.html', {'error_message': 'Invalid email'})

            # 更新用户密码为新密码
            user.password = new_password
            user.save()

            return render(request, 'user_management.html', {'reset_password_sent': True})
        else:
            return render(request, 'user_management.html')
    else:
        return render(request, 'login.html')

5.运行效果

 

 

6.遇到问题及总结:

        1.特别多的问题,例如前端获取不到数据给后端,ajax传递数据老是报错,

        2.学会了很多,例如模态框,数据大屏,推荐算法等等 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode --- 长度最小的子数组(滑动窗口)

前言 滑动窗口算法是一种用于解决数组或者列表中子数组或者字串问题的方法,通常用于在给定数据上执行连续区间的操作,算法基本思想是维护一个固定大小或不定大小的窗口,通过移动窗口的起始位置和结束位置来遍历整个数据。在每个窗口位置&…

重拾前端基础知识:JavaScript

重拾前端基础知识:JavaScript 前言使用JavaScript输出语法运算符条件语句循环数据类型字符串数字数组对象日期函数 数学正则表达式异常处理类集合模块JSON闭包异步调试DOM(文档对象模型)事件事件监听器表单 BOM(浏览器对象模型&am…

【Linux杂货铺】调试工具gdb的使用

目录 🌈前言🌈 📁背景介绍 📁 使用 list [行号] / [函数名] run/r break/b [行号] / [函数名] info break disable break enable break delete break [断点编号] next/n step/s continue/c finish print/p [变量…

旧的Spring Security OAuth已停止维护,全面拥抱新解决方案Spring SAS

Spring Authorization Server 替换 Shiro 指引 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护,该项目将不会再进行任何的迭代 目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用作为 SpringBoot 3.0 的最新…

Redis--事务机制的详解及应用

Redis事务的概念: Redis事务就是将一系列命令包装成一个队列,在执行时候按照添加的顺序依次执行,中间不会被打断或者干扰,在执行事务中,其他客户端提交的命令不可以插入到执行事务的队列中,简单来说Redis事…

Springboot接口参数校验

在设计接口时我们通常需要对接口中的非法参数做校验,以降低在程序运行时因为一些非法参数而导致程序发生异常的风险,例如登录的时候需要校验用户名密码是否为空,创建用户的时候需要校验邮件、手机号码格式是否准确。如果在代码中对接口参数一…

AOP案例(黑马学习笔记)

需求 需求:将案例中增、删、改相关接口的操作日志记录到数据库表中 ● 就是当访问部门管理和员工管理当中的增、删、改相关功能接口时,需要详细的操作日志,并保存在数据表中,便于后期数据追踪。 操作日志信息包含: ●…

基于HT32的智能家居demo(蓝牙上位机)

参加合泰杯作品的部分展示,基于HT32的智能家居,这里展示灯光的相关控制,是用蓝牙进行的数据透传,参考了一些资料,美化封装了一下之前的上位机界面。 成果展示 点击主界面的蓝牙设置,进行连接,下…

Android和Linux的嵌入式开发差异

最近开始投入Android的怀抱。说来惭愧,08年就听说这东西,当时也有同事投入去看,因为恶心Java,始终对这玩意无感,没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业,所以只能回过头又来学。 首先还是…

编码规则转换

思考: 如何将一个机内码转换为区内码? 只要将机内码减去 A0A0 就可以啦 如果只让我们用加法器来解决呢? 注意我们的数据占用了 32 位,如果想用补码进行减法运算的话,符号位怎么办??&#xf…

了解Spring中Bean:配置与作用域

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共…

Linux和Windows集群中部署HTCondor

目录 1、集群架构 2、HTCondor版本 3、Linux系统安装 3.1、HTCondor安装 3.2、中央管理节点配置 3.3、其他节点配置 4、Windwos系统安装 5、安全配置 6、参考 1、集群架构 操作系统IP地址1*Ubuntu22.04192.168.1.742Ubuntu22.04192.168.1.603Ubuntu22.04192.168.1.6…

python3装饰器

装饰器 它允许你修改函数或类的行为,而不更改其源代码。实质上,装饰器是接受另一个函数作为参数并返回一个包装原始函数的新函数。这样,你可以在不修改原始函数的情况下,添加一些额外的功能或逻辑。 def time_cost(func):"…

Java 数组(详细)

目录 一、数组的概述 1. 数组的理解: 2. 数组相关的概念: 3. 数组的特点: 4. 数组的分类: 5.数据结构: 二、一维数组 1. 一维数组的声明与初始化 2. 一维数组元素的引用: 3. 数组的属性&#xff1…

期货开户金融期货的种类

金融期货概念及其种类有哪些?期货种类分为商品期货、金融期货、和期货期权。金融期货是期货的其中一个种类,它是以证券;货币、汇率,利率等金融产品作为买卖标的的期货品种。金融期货交易产生于本世纪70年代的美国市场,…

项目解决方案: 实时视频拼接方案介绍(中)

目 录 1.实时视频拼接概述 2.适用场景 3.系统介绍 4. 拼接方案介绍 4.1基于4K摄像机的拼接方案 4.2采用1080P平台3.0 横向拼接 4.2.1系统架构 4.2.2系统功能 4.2.3方案特色 4.2.4适用场景 4.2.5设备选型 4.3纵横兼顾,竖屏拼接 4.3.1系统…

从下一代车规MCU厘清存储器的发展(2)

目录 1.概述 2.MCU大厂的选择 2.1 瑞萨自研STT-MRAM 2.2 ST专注PCM 2.3 英飞凌和台积电联手RRAM 2.4 NXP如何计划eNVM 3.小结 1.概述 上篇文章,我们简述了当前主流的存储器技术,现在我们来讲讲各大MCU大厂的技术选择 2.MCU大厂的选择 瑞萨日…

取送货问题(Pickup and Delivery Problem)

取送货问题及其变体 广义取送货问题(General Pickup and Delivery Problems,GPDP)可以分为两类: Vehicle Routing Problems with Backhauls,VRPB:从配送中心(depot)取货运输货物到客…

VUE3:省市区联级选择器

一、实现效果 二、代码展示 <template><div class"page"><select v-model"property.province"><option v-for"item in provinces" :key"item">{{ item }}</option></select><select v-model&…

RabbitMQ-消息队列:优先级队列、惰性队列

20、优先级队列 在我们系统中有一个订单催付的场景&#xff0c;我们的客户在天猫下的订单&#xff0c;淘宝会及时将订单推送给我们&#xff0c;如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒&#xff0c;很简单的一个功能对吧。 但是&#xff0c;天猫商家对我…
最新文章