1. 项目背景与核心需求
这个毕业设计项目瞄准了当前普法内容传播的痛点——传统普法视频往往采用单向灌输模式,缺乏针对不同受众的精准推荐能力。我们团队在前期调研中发现,超过78%的法律援助机构反馈普法视频的完播率不足30%,而同时有61%的受访者表示"找不到适合自己法律认知水平的普法内容"。
项目要实现的核心功能包括:
- 基于用户画像的个性化推荐引擎
- 法律知识图谱构建与实时更新
- 多维度视频内容特征提取
- 混合推荐策略(协同过滤+知识图谱)
- 可解释的推荐结果展示
2. 系统架构设计
2.1 技术栈选型
后端采用Django+Neo4j组合,主要考虑因素:
- Django的ORM对复杂数据关系的处理能力(尤其适合用户-视频-标签的多对多关系)
- Neo4j在图数据遍历上的性能优势(法律条文间的关联查询速度比MySQL快5-8倍)
- Python生态对NLP处理的完善支持(结巴分词、LTP等工具包)
前端使用Vue+Bootstrap3实现响应式布局,确保在普法宣传现场(如社区服务站的老旧电脑)也能流畅运行。
2.2 数据流设计
系统数据处理流程分为三个核心环节:
- 视频元数据采集:通过定制爬虫从普法网站抓取基础信息
- 内容深度解析:
- 使用OpenCV提取关键帧(每30秒一帧)
- 阿里云NLP服务进行字幕文本实体识别
- 自建法律术语词典增强识别准确率
- 用户行为埋点:
- 前端埋点采集播放进度、暂停点等23项指标
- 后端通过Django Channels实现实时行为分析
3. 知识图谱构建实战
3.1 法律实体识别
我们构建了包含4层结构的法律本体:
- 法律体系(宪法/民法/刑法等)
- 具体法律条文
- 司法解释
- 典型案例
使用改进的BiLSTM-CRF模型进行实体识别,在自建测试集上F1值达到0.87。关键改进点包括:
- 加入法律术语注意力层
- 设计条文编号特殊处理规则
- 引入对抗训练提升泛化能力
3.2 图谱关系挖掘
关系类型设计为7大类28小类,包括:
- 上位/下位关系(如《合同法》与《民法典》)
- 引用关系(如刑法第XX条引用司法解释)
- 相似案例关系(通过判决文书相似度计算)
使用Neo4j的APOC插件实现批量导入,包含12万+节点和35万+关系边。
4. 混合推荐算法实现
4.1 协同过滤优化
针对普法视频的冷启动问题,我们改进传统ItemCF算法:
- 加入法律知识权重(刑法内容比民法获得更高初始权重)
- 设计时效性衰减因子(新颁布法律的相关视频获得推荐加成)
- 实现基于Redis的实时相似度计算
def calculate_similarity(video1, video2): # 基础观看行为相似度 behavior_sim = cosine_similarity(video1['watch_vec'], video2['watch_vec']) # 知识图谱增强 kg_sim = neo4j_query( f"MATCH (v1)-[r]->(v2) WHERE id(v1)={video1.id} AND id(v2)={video2.id} " "RETURN sum(r.weight)*0.2" ) # 时效性调整 time_factor = 1/(1 + math.log(1 + (now - video1.publish_date).days)) return behavior_sim * 0.6 + kg_sim * 0.3 + time_factor * 0.14.2 知识图谱路径推荐
当用户观看"劳动合同纠纷"相关视频时,系统会:
- 在Neo4j中查询该视频关联的法律条文
- 沿图谱寻找3跳内的关联内容(如《劳动法》→社保缴纳→工伤认定)
- 按路径权重排序生成推荐列表
5. 工程实现关键点
5.1 性能优化方案
针对普法视频的特征提取耗时问题,我们设计了两级缓存:
- 视频基础特征缓存:Redis存储,过期时间24h
- 深度特征缓存:MongoDB存储,按LRU策略淘汰
测试表明该方案使推荐响应时间从1.8s降至400ms左右。
5.2 可解释性实现
推荐结果展示时附带可视化解释:
- 法律条文关联路径图
- "推荐理由"自然语言生成
- 相似用户观看分布
使用D3.js实现的关系路径图,可以让基层普法人员直观理解推荐逻辑。
6. 部署与测试
6.1 压力测试数据
在阿里云2核4G服务器上:
- 100并发用户时API平均响应时间:320ms
- 知识图谱查询P99延迟:210ms
- 推荐结果生成耗时:150-400ms
6.2 效果评估指标
使用真实普法宣传场景数据测试:
- 推荐视频的完播率提升至58%
- 用户主动搜索次数下降42%
- 法律知识测试正确率提升35%
7. 踩坑实录
Neo4j批量导入时遇到的内存溢出问题:
- 错误做法:直接导入10万+节点的CSV文件
- 正确方案:使用apoc.periodic.iterate分批次提交
- 优化后导入时间从6小时缩短到23分钟
视频特征提取的GPU显存泄漏:
- 现象:处理200+视频后程序崩溃
- 定位:OpenCV的DNN模块未释放显存
- 解决:封装提取进程,单次任务后强制重启
Django ORM的N+1查询问题:
- 典型错误:在推荐结果序列化时遍历查询关联对象
- 优化方案:使用select_related和prefetch_related
- 效果:单个API查询从17次SQL降到3次
这个项目让我深刻体会到:在法律与技术交叉领域,算法效果不是唯一追求点,更重要的是推荐结果的法律严谨性和可解释性。我们后来增加的"法条溯源"功能,就是应基层司法局要求特别开发的——他们需要确保每个推荐视频都有明确的法律依据。