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 = 法律.IDWHERE 用户收藏.user_id = %s""", [user_id])rows = cursor.fetchall()cursor.close()if rows:# 将查询结果转换成DataFramecolumns = ['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_collectionsFROM 用户收藏WHERE user_id = %sGROUP BY DATE(timestamp)ORDER BY DATE(timestamp)""", [user_id])rows = cursor.fetchall()cursor.close()# 将查询结果转换成DataFramecolumns = ['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_usersFROM 用户收藏WHERE legal_id IN (SELECT legal_idFROM 用户收藏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_passworduser.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.hqwc.cn/news/504455.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端素材】推荐优质后台管理系统网页Stisla平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具,通常由管理员使…

[VSCode插件] 轻量级静态博客 - MDBlog

MDBlog VSCode插件,基于Markdown的轻量级静态博客系统,同时支持导出为可以部署的静态博客。 仓库 MDBlog 1. Features 博客基础功能:分类管理、文章管理、自动生成索引快捷指令:快捷输入表格、mermaid、wavedrom、代码块发布&a…

Linux信号【systemV】

目录 前言 正文: 1消息队列 1.1什么是消息队列? 1.2消息队列的数据结构 1.3消息队列的相关接口 1.3.1创建 1.3.2释放 1.3.3发送 1.3.4接收 1.4消息队列补充 2.信号量 2.1什么是信号量 2.2互斥相关概念 2.3信号量的数据结构 2.4…

设计模式七:责任链模式

文章目录 1、责任链模式2、spring中的责任链模式Spring InterceptorServlet FilterNetty 1、责任链模式 责任链模式为请求创建了一个接收者对象的链,在这种模式下,通常每个节点都包含对另一个节点者的引用。每个节点针对请求,处理自己感兴趣…

动态规划课堂2-----路径问题

目录 引言: 例题1:不同路径 例题2:不同路径II 例题3:礼物的最⼤价值 例题4:下降路径最⼩和 例题5:最小路径和 结语: 引言: 在学习完动态规划斐波那契数列模型后,…

每周一算法:双向广搜

题目链接 字符串变换 题目描述 已知有两个字串 A , B A,B A,B,及一组字串变换的规则(至多 6 6 6个规则): A 1 → B 1 A_1→B_1 A1​→B1​ A 2 → B 2 A_2→B_2 A2​→B2​ … 规则的含义为:在 A A A中的子串 A 1 A_1 A1​…

Java构造方法总结(很清晰)

构造方法扫盲:构造方法就是为了创建对象的 解释:真正创建对象的是 new 这个关键字,Java 虚拟机在创建对象时是有很多步骤的,构造方法只是其中的一步,它的作用是进行成员变量初始化。

自媒体ChatGPT4.0批量洗稿改写文章软件多开教程

大家好,我是淘小白~ 之前写的软件,ChatGPT4.0洗稿软件,因为是驱动浏览器改写的,还需要过openai官网的机器验证,所以,软件是免登录的,需要我们提前登录好自己的账号信息,软件根据浏览…

【数据结构】之优先级队列(堆)

文章目录 一、优先级队列的概念二、优先级队列的模拟实现1.堆的存储2.堆的创建3.代码的实现 一、优先级队列的概念 队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的…

2024理解这几个安全漏洞,你也能做安全测试!

如今安全问题显得越来越重要,一个大型的互联网站点,你如果每天查看日志,会发现有很多尝试攻击性的脚本。 如果没有,证明网站影响力还不够大。信息一体化的背后深藏着各类安全隐患,例如由于开发人员的不严谨导致为Web应…

Java虚拟机(JVM)从入门到实战【上】

Java虚拟机(JVM)从入门到实战【上】,涵盖类加载,双亲委派机制,垃圾回收器及算法等知识点,全系列6万字。 一、基础篇 P1 Java虚拟机导学课程 P2 初识JVM 什么是JVM Java Virtual Machine 是Java虚拟机。…

频率域采样

1. 频率域采样 (1) 采样的过程:DFT的X(k)是对周期且连续的频谱X()在[0,2pi)上的等间隔采样,采N个点得到的,采样间隔是;频域采样要求时域有限,即假设x(n)的长度是有限值M,x(n)的SFT是X()。 (2) X(k) 做IDF…