关于 简历解析 的点滴

2018年2月28日

 

关于 简历解析 的点滴

 

在当前求职布告软件和社交招聘盛行的环境下,每个空缺职位可能有数以百计的申请。企业需要对大量简历进行评估。从而挑选正确的简历/履历是所有公司的一项关键招聘业务决策。如果出现错误的候选人信息或者时间过久可能意味着将会错过合格的求职者,不相匹配的求职者,或者变得缺乏竞争力。

至于简历解析到底是做什么的,具体的我就不太多说了。总体来说,是对非结构化的简历文本实现准确、高效的关键信息抽取,自动识别简历中个人的基本信息、工作经验、教育经历等内容,实现简历的结构化处理,降低人力整理的成本,简化用户录入简历过程,提升人力资源管理软件与求职网站的核心竞争性。

我们最近也研发了自己的产品,做了一些市场调研,将一些就我们自己的产品思路和搭建理念想和大家分享下,毕竟现在这个需求也越来越大,可是HR或者人力市场貌似并不是很了解这是怎么一个东西:

首先我想说,简历解析的技术壁垒可以说是低,任意几个程序员就能做到,也可以说非常高,因为要做到满意的结果非常难,简历解析系统可以作为一个计算机本科生的毕业设计,也可以是几个教授几年的心血。

在讨论不同简历解析系统的设计前,我先说一下解析的大概思路

对于一个简单的版本,可以这样做:

  1. 使用网上任意的库:

    例如很多库都能起到pdf,word 等格式转txt的结果; 但是对于每种情况,最优的库经常是不一样的,如果我们打算用一两个库处理所有的格式,我们将会得到完全无法. 这里文本的转化严重关系的之后解析的结果。

  2. 设置很多关键词:

    例如人眼看了很多简历以后,寻找关键词,如教育背景,学习经历,学生经历等,然后设置规则,靠关键词提取。 但这种看似合理的方法有一些不太好的地方,例如没有关键词,关键词打错字,关键词没有在词库里,更常见的是用了网上的模版,如智联招聘,单相关内容填错了,例如工作经历填写到了项目经历里面了。这些都是无法解决的。

  3. 使用关键行来对大段进行划分:

    例如在工作经历中,写出时间,公司名,部门名的规则表达式,来判断一行是否属于该属性 ,然后再写一大堆规则来利用这些信息把大段分为多个小段。 但是

    • 很多公司不是有标准后缀的,例如腾讯科技,网易云音乐等 。
    • 并不是所有公司名都是表达公司名,例如在阿里巴巴做市场营销工作期间谈到百度做为客户,百度这个词就出现了。是否能说明是公司名字呢还是经历?
    • 即使你成功预测到了公司名,时间和职位顺序也非常影响划分,假如利用时间进行切割时,上一段的公司名就很容易分到了这一段的时间里。
  4. 使用规则来进行分割:

    但是当面对一个正确的工作经历小段文本时,假如里面并没有识别到公司名,或有多个公司名时,这些通过规则都是非常难解决的。

 

大体思路和做法

小伙伴可能会想,那怎么做?其实我也不知道。首先我又要说,简历解析这个东西,不存在好和不好,只是怎么做到最优。就像一幅画,问我怎么画出一张漂亮的画或写出一首动人的诗,我也不知道。这里,我只能分享给大家一些我们当时的大体思路和做法:

  1. 学习不同库,了解思路:

    学习并了解对于每种格式,如何处理会得到最优的txt文本,特别对于一些花样比较特殊的的简历格式,学习思考如何能够得到最优的转化结果. 这里我举个我们当时的例子:当时我们看大多数的库都是从上至下来读文本的,所以一旦一份简历的卷写格式是从左到右的,那就会很麻烦。我们花了很多时间去学习如何不按照阅读顺序来读简历

  1. 当结构能得到保持后,需要设计算法:

    使得无论关键词是否出现,也要正确划分每个模块。

    在讨论人工智能之前,我们想想人类是如何做到这个结果的,大脑中,当你想提取教育经历的内容时,你会一行行往下读,直到你认为这部分以下都是讨论教育的经历了为止。所以人类起始并不是去找他这个关键词,更重要的是语言上的理解,即使不需要关键词,人也能够识别出来。这个问题在机器学习里叫做序列预测问题。如大学这个词经常会出现在教育经历,工资这个词经常出现在工作经历等,结合模块间的跳转概率,如教育经历经常跳转到工作经历,但反过来概率很小,如技能总是放在最后等。在这里,尽量不要人手设定任何规则,全让大数据说话,让数据显示规则, 让数据显示模式,效果会更好

  1. 在得到准确的划分之后,对每个模块进行模仿解析:

    再次回想人类潜意识会如何阅读小段

    对于算法,需要考虑的有几个方面的特征,如上下文特征,这一行表达了什么,上一个段落信息是否已经齐全,如果从这一行开始一个段落,在此行之后能得到一个完整的段落吗,等等,要充分能够利用上下文的信息,如上个划分点到目前行信息是否齐全,本行是否有起始行的特征,本行以后是否有足够的信息建等等。

  1. 得到模块解析之后,如何提取关键的信息成为关键

    机器学习中,这是一个典型的问题。比如给定一行文本,是公司名?时间?部门?还是描述。此处可能需要大量各种来源的样本,对文本进行准确理解及分类,比如如果第一段经历中是先时间后公司,第二段是先公司后时间,跟进时间来切割的就会出现错位。所以需要大量简历样本的支持,而不是人为提取的经验规则

 

如果你读到这里,请先收下我的谢谢,感谢你的时间及兴趣。同时也很希望这一点点的信息可以帮助开发的小伙伴得到一丝不一向的启发,给人力行业内的小伙伴一丝不同角度的理解。

再次谢谢大家,也期待得到大家的讨论,想法,看法。