当年找工作的时候,去各个社招网站上找职位投简历,总想找到和自己简历最匹配的职位(毕业的时候挫的一比)。一个个看实在太累了。能不能用算法直接找到最匹配的职位啊?
基本思路是,若能从职位描述和简历描述中,提取出关键词,再用某种相似度算法,计算职位和简历的匹配度,即可达成目标。
理想中的效果是:
职位 前端工程师:H5 html css vue nodejs 页面 美观...
简历 前端工程师:H5 主页 javascript nodejs ajax...
职位与简历的相似度:98%
最好有个可以操作的界面,如下图:
第一个需要解决的问题:怎么提取关键词呢?答案是分词器。
分词器可以达到这样的效果:
我爱北京天安门---->我 爱 北京 天安门
有3年前端从业经验---->有 3年 前段 从业 经验
不过分词器也会犯傻:
了解机器学习算法与人工智障---->了解 机器 学习 算法 与 人工 智障
“机器学习“和“人工智障“都是一个独立的词啊!咋被拆开了呢?
原因是分词器的词库里面没有“机器学习”“人工智障”这两个词。
解决方法:新词提取算法可以利用左右信息熵与凝聚指数提取“机器学习”“人工智障”。
将新词加入分词器训练,分词器终于可以成功分词了:
了解机器学习算法与人工智障---->了解 机器学习 算法 与 人工智障。
即便这样,分词器还是会分出一大堆乱七八糟的词:
例如:H5 vue 前端 页面 五险一金 团建 员工福利 成长 职责 技能 学习 优先 经验 了解
前面4个词是关键词,后面14个词然并卵。这些词需要被干掉!
首先,用IDF方法可以过滤掉那些几乎会出现在所有职位描述中的词,例如:学习 优先 经验 了解。
其次,一般来说,网上的职位都有一些原始分类,例如智联对软件工程师有一些细分:前端、java、算法等等
可以利用信息增量算法,过滤掉那些,几乎会出现在所有类中的词。比如:职责,技能 成长。
剩下词的只有靠人类一个一个删了,是这样吗?不全是。
利用word2vec算法可以计算出词向量,再通过kmeans即可完成词的聚类,效果如下:
第一类:前端 H5 html css vue... (这不就是前端工程师的关键词么!)
第二类:机器学习 算法 NLP 搜索 推荐 神经网络 (这不就是算法工程师的关键词么!)
第三类:五险一金 团建 员工福利...(这是神马破玩意儿?【批量】干掉!)
第四类:政府 国企 大型 投资 金融...(这关我鸟事啊?【批量】干掉!)
...
word2vec的特点就是可以把有相似上下文的词算出相似的向量,对这些向量聚类,就可以得到上面的效果!虽然是人工删词,但是有了算法的帮助,是不是方便多了?
最后,就是计算匹配度了:
借助LDA主题模型,可以计算出简历与职位,分别属于某个主题的概率:
职位 前端工程师:H5 html css vue nodejs 页面 美观...
P(属于主题1)=0.1
P(属于主题2)=0.4
P(属于主题3)=0.2
P(属于主题4)=0.8
不就是个向量么?---> v1 = [0.1, 0.4, 0.2, 0.8]
简历 前端工程师:H5 主页 javascript nodejs ajax...
P(属于主题1)=0.2
P(属于主题2)=0.3
P(属于主题3)=0.2
P(属于主题4)=0.7
v2 = [0.2, 0.3, 0.2, 0.7]
所以简历与职位匹配程度可以用向量的距离来表示:
职位与简历匹配度 = 余弦距离(v1, v2)
总之,整理出下面的流程图:
结果还不错,在计算机软件这个行业里,匹配职位效果还挺不错的。例如PHP、前端、算法、DBA、运维、C#、.net等。
光有算法还不行,得做成一个桌面程序,不然没法用。
PyQt图形界面+selenium webdriver驱动浏览器,下载各大招聘网站的职位到本地。
利用上述的算法匹配个人简历。
勾选职位,同样利用selenium webdriver驱动浏览器批量投简历。
就这样,妈妈再也不用担心我找不到工作了。
视频演示: