Press "Enter" to skip to content

基于自然语言处理的简历初筛选

在招聘数据科学岗位的时候,一个职位可能会有几百个求职者的简历投进来。因为数据科学本身定义的模糊性,我们会发现大量不相关或弱相关的简历掺杂其中。比如我们遇到过牙医 dentist 申请 data scientist 的职位,我们猜测可能只是因为读音略相似而求职者看错了title… 初步筛选这些简历是一项极其繁杂的体力活。

 

求人不如求己。于是我们组自己开发了一套基于自然语言处理的简历初筛选系统,针对所有的简历计算其和职位招聘信息的匹配程度,评分并排序,然后专注在排名靠前的一批简历中再进行人工筛选。

 

PDF 提取

 

职位招聘信息一般比较好获取纯文本的版本。关键在求职者简历往往是PDF的形式,因此第一步就是PDF中的文本信息提取。

 

我们使用了一些开源的 Python 软件包如 textract 来进行 PDF 的文本提取。这一步我们发现提取的结果并不完美,因为求职者的简历格式千奇百怪,有图片有表格,有横排有竖排,因此提取结果的文本顺序常常会比较混乱。这也直接影响了我们之后对产品功能的定义,删减了一些实体和信息提取的功能,同时匹配算法也尽量选择了一些对语境语序要求不高的算法,这也算是该项目的一个遗憾。

 

文本匹配

 

简历和职位信息的文本匹配部分,我们的思路很简单就是做短文本匹配,将两部分文本都分别向量化然后计算相似度。我们也试过 BERT 等最先进的 NLP 算法来处理文本向量化的部分。然而由于上述的数据提取质量原因,我们最终还是选择了一些传统的文本向量化方式,如 TF-IDF,词向量平均等等。

 

项目中还用到了笔者之前开源的 text2vec 项目。其中包含了很多种文本向量化和计算相似度的方式,具体内容可以参考相关博客 Text2Vec:简单的文本向量化工具

 

 

简历排序

 

计算出相似度分数以后对所有简历进行排序。因为可以选择不同算法计算相似度分数,而不同算法之间的分数没有可比性,所以我们对分数本身进行归一化,得分最高的简历分数为1,其它简历依次计算相对分数。

 

实验中我们发现几种不同文本向量化和相似度计算的方法会有不同的效果。有的偏重于整体语义的相似度,有的偏重于特别关键词的匹配度。我们最终发现几种模型结果的组合效果最好,在不同方面取得了较好的平衡。

 

Dash 前端

 

公司有明哥,人狠话不多。

 

自从明哥带来新技术栈进组之后,组内刮起了一股学习 Dash 的风潮。关于 Dash,感兴趣的读者可以参考之前的博客 Dash:数据科学到网页应用的最后一公里

 

我们立刻尝试使用 Dash 搭建了简历初筛选的网页前端。构建网页应用要考虑的方面和后端算法的工程风格大不一样,比如我们要考虑如何做多用户管理、数据隐私、界面设计、用户不按套路瞎搞时的exception处理等等。

 

 

准备界面中包含了 Job Description 的内容。之所以这部分作为文本框而不是文件上传的形式,一个是因为招聘信息一般比较单纯而容易由用户直接提供文本信息,二是职位信息本身对简历排序的准确度也有很大的关系,做成文本框的形式可以方便用户及时修改职位信息,添加更多的目标关键词,保证简历排序的准确性。

 

用户点击按钮激活上传对话框,或者直接批量拖入简历,所有的文件就会出现在列表中。用户如果对数据安全有要求,可以随时点击删除按钮删除所有的文件;而系统本身也会定时清理服务器端存储的历史简历文件,保证数据隐私。

 

 

匹配页面中用户可以选择不同的算法进行试验,然后点击开始匹配按钮,系统就会在后台进行 PDF 提取、文本匹配、简历排序的一系列过程,然后把结果返回在页面中。

 

以上就是一个简单的基于自然语言处理的简历初筛选产品。其背后的算法没有多高深,前端部分也没有多复杂,但整个过程从想法到命令行实现再到网页 app 实现,使更多人可以通过 demo 直观了解到 NLP 可以做到什幺不能做到什幺,也同时解决一点我们筛选简历时的痛点,何乐而不为?

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注