恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Django基于Python的农业科学文献相似性检索与推荐系统设计
首页
资讯中心
/
Django基于Python的农业科学文献相似性检索与推荐系统设计
Django基于Python的农业科学文献相似性检索与推荐系统设计
发布时间:2026/9/25 14:25:28
温馨提示本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片一、 技术栈本系统采用前后端分离的架构设计主要技术栈如下1. 后端 (Backend)核心框架: Django 4.x / Django REST framework (DRF)编程语言: Python 3.9数据库: PostgreSQL (用于存储文献元数据、用户信息) / Redis (用于缓存和会话管理)向量数据库: FAISS / Milvus / Pinecone (用于存储和检索文献的向量化表示)自然语言处理 (NLP):Sentence Transformers (如 all-MiniLM-L6-v2)spaCy / NLTK (用于文本预处理)Gensim (可选用于传统主题建模如 LDA)任务队列: Celery Redis (用于异步处理文献向量化、模型训练等耗时任务)API 文档: Swagger / drf-yasg (自动生成 API 文档)2. 前端 (Frontend)框架: Vue.js 3 / ReactUI 库: Element Plus / Ant Design Vue状态管理: Vuex / Pinia (Vue) 或 Redux / Zustand (React)HTTP 客户端: Axios可视化: ECharts / D3.js (用于展示文献关联网络、主题分布等)3. 部署与运维容器化: Docker, Docker ComposeWeb 服务器: Nginx (反向代理和静态文件服务)应用服务器: Gunicorn / uWSGI (用于部署 Django 应用)CI/CD: GitLab CI / GitHub Actions监控: Prometheus Grafana二、 背景与意义1. 研究背景随着农业科研的快速发展相关领域的科学文献数量呈指数级增长。研究人员面临着“信息过载”的困境海量文献: 难以快速找到与自身研究方向高度相关的高质量文献。信息孤岛: 不同数据库、期刊平台的文献相互独立缺乏有效的关联和整合。检索效率低: 传统基于关键词的检索方式受限于词汇表匹配无法理解语义导致查全率和查准率不高。个性化缺失: 无法根据研究者的历史阅读偏好、当前项目需求进行智能推荐。2. 项目意义提升科研效率: 通过语义相似性检索帮助研究者快速定位核心文献节省大量文献调研时间。促进知识发现: 基于向量化表示和相似度计算能够发现跨领域、非关键词直接匹配的潜在相关文献启发新的研究思路。实现个性化服务: 结合用户行为数据点击、收藏、下载构建用户画像实现“千人千面”的文献推荐提升用户体验。技术实践价值: 将前沿的 NLP 技术如 Transformer 模型、向量检索与成熟的 Web 开发框架Django相结合为农业信息化领域提供一个可落地、可扩展的技术解决方案范例。三、 核心代码示例1. 文献向量化与存储 (models.py services.py)# models.py from django.db import models class Literature(models.Model): 农业科学文献模型 title models.CharField(max_length500, verbose_name标题) authors models.TextField(verbose_name作者) abstract models.TextField(verbose_name摘要) keywords models.TextField(verbose_name关键词) publish_date models.DateField(verbose_name发表日期) # 向量字段存储为 JSON 或通过外键关联到向量数据库 embedding_vector models.JSONField(nullTrue, blankTrue, verbose_name向量表示) created_at models.DateTimeField(auto_now_addTrue) def __str__(self): return self.title services.py from sentence_transformers import SentenceTransformer import numpy as np from django.conf import settings class EmbeddingService: 文献嵌入向量生成服务 def init(self): # 加载预训练模型可配置 self.model SentenceTransformer(all-MiniLM-L6-v2) def generate_embedding(self, text): 为文本生成向量 :param text: 输入文本如标题摘要 :return: 向量 (numpy array) # 简单文本预处理 processed_text self._preprocess_text(text) # 生成向量 embedding self.model.encode(processed_text) return embedding.tolist() # 转换为列表便于 JSON 存储 def _preprocess_text(self, text): 简单的文本预处理 # 这里可以加入更复杂的清洗逻辑如去除停用词、词干提取等 if not text: return # 示例转换为小写简单清理 return text.lower().strip() def batch_generate_embeddings(self, texts): 批量生成向量提高效率 processed_texts [self._preprocess_text(t) for t in texts] embeddings self.model.encode(processed_texts) return embeddings.tolist()2. 相似性检索核心逻辑 (views.py)# views.py (基于 DRF) from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status import numpy as np from .models import Literature from .services import EmbeddingService from .vector_db_client import VectorDBClient # 假设的向量数据库客户端 class SimilaritySearchView(APIView): 基于语义的文献相似性检索 API def post(self, request): query_text request.data.get(query, ) top_k request.data.get(top_k, 10) if not query_text: return Response({error: 查询文本不能为空}, statusstatus.HTTP_400_BAD_REQUEST) # 1. 将查询文本向量化 embedding_service EmbeddingService() query_vector embedding_service.generate_embedding(query_text) 2. 在向量数据库中搜索最相似的向量 vector_client VectorDBClient() 假设 search_similar 返回相似文献的 ID 列表和相似度分数 similar_results vector_client.search_similar( query_vectorquery_vector, top_ktop_k, filter_conditions{} # 可添加过滤条件如发表年份范围 ) 3. 根据 ID 从主数据库获取完整的文献信息 literature_ids [result[id] for result in similar_results] literatures Literature.objects.filter(id__inliterature_ids) 保持结果顺序 id_to_literature {lit.id: lit for lit in literatures} ordered_literatures [id_to_literature[lit_id] for lit_id in literature_ids if lit_id in id_to_literature] 4. 序列化并返回结果 from .serializers import LiteratureSerializer serializer LiteratureSerializer(ordered_literatures, manyTrue) 将相似度分数附加到结果中 response_data [] for lit, sim_result in zip(serializer.data, similar_results): lit[similarity_score] sim_result.get(score, 0) response_data.append(lit) return Response({ query: query_text, total: len(response_data), results: response_data })/code/pre 3. 基于协同过滤的推荐 (recommendation.py) recommendation.py from django.db.models import Count from .models import Literature, UserBehavior import numpy as np from collections import defaultdict class HybridRecommender: 混合推荐器结合基于内容的相似性和协同过滤 def init(self, content_weight0.6, cf_weight0.4): self.content_weight content_weight self.cf_weight cf_weight def recommend_for_user(self, user_id, top_n20): 为用户生成个性化推荐 :param user_id: 用户ID :param top_n: 推荐数量 :return: 推荐文献ID列表 # 1. 基于内容的推荐基于用户最近浏览/收藏的文献 content_based_ids self._content_based_recommendation(user_id, top_n) 2. 基于协同过滤的推荐基于相似用户的行为 cf_based_ids self._collaborative_filtering_recommendation(user_id, top_n) 3. 混合策略加权平均 final_scores defaultdict(float) 处理基于内容的结果 for idx, lit_id in enumerate(content_based_ids): rank_score (top_n - idx) / top_n # 简单排名分数 final_scores[lit_id] rank_score * self.content_weight 处理协同过滤的结果 for idx, lit_id in enumerate(cf_based_ids): rank_score (top_n - idx) / top_n final_scores[lit_id] rank_score * self.cf_weight 按最终分数排序返回 top_n sorted_items sorted(final_scores.items(), keylambda x: x[1], reverseTrue) return [item[0] for item in sorted_items[:top_n]] def _content_based_recommendation(self, user_id, top_n): 基于用户历史行为文献的语义相似性进行推荐 获取用户最近交互过的文献 user_behaviors UserBehavior.objects.filter(user_iduser_id).order_by(-timestamp)[:50] if not user_behaviors: return [] seed_literature_ids [ub.literature_id for ub in user_behaviors] seed_literatures Literature.objects.filter(id__inseed_literature_ids) 获取种子文献的向量平均或分别处理 简化取第一篇种子文献进行相似性搜索 if seed_literatures: seed_lit seed_literatures.first() if seed_lit.embedding_vector: # 调用向量搜索服务此处省略具体实现 similar_ids self._search_similar_by_vector(seed_lit.embedding_vector, top_n*2) # 过滤掉用户已经看过的 viewed_ids set(seed_literature_ids) return [lid for lid in similar_ids if lid not in viewed_ids][:top_n] return [] def _collaborative_filtering_recommendation(self, user_id, top_n): 基于用户的协同过滤推荐Item-based CF 找出与目标用户有相似行为的其他用户 简化实现基于文献的共现 user_behaviors UserBehavior.objects.filter(user_iduser_id).values_list(literature_id, flatTrue) if not user_behaviors: return [] 找出也看过这些文献的其他用户 similar_users UserBehavior.objects.filter( literature_id__inuser_behaviors ).exclude(user_iduser_id).values(user_id).annotate( common_countCount(literature_id) ).order_by(-common_count)[:10] similar_user_ids [u[user_id] for u in similar_users] if not similar_user_ids: return [] 获取这些相似用户看过但目标用户没看过的文献 recommended UserBehavior.objects.filter( user_id__insimilar_user_ids ).exclude( literature_id__inuser_behaviors ).values(literature_id).annotate( popularityCount(user_id) ).order_by(-popularity)[:top_n] return [item[literature_id] for item in recommended] def _search_similar_by_vector(self, vector, top_k): 辅助函数通过向量搜索相似文献 此处应调用向量数据库客户端 返回文献ID列表 pass