构建简历解析工具

不打扰是莪最后的温柔 提交于 2020-08-12 07:42:10

作者|Low Wei Hong
编译|VK
来源|Medium

当我还是一名大学生的时候,我很好奇自动提取简历信息是如何工作的。我将准备各种格式的简历,并上传到招聘网站,以测试背后的算法是如何工作的。我想自己尝试建一个。因此,在最近几周的空闲时间里,我决定构建一个简历解析器。

一开始,我觉得很简单。只是用一些模式来挖掘信息,结果发现我错了!构建简历解析器很困难,简历的布局有很多种,你可以想象。

例如,有些人会把日期放在简历的标题前面,有些人不把工作经历的期限写在简历上,有些人不会在简历上列出公司。这使得简历解析器更难构建,因为没有要捕获的固定模式。

经过一个月的工作,根据我的经验,我想和大家分享哪些方法工作得很好,在开始构建自己的简历分析器之前,你应该注意哪些事情。

在详细介绍之前,这里有一段视频短片,它显示了我的简历分析器的最终结果(https://youtu.be/E-yMeqjXzEA)


数据收集

我在多个网站上搜了800份简历。简历可以是PDF格式,也可以是doc格式。

我使用的工具是Google的Puppeter(Javascript)从几个网站收集简历。

数据收集的一个问题是寻找一个好的来源来获取简历。在你能够发现它之后,只要你不频繁地访问服务器,抓取一部分就可以了。

之后,我选择了一些简历,并手动将数据标记到每个字段。标记工作的完成是为了比较不同解析方法的性能。


预处理数据

剩下的部分,我使用Python。有几个包可用于将PDF格式解析为文本,如PDF Miner、Apache Tika、pdftotree等。让我比较一下不同的文本提取方法。

使用PDF Miner的一个缺点是,在处理简历时,简历的格式类似于Linkedin的简历,如下所示。

PDF Miner阅读PDF的方式是逐行的。因此,如果发现左右两部分的文本位于同一行,则将它们组合在一起。因此,正如你可以想象的那样,在随后的步骤中提取信息将更加困难。

另一方面,pdftree将省略所有的'\n'字符,因此提取的文本将类似于文本块。因此,很难将它们分成多个部分。

因此,我使用的工具是Apache Tika,它似乎是解析PDF文件的更好选择,而对于docx文件,我使用docx包来解析。


数据提取流程概述

这是棘手的部分。有几种方法可以解决这个问题,但我将与你分享我发现的最佳方法和Baseline方法。

Baseline方法

我们先来谈谈Baseline方法。我使用的Baseline方法是首先为每个部分(这里我指的是经验、教育、个人细节和其他部分)抽取关键字,然后使用regex匹配它们。

例如,我想提取大学的名称。因此,我首先找到一个包含大多数大学的网站,并将其删除。然后,我使用regex检查是否可以在特定的简历中找到这个大学名称。如果找到了,这条信息将从简历中提取出来。

这样,我就可以构建一个Baseline方法,用来比较其他解析方法的性能。

最佳方法

这是我发现的最好的方法。

首先,我将把纯文本分成几个主要部分。例如,经验、教育、个人细节和其他。我要做的是为每个主要部分的标题设置一组关键字,例如工作经验、教育、总结、其他技能等等。

当然,你可以尝试建立一个机器学习模型来实现分离,但我选择了最简单的方法。

之后,将有一个单独的脚本来分别处理每个主要部分。每个脚本都将定义自己的规则,这些规则来提取每个字段的信息。每个脚本中的规则实际上都相当复杂。由于我希望这篇文章尽可能简单,所以我现在不会透露。

我使用的机器学习方法之一是区分公司名称和职务。我在这里使用机器学习模型的原因是,我发现有一些明显的模式可以区分公司名称和职务,例如,当你看到关键字“Private Limited”或“Pte Ltd”时,你肯定它是一个公司名称。

我在哪里能得到训练数据?

我从greenbook中搜集数据以获取公司名称,并从这个Github仓库中下载了职位列表(https://github.com/fluquid/find_job_titles)。

在得到数据后,我只训练了一个非常简单的朴素贝叶斯模型,它可以将职称分类的准确率提高至少10%。

总之,我解析简历解析器的策略是分而治之。

评估

我使用的评估方法是fuzzy-wuzzy方法(去重子集匹配)。比如说

  • s=共同单词的数量
  • s1=单词列表的交集
  • s2=单词列表的交集+str1的剩余单词
  • s3=单词列表的交集+str2的剩余单词

接下来的计算公式

token_set_ratio = max(fuzz.ratio(s, s1), fuzz.ratio(s, s2), fuzz.ratio(s, s3))

我使用token_set_ratio的原因是,如果解析的结果与标记的结果具有更多的公共标记,则意味着解析器的性能更好。

原文链接:https://towardsdatascience.com/how-to-build-a-简历-parsing-tool-ae19c062e377

欢迎关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官方文档:
http://sklearn123.com/

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!