解析global-metadata.dat⽂件_⾃⼰动⼿做简历解析⼯具
当我还是⼀名⼤学⽣的时候,我很好奇⾃动提取简历信息是如何⼯作的。我将准备各种格式的简历,并上传到招聘⽹站,以测试背后的算法是如何⼯作的。我想⾃⼰尝试建⼀个。因此,在最近⼏周的空闲时间⾥,我决定构建⼀个简历解析器。
⼀开始,我觉得很简单。只是⽤⼀些模式来挖掘信息,结果发现我错了!构建简历解析器很困难,简历的布局有很多种,你可以想象。
例如,有些⼈会把⽇期放在简历的标题前⾯,有些⼈不把⼯作经历的期限写在简历上,有些⼈不会在简历上列出公司。这使得简历解析器更难构建,因为没有要捕获的固定模式。
经过⼀个⽉的⼯作,根据我的经验,我想和⼤家分享哪些⽅法⼯作得很好,在开始构建⾃⼰的简历分析器之前,你应该注意哪些事情。
数据收集
我在多个⽹站上搜了800份简历。简历可以是PDF格式,也可以是doc格式。
我使⽤的⼯具是Google的Puppeter(Javascript)从⼏个⽹站收集简历。
数据收集的⼀个问题是寻⼀个好的来源来获取简历。在你能够发现它之后,只要你不频繁地访问服务器,抓取⼀部分就可以了。
之后,我选择了⼀些简历,并⼿动将数据标记到每个字段。标记⼯作的完成是为了⽐较不同解析⽅法的性能。
预处理数据
剩下的部分,我使⽤Python。有⼏个包可⽤于将PDF格式解析为⽂本,如PDF Miner、Apache Tika、pdftotree等。让我⽐较⼀下不同的⽂本提取⽅法。
使⽤PDF Miner的⼀个缺点是,在处理简历时,简历的格式类似于Linkedin的简历,如下所⽰。
PDF Miner阅读PDF的⽅式是逐⾏的。因此,如果发现左右两部分的⽂本位于同⼀⾏,则将它们组合在⼀起。因此,正如你可以想象的那样,在随后的步骤中提取信息将更加困难。
另⼀⽅⾯,pdftree将省略所有的''字符,因此提取的⽂本将类似于⽂本块。因此,很难将它们分成多个部分。
因此,我使⽤的⼯具是Apache Tika,它似乎是解析PDF⽂件的更好选择,⽽对于docx⽂件,我使⽤docx包来解析。
数据提取流程概述
这是棘⼿的部分。有⼏种⽅法可以解决这个问题,但我将与你分享我发现的最佳⽅法和Baseline⽅法。
Baseline⽅法
我们先来谈谈Baseline⽅法。我使⽤的Baseline⽅法是⾸先为每个部分(这⾥我指的是经验、教育、个⼈细节和其他部分)抽取关键字,然后使⽤regex匹配它们。
例如,我想提取⼤学的名称。因此,我⾸先到⼀个包含⼤多数⼤学的⽹站,并将其删除。然后,我使⽤regex检查是否可以在特定的简历中到这个⼤学名称。如果到了,这条信息将从简历中提取出来。
这样,我就可以构建⼀个Baseline⽅法,⽤来⽐较其他解析⽅法的性能。
最佳⽅法
这是我发现的最好的⽅法。
⾸先,我将把纯⽂本分成⼏个主要部分。例如,经验、教育、个⼈细节和其他。我要做的是为每个主要部分的标题设置⼀组关键字,例如⼯作经验、教育、总结、其他技能等等。
当然,你可以尝试建⽴⼀个机器学习模型来实现分离,但我选择了最简单的⽅法。python怎么读取dat文件
之后,将有⼀个单独的脚本来分别处理每个主要部分。每个脚本都将定义⾃⼰的规则,这些规则来提取每个字段的信息。每个脚本中的规则实际上都相当复杂。由于我希望这篇⽂章尽可能简单,所以我现在不会透露。
我使⽤的机器学习⽅法之⼀是区分公司名称和职务。我在这⾥使⽤机器学习模型的原因是,我发现有⼀些明显的模式可以区分公司名称和职务,例如,当你看到关键字“Private Limited”或“Pte Ltd”时,你肯定它是⼀个公司名称。
我在哪⾥能得到训练数据?
在得到数据后,我只训练了⼀个⾮常简单的朴素贝叶斯模型,它可以将职称分类的准确率提⾼⾄少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的原因是,如果解析的结果与标记的结果具有更多的公共标记,则意味着解析器的性能更好。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论