OpenResumeOpenResume Logo

简历解析器游乐场

这个游乐场展示了 OpenResume 简历解析器的能力,可以从简历 PDF 中解析信息。点击下面的 PDF 示例以观察不同的解析结果。

简历 1

借用自拉维恩大学职业中心 - 链接

简历 2

使用 OpenResume 创建 - 链接

您还可以添加您的简历,以了解类似的求职申请中使用的应用程序跟踪系统(ATS)如何解析您的简历。 它可以解析出的信息越多,就越能表明简历格式良好、易于阅读。至少准确解析出姓名和电子邮件是有益的。

浏览 PDF 文件或将其拖放到此处

文件数据仅在本地使用,永远不会离开您的浏览器。

简历解析结果

个人信息
姓名
邮箱
手机号
地址
链接
汇总
教育经历
学校
专业
绩点
日期
描述
工作经历
公司
职位
日期
描述
技能
描述

简历解析算法深度解析

对于技术上感兴趣的人,本节将深入介绍 OpenResume 解析器算法,并介绍其工作原理的四个步骤。请注意,该算法专门用于解析英语语言的单列简历。

第一步,从 PDF 文件中读取文本项。

PDF 文件是由 ISO 32000 规范定义的标准文件格式。

虽然有可能编写遵循 ISO 32000 规范的自定义 PDF 阅读器函数,但使用现有的库要简单得多。在这种情况下,简历解析器使用 Mozilla 的开源 pdf.js库首先提取文件中的所有文本项。

下表列出了从添加的简历 PDF 中提取的 0 个文本项。一个文本项包含文本内容以及一些关于内容的元数据,例如其在文档中的 x、y 位置、字体是否加粗或是否开始新行。(请注意,x、y 位置相对于页面左下角,即原点为 0,0)

#文字内容元信息

第二步,将文本项分组成行。

提取出的文本项还不可用,并存在两个主要问题:

问题 1:它们存在一些不需要的噪声。有些单个文本项可能会被分成多个文本项,就像您在上面的表格中观察到的那样,例如电话号码“(123) 456-7890”可能被分成 3 个文本项“(123) 456”、“-” 和“7890”。

解决方案:为了解决这个问题,简历解析器将相邻的文本项连接成一个文本项,如果它们之间的距离小于平均典型字符宽度,其中 距离 = 右侧文本项X₁ - 左侧文本项X₂ 平均典型字符宽度通过将所有文本项的宽度之和除以文本项的字符总数计算得出(加粗文本和新行元素被排除在外,以避免结果偏差)。

问题 2:它们缺乏上下文和关联。当我们阅读简历时,我们逐行扫描简历。我们的大脑可以通过诸如文本加粗和接近程度等视觉提示来处理每个部分,我们可以将更接近的文本快速关联到一个相关的组。然而,提取出的文本项目前没有这些上下文/关联,它们只是不连贯的元素。

解决方案: 为了解决这个问题,简历解析器重构了这些上下文和关联,类似于我们的大脑如何阅读和处理简历。它首先将文本项分组成行,因为我们逐行阅读文本。然后将行分组成部分,这将在下一步中讨论。

在第二步结束时,简历解析器从添加的简历 PDF 中提取了 0 行,如下表所示。以行的形式显示结果更易读。(某些行可能有多个文本项,这些文本项由 | 分隔)

行内容

第三步,将行分组成每一部分。

在第二步中,简历解析器通过将文本项分组成行来开始构建文本项的上下文和关联。第三步继续这个过程,通过将行分组成部分来构建更多的关联。

请注意,每个部分(除了个人资料部分)都以占据整行的部分标题开始。这不仅是在简历中,而且在书籍和博客中都是一种常见的模式。简历解析器使用这个模式将行分组成上面最近的部分标题所在的部分。

简历解析器应用一些启发式方法来检测部分标题。确定部分标题的主要启发式方法是检查它是否满足以下三个条件:
1. 它是该行中唯一的文本项
2. 它加粗
3. 它的字母都是大写的

简单地说,如果一个文本项双重强调,既加粗又大写,那么它很可能是简历中的一个部分标题。对于格式良好的简历,这通常是正确的。当然,也可能有例外情况,但在这些情况下使用加粗和大写字母可能不是一个好的选择。

如果主要的启发式方法不适用,简历解析器还具有备用启发式方法。备用启发式方法主要针对常见简历部分标题关键字列表进行关键字匹配。

在第三步结束时,简历解析器从简历中识别出部分并将这些行与相应的部分标题分组,如下表所示。请注意,部分标题已加粗,并且与该部分相关联的行使用相同的颜色突出显示。

行内容

第四步,从每一部分中提取简历。

第四步是简历解析过程的最后一步,也是简历解析器的核心,在这一步中,它从各个部分中提取简历信息。

特征评分系统

提取引擎的要点是一个特征评分系统。每个要提取的简历属性都有自定义的特征集,其中每个特征集由一个特征匹配函数和一个匹配分数组成(匹配分数可以是正数或负数)。为了计算特定简历属性的文本项的最终特征评分,它将文本项通过所有特征集,并总结匹配特征分数。这个过程针对部分内的所有文本项进行,文本项中计算出的最高特征评分被确定为提取出的简历属性。

作为演示,下表显示了添加的简历 PDF 的个人资料部分中的 3 个简历属性。

简历属性文本(最高特征分数)其他文本的特征分数
姓名
邮箱
手机号

特征集

解释了特征评分系统后,我们可以更深入地了解如何为简历属性构建特征集。它遵循两个原则:
1. 简历属性的特征集相对于同一部分中的所有其他简历属性进行设计。
2. 简历属性的特征集基于其特征和每个特征的可能性手动制作。

下表列出了简历属性名称的一些特征集。它包含将名称属性与正特征分数进行匹配的特征函数,以及仅将其他简历属性与负特征分数进行匹配的特征函数。

姓名特征集
特征函数特征匹配分数
仅包含字母、空格或句点+3
加粗了+2
包含所有大写字母+2
包含 @-4(匹配电子邮件)
包含数字-4(匹配电话号码)
包含 ,-4(匹配地址)
包含 /-4(匹配 URL)

核心特征函数

每个简历属性都有多个特征集。它们可以在 extract-resume-from-sections 文件夹下的源代码中找到,我们不会在这里列出它们所有。每个简历属性通常都有一个核心特征函数,可以很好地识别它们,因此我们将在下面列出核心特征函数。

简历属性核心特征函数正则表达式
姓名仅包含字母、空格或句点/^[a-zA-Z\s\.]+$/
电子邮件匹配电子邮件格式 xxx@xxx.xxx
xxx 可以是任何非空格字符
/\S+@\S+\.\S+/
电话匹配电话格式 (xxx)-xxx-xxxx
() 和 - 是可选的
/\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}/
地点匹配城市和州的格式 City, ST/[A-Z][a-zA-Z\s]+, [A-Z]{2}/
网址匹配网址格式 xxx.xxx/xxx/\S+\.[a-z]+\/\S+/
学校包含学校关键字,例如大学、学院、学校
学位包含学位关键字,例如副学士、学士、硕士
GPA匹配 GPA 格式 x.xx/[0-4]\.\d{1,2}/
日期包含与年份、月份、季节或 Present 相关的日期关键字年份: /(?:19|20)\d{2}/
职称包含职称关键字,例如分析师、工程师、实习生
公司加粗或不匹配职称和日期
项目加粗或不匹配日期

特殊情况:子部分

值得一提的是子部分。对于个人资料部分,我们可以直接将所有文本项传递给特征评分系统。但对于其他部分,例如教育和工作经验,我们必须先将该部分分成子部分,因为该部分可能存在多个学校或工作经验。然后,特征评分系统处理每个子部分以检索每个简历属性并附加结果。

简历解析器应用一些启发式方法来检测子部分。确定子部分的主要启发式方法是检查两行之间的垂直线间距是否大于典型行间距 * 1.4,因为格式良好的简历通常会在添加下一个子部分之前创建新的空行。如果主要启发式方法不适用,则还有一个后备启发式方法来检查文本项是否加粗。

这就是关于 OpenResume 解析器算法的一切 :)

作者:Xitang,日期:2023 年 6 月