毕业设计:Python招聘推荐系统 协同过滤推荐算法 Django框架 (建议收藏)

184 篇文章 44 订阅
178 篇文章 9 订阅

[毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总

2023年 - 2024年 最新计算机毕业设计 本科 选题大全 汇总

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 。

1、项目介绍

该系统所采用的设计模式为MTV模式,开发语言为Python语言,数据库是MySQL,使用Python的web框架Django进行开发。该招聘推荐系统包括用户用户、企业用户、管理员三种角色。其中用户用户的主要功能是浏览岗位、应聘岗位、推荐岗位;企业用户的主要功能是发布岗位、处理申请信息;管理员的功能包括对数据库中各种信息表的增删改查功能。并且该招聘管理系统实现了个性化推荐,极大程度的满足了用户找兼职的个性化需求,大大缩短了用户寻找工作的时间。

2、项目界面

(1)用户推荐界面—协同过滤推荐算法

在这里插入图片描述

(2)用户首页

在这里插入图片描述

(3)招聘数据(可应聘投递简历)

在这里插入图片描述

(4)用户管理界面

在这里插入图片描述

(5)用户申请信息

在这里插入图片描述

(6)注册登录界面

在这里插入图片描述

3、项目说明

本文在协同过滤算法的基础上开发招聘推荐系统,使用了基于用户的协同过滤这种推荐技术,并对这种算法都进行了实现。本项目的编写语言是Python,Django也是web开发比较好的一个常用框架。采用的MySQL数据库,是因为MySQL数据库操作性更高,开发逻辑清晰,代码可读性高,界面简洁,大多数关系型数据库使用的都是MySQL。本校的招聘推荐系统采用了Django框架进行开发,并且对后期功能的扩展和维护做了很好的考虑。测试结果表明,该系统已经成功地实现了主要功能并且达到了预期目标。该系统分为两个主要部分,分别是用户端和服务端,也就是系统的前台和后台。系统的前台提供了用户注册和登录、岗位查看、应聘、推荐、发布、个人信息查看和修改等功能。而后台则主要管理账户、申请信息、用户用户和企业用户。在测试阶段,本系统表现稳定,并且强大的实用性和方便的岗位推荐功能让人印象深刻。本文最终实现了基于用户的协同过滤算法,并成功将算法应用于该管理系统。

4、核心代码

#!/usr/bin/python3.9.10
# -*- coding: utf-8 -*-

import os

os.environ["DJANGO_SETTINGS_MODULE"] = "djangoProject4.settings"
import django

django.setup()
from boss import models as bm
from user import models as um
from math import sqrt, pow
import operator
from django.db.models import Subquery, Q, Count
import random
import pandas as pd


# # 计算相似度
def similarity(job1_id, job2_id):
    job1_set = um.Apply.objects.filter(infoid=job1_id)
    # print(job1_set.values())
    # job1的投递用户数
    job1_sum = job1_set.count()
    # job2的投递用户数
    job2_sum = um.Apply.objects.filter(infoid=job2_id).count()
    # 没有人投递当前职位
    if job1_sum == 0 or job2_sum == 0:
        return 0
    else:
        # 两者的交集
        common = um.Apply.objects.filter(userid__in=Subquery(job1_set.values('userid')), infoid=job2_id).values('userid').count()
        similar_value = common / sqrt(job1_sum * job2_sum)  # 余弦计算相似度
        return similar_value


def recommend_by_item_id(user_id, k=9):
    # 投递简历最多的前三address
    jobs_id = um.Apply.objects.filter(userid=user_id).values('infoid')  # 先找出用户投过的简历
    print(jobs_id)
    # 如果当前用户没有投递过简历,则查看所有用户投递的最多的职位进行随机推荐
    if um.Apply.objects.filter(userid=user_id).count() == 0:
        user_expect_1 = [x['infoid'] for x in list(um.Apply.objects.all().values('infoid'))]
        user_expect = [[x, user_expect_1.count(x)] for x in user_expect_1]
        user_expect = sorted(user_expect, key=lambda x: x[1], reverse=True)[:k]  # 排序后去k个职位
        user_expect = [x[0] for x in user_expect]
        # print(user_expect)
        job_list = [bm.Info.objects.filter(id=x).values().first() for x in user_expect]
        while len(job_list) < 9:  # 如果小于9则用其他职位随机补充
            job_list_1 = bm.Info.objects.all().values().order_by('?').first()
            if job_list_1 not in job_list:
                job_list.append(job_list_1)
        # print(job_list)
        # print(len(job_list))
        return job_list
    else:
        key_word_list = []  # 找出用户投递的职位地址信息
        for job in jobs_id:
            key_word_list.append(bm.Info.objects.get(id=job['infoid']).address)
        print(key_word_list)
        key_word_list_1 = list(set(key_word_list))
        user_prefer = []
        for key_word in key_word_list_1:
            user_prefer.append([key_word, key_word_list.count(key_word)])
        user_prefer = sorted(user_prefer, key=lambda x: x[1], reverse=True)  # 排序
        user_prefer = [x[0] for x in user_prefer[0:3]]  # 找出最多的3个投递简历的key_word
        print(user_prefer)

        # # 选用户投递最多的职位的地址信息,再随机选择30个没有投递过的简历的职位,计算距离最近
        apply_id_list = [x['infoid'] for x in jobs_id]

        un_send = list(bm.Info.objects.filter(~Q(id__in=apply_id_list), address__in=user_prefer).order_by('?').values())[:30]  # 没有投过的简历
        print(un_send)

        send = []  # 找出用户投递的职位
        for job in apply_id_list:
            send.append(bm.Info.objects.filter(id=job).values().first())
        print(send)
        distances = []
        names = []
        # 在未投过的简历的职位中找到
        for un_send_job in un_send:
            for send_job in send:
                if un_send_job not in names:
                    names.append(un_send_job)
                    distances.append((similarity(un_send_job['id'], send_job['id']), un_send_job))  # 加入相似的职位列表
        distances.sort(key=lambda x: x[0], reverse=True)
        print('this is distances', distances[:k])
        recommend_list = []
        for mark, job in distances:
            if len(recommend_list) >= k:
                break
            if job not in recommend_list:
                recommend_list.append(job)
        print('this is recommend list', recommend_list)
        return recommend_list


if __name__ == '__main__':
    # similarity(2003, 2008)
    # recommend_by_item_id(10)
    pass


源码获取:

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看主页【专栏名称】或者【用户名】或者顶部的【选题链接】就可以找到我获取项目源码学习啦~🍅

大家点赞、收藏、关注、评论啦 !

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值