基于python的大学生就业推荐系统

大学生就业推荐系统

源码可私信我

1、绪论

1.1 选题背景

        网络招聘,一般也称为在线招聘或者是电子招聘,是指在借助互联网的应用,实现企业单位人事部完成招聘工作的一种新型模式,即企业或者事业单位通过企业的官方网站或者互联网的第三方招聘信息发布平台如智联、boss直聘、前程无忧等发布相应的招聘信息,然后通过电子邮件或者平台内部的简历数据库搜集应聘者的应聘信息,接着对简历进行初步筛选,再根据岗位实际需要安排相应的笔试和面试,最后确定聘用适合企业招聘岗位要求的岗位人选。不同于传统招聘,网络招聘打破了时间和空间上的限制,可以快速、便捷地在招聘双方之间传递信息,让双方的交流互动更加方便和及时。现在的互联网信息技术发展迅速,对人们的生活方式产生了深刻的影响,网络招聘已经成为很多求职者的首要选择,越来越多的企业或者事业单位也通过网络招聘进行人才招聘。总而言之网络招聘以它自身独特的优势成为进行招聘工作的主流趋势。

1.2 选题意义

        对于即将毕业找工作的应届生和社会择业人员来说,通过网络去找到合适自己的工作,是非常急需的。但是现在网络上的招聘信息太多,想要找到自己想要的信息任务量太大,需要花费的时间也更多,这给就业者根据自身的情况选择自己适合的职业带来了困难。对于上面的不足之处,就需要使用推荐系统,去帮助求职者在杂论无章的数据里找到自己需要的数据,减少求职者找工作的时间,帮助求职者快速择业。

        本系统为了解决用户面临大量招聘职位信息的“信息过载”问题,可根据关键字爬取猎聘网的招聘信息,在短时间内就能够获取到大量的招聘信息,且该系统提供了用户需要的检索功能,这样用户就可以通过该系统来进行招聘信息的检索,求职者可以通过选择自身情况和想要的招聘岗位来选择查看相应的招聘信息,在用户与系统进行交互的过程中,收集用户的交互信息,试图猜测用户所想要的招聘职位信息展现给用户,从而使求职者可以更快找到心仪的工作。

1.3 研究的内容

        本文设计并实现了一个基于Python的大学生就业推荐系统,通过爬取猎聘网上多种类的有效信息。以关键字为主导,城市为区分,将多种类的招聘就业信息的数据存入mysql数据库,再以数据库为连接,开发出一个以 python 开源 web 框架Django 的基础的,加入推荐算法的就业推荐系统。

2、开发环境及技术

2.1 网络爬虫技术

        爬虫,又称为网络爬虫或网络蜘蛛,是一种自动化程序或脚本,用于按照一定规则自动地抓取互联网上的数据。这些爬虫模拟了人类浏览网页的行为,通过访问网站并解析其页面内容,收集所需的信息。爬虫的工作原理包括爬虫向目标网站发送HTTP请求,网站服务器接收到请求后,会返回一个响应,这个响应通常包含了请求页面的HTML代码、CSS样式、JavaScript脚本等内容。爬虫接收到响应后,会解析HTML代码,提取出所需的信息。这可以通过正则表达式、XPath、CSS选择器等方式来实现。提取的信息会被存储起来,可以是保存在本地文件、数据库中,或者进行进一步的处理和分析。爬虫还会分析页面中的链接,将新的URL加入到待抓取队列中,以实现整个网站的遍历或特定目标的深度抓取。

2.2 协同过滤算法

        协同过滤算法是一种基于用户行为数据的推荐算法,它通过分析用户的历史行为数据来计算用户之间的相似度,然后根据相似用户或相似物品的评价来预测用户对未知物品的喜好程度。协同过滤是当前推荐技术和算法中使用最广泛和认可度最高的算法之一。

        协同过滤算法的核心思想是“物以类聚,人以群分”。它的基本假设是,如果两个用户在过去的行为上有很大的相似性,比如对相同的物品集合有类似的评价,那么他们在未来的行为上也可能会有很大的相似性。

        协同过滤算法有两种主要的实现方式:基于用户的协同过滤算法和基于物品的协同过滤算法。基于用户的协同过滤算法首先计算用户之间的相似度,这通常使用各种相似度计算方法,如余弦相似度、皮尔逊相关系数等。然后,根据用户相似度和他们对物品的评价来预测目标用户对未知物品的评价。基于物品的协同过滤算法则是通过分析用户对物品的评分数据,找出物品之间的相似性,然后根据用户对相似物品的评分来预测用户对未知物品的评分。。

2.3 python语言

        Python 是一种解释型、交互式、面向对象的编程语言。其设计哲学强调代码的可读性,允许开发者用少量代码表达想法,没有严格和呆板的编程方式,并且支持多种编程范式,包括面向过程、面向对象和函数式编程。

        Python语言编写爬虫程序是有巨大的优势的,因为 Python 脚本特性,Python 容易配置,对字符处理十分灵活,Python 有着丰富网络抓取模板,让两者可以很好的链接在一起。对比其他静态编程语言来说,Python 抓取网页文档接口更加简洁。抓取网页招聘就业信息的时候需要模拟浏览器的行为,而 Python 具有很多第三方包,可以更加灵活的处理。

2.4 Selenium爬虫框架

        Selenium应用于解决爬虫技术问题,是一个巧合,更是一个完美巧合,Selenium 是一个开源测试框架,用来对web应用(比如网站)做自动化测试用的,因为它可以驱动浏览器,诸如Chrome,Firefox,IE等,所以可以较为真实的模拟人自动去点击网站的各个按钮,翻页,填写表单等。Selenium能干什么事情呢?总结一句就是:人用浏览器可以干什么,Selenium基本就可以干什么。

2.5 MySQL数据库

        本系统的所有的数据存储采用 MySQL 作为数据库,目前比较流行的数据库有 MYSQL,Oracle,sql server 等,这几大数据库都有其优点与缺点。Sql server 的缺点是只能在 windows 平台上运行,无法在Linux 平台上运行,而 oracle 虽然功能非常强大,但是体积过于庞大,使用过于复杂。因此拥有跨平台特性,相对来说又比较小的 MYSQL 就是一个非常好的选择了,同时 MYSQL 也支持多种数据库存储方式,其所支持的 SQL 语言也是最标准的,mysql因其小巧的体积、高效的运行速度,已经成为中小型和大型网站的理想数据库,在 WEB 应用领域,MySQL也被公认为是 RDBMS (Relational Database Management System)的最佳选择。

        因此,我们本次开发使用MySQL作为数据存储库,并配合Django Web应用框架来实现。

2.6 Django框架

        python 的 web 框架一般有如下特性:平台性:不一定依赖于数据库,相比关注数据库,更关注于高效构建和运行的稳定。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。采用了MTV的软件设计模式,其基于MVC,即模型 M,视图V和控制器 C。

M 代表模式,控制着数据的存取。模式层处理与数据相关的所有事务,比如与数据库的连接、从库中调取数据、数据查询等。

T代表模板,该层控制着 Django 的表示界面。其中主要涉及 HTML5 页面的管理。

V 代表视图,控制整个框架的业务逻辑。本层类似于MVC 中的控制器,它是MTV模型的中心。

2.7 Pycharm开发环境

        PyCharm是一款非常强大的Python IDE,其中包含了一系列功能齐全的工具,可以显著提高Python编程的效率,例如:调试、语法优化、项目管理、自动完成、单元测试、智能提醒、代码跳转和版本控制。IDE拥有一系列先进的功能,可以满足不同框架下的各种Web开发需求,为客户带来更多的便利。

        因此,本次开发选择PyCharm作为开发环境,可以更加提高整个系统的开发效率。

3、可行性及需求分析

3.1 可行性分析

1、技术可行性

        在进行开发时,我们必须考虑如何充分利用现有的技术条件,以确保系统的顺利开发,并确保软硬件配置符合开发的要求。Python爬虫技术大量的招聘就业信息的数据来与提供数据支撑,它通过建立一个桥梁,让猎聘网的大量招聘就业信息通过用户需求进行快速爬取。此外由于python语言具有高效率、易操作性和易维护性,它对于计算机的应用具有很大的优势,为整个系统的发展提供了基础。Mysql为整个系统数据的存储提供存储环境,Django出色的web开发框架,它能够轻松地将数据库连接起来,并且直观展示数据,方便用户操作,技术可行性主要考虑到开发的技术与方法包括以下几点:

(1)PyCharm开发工具,运行可靠,效率好;

(2)Python开发爬虫,可用性强,可扩展;

(3)数据自动存入MySQL数据库,易于修改数据;

(4)易于维护,使用Django实现web开发轻便快捷,减轻工作时间与成本。

因此,开发技术上可行。

2、其他可行性

        从经济方面,使用开源的Python语言进行编写程序,所用到的程序和软件也是官方免费版后期维护简单,使用网络爬虫技术来爬取招聘网站上的职位信息,所有的功能实现自己完成,没有其他的费用支出,因此经济上可行。

3.2 性能需求

        为了满足用户的需求,我们确保系统具备出色的响应速度和可靠性。

        构建用户界面,使其具有独特的主题,并且符合标准,栏目、菜单的设置,布局要合理,以便更好地传达信息,易于操作,采用灵活的响应式布局,页面尺寸合理,可以使用多种常见的浏览器,并且保证没有任何错误或空白的连接; 界面设计简洁明了,与主题内容完美融合。

        当用户访问或执行任务时,系统将会迅速做出反应,该系统具有识别和处理异常状态的功能。

        系统设计应具有可扩展性,以满足不断变化的需求。

3.3 功能需求

3.3.1 数据爬取与存储功能

        在本系统中,数据爬取与存储功能占据了核心地位。其主要目的是从猎聘网等招聘平台自动化地获取招聘信息,并对这些数据进行整合和存储,以便后续的分析和检索。

主要功能有:

        数据爬取功能:利用先进的网络爬虫技术,本系统能够模拟人类浏览行为,从猎聘网等招聘网站中抓取招聘职位信息。这些信息包括但不限于职位名称、公司名称、薪资待遇、工作地点、学历要求等关键信息。

        数据整合功能:由于爬虫可能从多个页面或来源获取数据,数据整合功能负责将这些分散的信息进行统一处理,确保数据的一致性和准确性。同时,根据职位的关键词、地区、薪资等属性,对招聘信息进行分类,便于后续的检索和分析。

        数据存储功能:整合后的数据将被存储至高性能的Mysql数据库中。Mysql数据库的稳定性、可扩展性和易用性使得它能够有效地存储大量的招聘信息,并支持高效的数据检索和分析。主要功能是获取猎聘网的招聘信息以及将这些信息整合存储进数据库,同时提供获取服务器端数据的接口。

3.3.2 招聘就业信息的检索功能

本系统提供了灵活多样的检索方式,以满足用户多样化的查询需求。

关键字检索:用户可以通过输入职位名称、公司名称等关键字,快速检索相关的招聘信息。

多条件组合检索:用户还可以结合薪资待遇区间、地区、学历要求等多个条件进行组合查询,以获得更加精确的结果。

模糊查询:对于不确定具体信息的查询,系统还支持模糊查询功能,通过匹配部分关键词或范围,提供相关的招聘信息。

1. 可以通过关键字检索招聘就业信息。

2. 可以通过薪资待遇区检索招聘就业信息。

3. 可以通过选择地区检索招聘就业信息。

4. 可以通过学历要求检索招聘就业信息。

或可以通过以上几种相结合起来进行快速有效的招聘就业信息数据检索。

3.3.3 控制台功能

控制台功能为用户和系统管理员提供了直观的数据展示和系统监控界面。

1. 通过控制台可以显示招聘就业信息数据总量、最高薪资的具体信息、平均薪资水水平,爬虫运行次数以及一共爬取的数据页数等进行直观展示。

2. 通过控制台对学历要求和薪资待遇在各个阶段的占比进行可视化展示。

3. 通过控制台对系统的CPU使用率和内存使用率进行实时监测,以便更好的了解计算机的运行状态,合理的调度爬虫。

4. 通过表格对薪资待遇最高的10条招聘就业信息数据的详情进行展示。

3.3.4 推荐职位功能

本系统结合用户的历史行为数据,利用先进的推荐算法实现个性化的职位推荐功能。

历史记录分析:通过分析用户投递简历的历史记录,系统能够了解用户的求职偏好和兴趣点。

相似度计算:利用余弦相似度等算法,计算用户历史投递简历与当前招聘信息的相似度,为用户推荐最符合其需求的职位。

动态调整:随着用户行为的不断变化,系统能够动态调整推荐结果,确保推荐的准确性和有效性。

3.3.5 职位信息可视化功能

        为了提供更加直观的数据展示,本系统结合ECharts等可视化库,实现了招聘职位信息的可视化功能。

        饼图展示:通过饼图展示不同职位类型的占比、学历要求分布等信息,帮助用户快速了解整体趋势。

        柱形图对比:利用柱形图对比不同地区、不同薪资区间的职位数量,为用户的决策提供有力支持。

        动态交互:支持用户通过点击、拖拽等操作与图表进行交互,进一步探索数据背后的规律。

4 、总体设计

4.1 系统架构设计

        在设计系统功能时,应遵循一定的顺序,从上到下逐步完成。首先,构建一个宏观的架构,然后逐步深入,最终完成最终的模块设计。通过系统分析,功能设计旨在合理地划分、设计和规划系统的各个功能模块,以满足用户的需求。

        根据3.3需求分析中,我们将该系统划分为几个三个功能:

控制台进行数据库的数据的统计与展示;

用户可以输入关键字等信息对猎聘网的招聘就业信息进行爬取

第三个是用户与搜索页面进行交互,通过单个条件和多个条件相结合的方式对爬取的招聘就业信息数据进行检索,从而实现对数据库的有效访问

完成对用户的职位推荐

对招聘职位信息数据可视化

用户对个人信息进行更改

根据对系统的分析,整个系统的功能架构如下:

4.2 用户交设计

        在用户交互设计过程中,前端设计扮演着至关重要的角色。页面设计是前端设计中至关重要的一环,无论是编码、动态交互还是其他方面都不可或缺。页面设计是决定一个网站是否有效和内容是否符合逻辑的关键因素。在网站的页面设计中,我们应该仔细考虑各种因素,包括模块的布局、颜色、按钮的外观、导航的方式以及页脚的风格。因材施教,因地制宜旨在根据用户的需求来调整这些细节。前端开发涉及到HTML、CSS、JavaScript/ajax、HTML5、CSS3等多种技术,它们构成了一个完整的网页框架,为用户提供了更加便捷的体验。

本系统前端总体采用layui UI前端框架进行开发,主要构思如下图:

4.3 数据库设计

    当我们设计这个系统所需的数据库时,我们必须注意表的设计。在这个数据库中,基表(又称基础表或数据表)是非常重要的,因为它们可以用来存储爬取下来的招聘就业信息的数据。基础表既可以作为数据处理的起始点,也可以作为处理的终止点。因此,有效地划分数据表是数据库设计的关键任务,必须得充分考虑。不要将数据划分得过于细致,因为过多的表格会导致表之间的关联变得更加复杂,这将不仅会增加表之间的交互成本,还会降低数据库的运行效率,使得编写操作代码变得更加困难。

通过本系统对数据库的需求分析,在构建本系统的数据实体时,除了确定其主键及其索引外,还应该考虑到如何有效地将各种属性结合起来,以及它们的数据类型及其是否存在空值以及必须明确每个属性的长度、格式、编码方法等参数。如下图数据模型:

在设计数据库时,应充分考虑以下事项:

数据库的设计应该遵守数据库规范化规则,不使用数据的关键字以及关键词,采用下划线连接方式,防止数据库设计中出现错误。

需要考虑对数据完整性的保护,充分的考虑到各个表之间的联系,以及联表操作的权限。

使用tomcat for MySQL作为数据库开发平台,以确保网站的高效运行和稳定性。

本系统共采用5张数据表来完成数据的存储,具体表如下:

用户信息表:

表4.1 用户信息表user_list

序号

名称

别名

类型

1

user_id

用户账号

varchar

2

user_name

用户昵称

varchar

3

pass_word

用户密码

varchar

爬虫统计表:

表4.2 爬虫统计表spider_info

序号

名称

别名

类型

1

spider_id

爬虫序号

int

2

spider_name

爬虫名称

varchar

3

count

调用次数

int

4

page

爬取页数

int

职位信息表:

表4.3 职位信息表job_data

序号

名称

别名

类型

1

job_id

职位编号

int

2

name

职位名称

varchar

3

salary

薪资待遇

varchar

4

place

工作地点

varchar

5

education

要求学历

varchar

6

experience

要求经验

varchar

7

company

公司名称

varchar

8

label

公司行业

varchar

9

scale

公司规模

varchar

10

href

职位链接

varchar

11

key_word

关键字

varchar

用户期望设置表:

表4.4 用户期望设置表user_expect

序号

名称

别名

类型

1

expect_id

期望信息编号

int

2

key_word

职位关键字

varchar

3

user_id

用户账号

varchar

4

place

工作地点

varchar

用户投递简历表:

表4.5 用户投递简历表send_list

序号

名称

别名

类型

1

send_id

投递编号

int

2

job_id

职位编号

int

3

user_id

用户账号

varcha

5 功能实现

5.1 数据爬取功能

5.1.1 页面分析

首先,通过百度搜索猎聘网,进入猎聘网官网首页,再进入职位搜索页面,如下图:

然后,在输入框输入关键字进行检索,可以看到每次搜索最多返回的只有10页数据进行展示,然后翻页请求,currentPage=1参数会随着翻页的页面的变化而变化,页码共10页,对应的currentPage参数分别是0-9。

因为每次官网只返回10页面数据,但是会根据地区的不同,返回不一样的招聘职位信息数据,所以为了尽可能多的爬取相关的招聘就业信息数据,我们采用基于广度优先的分城市进行数据查询和爬取策略。

通过上述搜索招聘就业信息的反复尝试和分析,对URL的变化规律以及参数得出以下结论:

URL:

https://www.liepin.com/zhaopin/?city=城市编码&dq=城市编码¤tPage=页码&pageSize=40&key=关键字

只要每次对页码进行改变就可以实现翻页功能,对城市编码进行改变就可以实现切换不同城市招聘就业信息的切换,对关键字进行改变就可以搜索到含有不同关键字的招聘职位信息数据。

5.1.2 数据抽取

    通过关键字搜索职位信息后,通过打开开发者工具进行网页调试,分析网页的数据格式,如下图:

通过开发者调试工具,我们可以看到,我们需要的数据都在<div class="job-list-box"></div>标签内部,通过对html网页源码的分析,我们发现我们所需要的数据字段都同时具有统一的class样式,且都在div标签的内部,因此,我们可以通过xpath对页面数据进行解析,各个字段对应的div标签如下:

表5.1 页面字段对应的数据对照表

序号

标签class样式

数据名称

数据字段

1

jsx-2693574896 ellipsis-1

职位名称

name

2

jsx-2693574896 job-salary

薪资待遇

salary

3

jsx-2693574896 ellipsis-1

工作地点

place

4

jsx-2693574896 job-labels-box

要求学历

education

5

jsx-2693574896 job-labels-box

要求经验

experience

6

jsx-2693574896 company-name ellipsis-1

公司名称

company

7

jsx-2693574896 company-tags-box ellipsis-1

公司行业

label

8

jsx-2693574896 company-tags-box ellipsis-1

公司规模

scale

9

job-detail-job-info

职位链接

href

使用class属性对应的字段标签可以提取出我们想要的数据,每次抽取全页40条招聘就业信息数据,然后再分次对每条数据进行数据库写入操作。

5.1.3 数据入库

使用pymysql包操作mysql数据库,5.1.2提到,分次对每条数据进行数据库写入操作,因为每条招聘职位信息数据的href具体唯一性,所以数据库去重采用href属性进行去重操作,尝试写入数据库,如果写入数据库失败或者出错则进行数据库回滚操作。数据库数据如下图:

5.2 控制台功能

5.2.1 数据展示

    信息量:在views方法里面定义welcome()方法,在welcome()方法里通过Django的all()方法查询所有数据,再使用len()方法进行数据量技术,并使用locals()方法将数据返回页面,页面使用{{}}语法糖进行数据接收渲染,关键代码如下:

models.JobData.objects.all().values()

最高薪资:在views方法里面定义welcome()方法,在welcome()方法里通过Django的all()方法查询所有数据,再使用for循环结合re正则匹配出最高薪资,并且的values字典里加入字段salary_1用来保存正则提取出的最高薪资,如果匹配失败则作为无效数据,置salary_1为0。最后使用sorted()方法使用lamba匿名函数进行整个数据的反向排序,再讲第一条数据返回给页面,页面使用{{}}语法糖进行数据接收渲染,关键代码如下:

for job in list(job_data):  # 使用循环处理最高的薪资
    try:  # 使用try...except检验最高薪资的提取,如果提取不到则加入0
        salary_1 = float(re.findall(r'-(\d+)k', job['salary'])[0])  # 使用正则提取最高薪资
        job['salary_1'] = salary_1  # 添加一个最高薪资
        list_1.append(salary_1)  # 把最高薪资添加到list_1用来计算平均薪资
    except Exception as e:
        print(e)
        job['salary_1'] = 0
        list_1.append(0)
job_data = sorted(list(job_data), key=lambda x: x['salary_1'], reverse=True)  # 反向排序所有职位信息的最高薪资

平均薪资:在views方法里面定义welcome()方法,在welcome()方法里通过Django的all()方法查询所有数据,再使用for循环结合re正则匹配出最高薪资,并且的匹配得最高薪资数据加入list_1列表中,再导入numpy库进行mean()方法进行数据列表的平均值计算,计算出平均薪资返回给页面,页面使用{{}}语法糖进行数据接收渲染,关键代码如下:

mean_salary = int(mean(list_1))  # 计算平均薪资

爬虫统计:在views方法里面定义welcome()方法,在welcome()方法里通过Django的fifter()方法查询爬虫的数据,并将查询到的数据返回给页面,页面使用{{}}语法糖进行数据接收渲染,关键代码如下:

spider_info = models.SpiderInfo.objects.filter(spider_id=1).first()  # 查询爬虫程序运行的数据记录

图5.4 数据展示效果图

5.2.2 数据概览(学历分布和薪资分布图)

数据概览是在views视图里面定义接口get_pie,学历分布使用已知的学历要求列表,采用Django __icontains模糊查询方法,对学历要求字段进行筛选并计数,并通过生成字典的方式加入edu_data中。

薪资分布是通过定义薪资的区间分布,再使用for循环结合re正则匹配出最高薪资,并且的values字典里加入字段salary_1用来保存正则提取出的最高薪资,如果匹配失败则作为无效数据,置salary_1为0,并通过多个列表筛选的方式生成数据字典并加入salary_data中。

最后使用return JsonResponse()方法将数据返回给前段的ajax请求,前端收到后台返回的数据后,则使用echarts进行数据可视化。

效果图如下:

5.2.3 系统监控

系统监控是在views视图里面定义接口get_psutil,在views头使用import导入psutil包,再使用cpu_percent()和virtual_memory()方法进行系统CPU使用率和内存占用率的获取,最后使用return JsonResponse()方法将数据返回给前端的ajax请求,前端收到后台返回的数据后,前端页面使用定时器对该接口进行固定时间的请求,就可以实现动态监控系统的CPU和内存状态,最后再使用echarts进行数据可视化。

效果图如下:

5.2.4 薪资TOP10

薪资TOP-10是在views方法里面定义welcome()方法,在welcome()方法里通过Django的all()方法查询所有数据,再使用for循环结合re正则匹配出最高薪资,并且的values字典里加入字段salary_1用来保存正则提取出的最高薪资,如果匹配失败则作为无效数据,置salary_1为0。最后使用sorted()方法使用lamba匿名函数进行整个数据的反向排序,再将前十条数据返回给页面,页面使用{{}}语法糖进行数据接收渲染,关键代码如下:

job_data_10 = job_data[0:10]  # 取最高薪资前10用来渲染top—10表格

5.3 爬虫调度功能

用户使用GET进行访问时,获取定义的全局变量spider_code,状态0是空闲,1则表示爬虫正在运行。

POST访问则是用户通过输入关键字,选择城市,选择爬取的总页数进行后端接口请求,后端导入项目spider下tools工具,使用POST接收到用户传来的参数则调用start_spider()函数,并将用户输入的数据传参,传参后启动爬虫,并将爬虫计数进行加1操作,再讲用户选择的对应的页面数量进行加法操作,并保存数据,之后进行数据爬取,前端页面出现正在爬取请等待的提示,当爬虫程序运行完毕后,提示用户数据爬取完毕,效果图如下:

5.4 数据检索功能

数据检索功能是在views里面定义数据接口get_job_list(),当后端接收到用户输入的检索关键字以及各个检索条件后,使用Django里面__icontains多条件模糊筛选,薪资区间方面的处理,则是使用for循环结合re正则匹配出最高薪资和最低薪资进行二次筛选,将符合薪资区间的数据添加到job_data数据列表中,再使用接收过来的page和limit参数进行数据分页,job_data[(page-1)*limit:limit*page],如果没有合适的数据则提示“没找到需要查询的数据”,并返回空列表,反之则使用return JsonResponse()将数据以JSON格式返回给前端的ajax请求,前端页面接收返回数据并进行表格渲染,效果图如下:

点击投递可以直接进行简历投递,已投递的则显示已投递,可以进行取消投递简历的操作。

5.5 数据可视化

数据检索功能是在views里面定义数据接口bar(),统计各个职位关键字在所有数据中的个数,使用JsonResponse方式将x轴和y轴的数据返回前端ajax请求,前端通过设置echarts数据完成数据可视化,效果如图:

6 职位推荐算法

6.1 基于物品推荐

本次职位推荐的算法选用的是基于物品的协同过滤算法,它基于用户对职位的投递或投递历史来计算职位之间的相似性,然后利用这些相似性来为用户推荐职位。该算法的流程通常包括以下步骤:

  1. 数据准备:收集职位信息和用户行为数据,例如职位的关键字,以及用户投递等行为数据。
  2. 特征提取:从职位信息中提取出关键词特征,作为职位的特征向量。从用户行为数据中提取出用户的偏好设置、投递等行为信息,作为用户的特征向量。
  3. 相似度计算:使用余弦相似度计算职位之间的相似度,将职位之间的相似度构成职位相似度矩阵。
  4. 推荐生成:对于每个用户,根据用户的历史行为和职位相似度矩阵,计算推荐分数,根据推荐分数排序,推荐给用户最适合的职位。

与基于用户的协同过滤算法相比,基于物品的协同过滤算法具有以下优点:

  1. 物品之间的相似度通常比用户之间的相似度更稳定,因为物品的特征通常比用户的特征更固定。
  2. 当物品数量远远大于用户数量时,基于物品的协同过滤算法的计算效率通常比基于用户的协同过滤算法更高。
  3. 基于物品的协同过滤算法通常比基于用户的协同过滤算法更容易解释和理解。

具体实现推荐流程如下图:

6.2 数据准备

将通过爬取清洗的数据进行保存数据库后,在系统推荐时候直接调用Django查询语句进行查询,所有数据如下:

本次实现推荐算法一共爬取猎聘网职位信息13971条作为数据支撑,使用职位关键字进行职位标签的分类。

6.3 特征提取

1. 查找所有的职位信息将关键字设为职位的向量特征;

2. 查找用户是否投递过简历,如果投递过,则统计用户投递简历关键字的前三名,说明用户比较偏好这一类的职位,将关键字设为用户的向量特征;如果用户并没有进行过简历投递,则查找用户设置的意向职位,将用户设置的意向职位信息设为用户的向量特征;

以ID为1用户为例,通过查找统计用户投递职位最多的前三的职位关键字如下图所示:

6.4 相似度计算

本次实现推荐算法采用余弦相似度进行计算用户已投递简历职位和未投递简历职位之间的相似度,假设有两个职位i和j,它们之间的相似度用公式可以表示为:

公式(6.1)

然后通过以下步骤来实现计算:

(1)读取数据库用户投递简历的历史记录,将用户投递简历的历史记录转换成一个用户-职位矩阵M,其中矩阵中的每个元素Mij表示用户i是否投递了职位j,如果投递了则为1,否则为0。

(2)将职位关键字作为职位i和职位j相关联的列向量,构成新的向量Ai和向量Aj,其中向量Ai和向量Aj的长度均为n,n表示所有用户投递简历的历史记录中职位的关键字的数量。

(3)计算向量Ai和向量Aj的余弦相似度,公式如下:

similarity(Ai, Aj) = (Ai·Aj) / (||Ai|| * ||Aj||)

其中,· 表示向量的内积,||Ai|| 表示向量Ai的模长,即:||Ai|| = √(Ai·Ai)

(3)余弦相似度的取值范围为 [-1, 1],其中 1 表示完全相似,-1 表示完全不相似。因此,可以将余弦相似度映射到 [0, 1] 的区间内,公式如下:

sim(i, j) = (similarity(Ai, Aj) + 1) / 2

其中,sim(i, j) 表示职位i和职位j的相似度,取值范围为 [0, 1]

需要注意的是,如果用户没有进行过简历投递,则去查找用户是否设置过意向职位,如果设置了,则在用户设置的意向职位里面综合查找,来完成推荐,如果用户既没有设置意向职位,也没有进行简历投递,则使用随机推荐的方法完成推荐。

6.5 推荐生成

将计算的职位相似度得分按照从高到低进行排序,然后将职位信息返回完成推荐。

结 论

本系统采用Django Web应用框架,采用python语言,主要完成招聘就业信息的爬取,用户对职位信息的检索和使用协同过滤的余弦相似度完成对用户的职位推荐,并且结合JavaScript、CSS、AJAX、HTML、XML等多种语言,实现了全面的功能,同时还利用SQL语言构建了高效的数据库。

系统可以利用历史数据和机器学习算法来预测未来的就业市场趋势和热门行业。这有助于大学生提前了解市场变化,调整自己的职业规划,从而增加就业竞争力,通过分析学生的技能掌握情况和市场需求,系统可以指出学生在哪些技能上存在不足,并提供相应的提升建议。这有助于学生更有针对性地提升自己的技能水平,以满足就业市场的需求。

现如今,系统的整体开发已经完成,主要解决了面对海量招聘就业信息数据时,求职者在海量的数据之中如何找到自己想要的数据,从而减少找工作的时间,并利用协同过滤的余弦相似度计算用户投递职位之间的相似度,将相似度最好的职位推荐给用户,帮助用户快速找到自己想要的工作。

综上所述,基于Python的大学生就业推荐系统具有很高的实用价值和潜在的应用前景。通过不断优化算法和提升服务质量,该系统有望为大学生提供更加精准、有效的就业推荐服务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值