# Python_movie_sys **Repository Path**: final__fc/python_movie_sys ## Basic Information - **Project Name**: Python_movie_sys - **Description**: 毕业设计无偿分享,后续要提交到学校的服务器·上面。哈哈哈哈哈哈 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-21 - **Last Updated**: 2025-05-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README --- typora-copy-images-to: ./assert typora-root-url: ./assert --- # 项目介绍(克隆到本地就可以看到下面的图片了!!!) 扯淡中,作为核心开发成员,主导并参与电影推荐系统的用户端(Web)与后台服务端开发,实现从需求分析、架构设计到部署上线的全流程闭环。系统日均处理5000+用户请求,推荐准确率提升35%,用户活跃度增长20%。 ## 项目使用(本项目只有后端代码) 前端项目代码在gitee网址 导入项目依赖: ``` pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt ``` 后端启动命令: ``` python manage.py runserver ``` 1. 前端安装: 安装node-v14.19.1以上版本这个你·自己安装哈!!!进入bs-frontend-template文件夹 执行安装命令|启动命令: ``` npm install npm run dev ``` 2. 访问 http://localhost:3002/ 输入账号:admins 输入密码:admins **图示** ![image-20250517163655775](./image-20250517163655775.png) **进入系统后显示** ![image-20250517163824809](./image-20250517163824809.png) 3. 数据库使用: 迁移命令(不要使用,在更新模型字段或者其他涉及数据库操作时才需要使用以下命令): ``` python manage.py makemigrations python manage.py migrate ``` image-20250517163908884 将上图的db.sqlite3这是迁移出来的文件导入到navicat中显示(无需密码) 在里面可以编辑不同表的数据 ![image-20250517164007749](./image-20250517164007749.png) 4. 后台管理(这一块的功能自己玩吧!!!!): 点击黄色箭头的按钮 ![image-20250517164525354](./image-20250517164525354.png) ![image-20250517164444466](./image-20250517164444466.png) 5. 推荐算法文件在 image-20250517165026795 部分算法代码片段: ```python def similarity(movie1_id, movie2_id): movie1_set = Rate.objects.filter(movie_id=movie1_id) # movie1的打分用户数 movie1_sum = movie1_set.count() # movie_2的打分用户数 movie2_sum = Rate.objects.filter(movie_id=movie2_id).count() # 两者的交集 common = Rate.objects.filter(user_id__in=Subquery(movie1_set.values('user_id')), movie=movie2_id).values('user_id').count() # 没有人给当前电影打分 if movie1_sum == 0 or movie2_sum == 0: return 0 similar_value = common / sqrt(movie1_sum * movie2_sum)#余弦计算相似度 return similar_value #基于物品 def recommend_by_item_id(user_id, k=15): # 前三的tag,用户评分前三的电影 user_prefer = UserTagPrefer.objects.filter(user_id=user_id).order_by('-score').values_list('tag_id', flat=True) user_prefer = list(user_prefer)[:3] current_user = User.objects.get(id=user_id) # 如果当前用户没有打分 则看是否选择过标签,选过的话,就从标签中找 # 没有的话,就按照浏览度推荐15个 if current_user.rate_set.count() == 0: if len(user_prefer) != 0: movie_list = Movie.objects.filter(tags__in=user_prefer)[:15] else: movie_list = Movie.objects.order_by("-num")[:15] print('from here') return movie_list # most_tags = Tags.objects.annotate(tags_sum=Count('name')).order_by('-tags_sum').filter(movie__rate__user_id=user_id).order_by('-tags_sum') # 选用户最喜欢的标签中的电影,用户没看过的30部,对这30部电影,计算距离最近 un_watched = Movie.objects.filter(~Q(rate__user_id=user_id), tags__in=user_prefer).order_by('?')[:30] # 看过的电影 watched = Rate.objects.filter(user_id=user_id).values_list('movie_id', 'mark') distances = [] names = [] # 在未看过的电影中找到 for un_watched_movie in un_watched: for watched_movie in watched: if un_watched_movie not in names: names.append(un_watched_movie) distances.append((similarity(un_watched_movie.id, watched_movie[0]) * watched_movie[1], un_watched_movie))#加入相似的电影 distances.sort(key=lambda x: x[0], reverse=True) # print('this is distances', distances[:15]) recommend_list = [] for mark, movie in distances: if len(recommend_list) >= k: break if movie not in recommend_list: recommend_list.append(movie) # print('this is recommend list', recommend_list) # 如果得不到有效数量的推荐 按照未看过的电影中的热度进行填充 # print('recommend list', recommend_list) return recommend_list ``` 6. 电影数据可视化项目**gitee**网址在包含前后端(这一块的使用文档在网址下的READMD.md会详细说明迭代哈!!!) ``` https://gitee.com/final__fc/movie_-sys ``` **图示:** ![image-20250517170127325](./image-20250517170127325.png) ![image-20250517170201778](./image-20250517170201778.png) ![image-20250517170248541](./image-20250517170248541.png)