ResumeFlowResumeFlow Logo

Resume Parser Playground

This playground showcases the ResumeFlow resume parser and its ability to parse information from a resume PDF. Click around the PDF examples below to observe different parsing results.

Resume Example {n} 1

Borrowed from University of La Verne Career Center - Link

Resume Example {n} 2

Created with ResumeFlow resume builder - Link

You can also add your resume below to access how well your resume would be parsed by similar Application Tracking Systems (ATS) used in job applications. The more information it can parse out, the better it indicates the resume is well formatted and easy to read. It is beneficial to have the name and email accurately parsed at the very least.

Browse a pdf file or drop it here

File data is used locally and never leaves your browser

Resume Parsing Results

Profile
Name
Email
Phone
Location
Link
Summary
Education
School
Degree
GPA
Date
Descriptions
Work Experience
Company
Job Title
Date
Descriptions
Skills
Descriptions

Resume Parser Algorithm Deep Dive

For the technical curious, this section will dive into the ResumeFlow parser algorithm and walks through the 4 steps on how it works. (Note that the algorithm is designed to parse single column resume in English language)

Step 1. Read the text items from a PDF file

A PDF file is a standardized file format defined by the ISO 32000 specification. When you open up a PDF file using a text editor, you'll notice that the raw content looks encoded and is difficult to read. To display it in a readable format, you would need a PDF reader to decode and view the file. Similarly, the resume parser first needs to decode the PDF file in order to extract its text content.

While it is possible to write a custom PDF reader function following the ISO 32000 specification, it is much simpler to leverage an existing library. In this case, the resume parser uses Mozilla's open source pdf.js library to first extract all the text items in the file.

The table below lists 0 text items that are extracted from the resume PDF added. A text item contains the text content and also some metadata about the content, e.g. its x, y positions in the document, whether the font is bolded, or whether it starts a new line. (Note that x,y position is relative to the bottom left corner of the page, which is the origin 0,0)

#Text ContentMetadata

Step 2. Group text items into lines

The extracted text items aren't ready to use yet and have 2 main issues:

Issue 1: They have some unwanted noises.Some single text items can get broken into multiple ones, as you might observe on the table above, e.g. a phone number "(123) 456-7890" might be broken into 3 text items "(123) 456", "-" and "7890".

Solution: To tackle this issue, the resume parser connects adjacent text items into one text item if their distance is smaller than the average typical character width, where Distance = RightTextItemX₁ - LeftTextItemX₂ The average typical character width is calculated by dividing the sum of all text items' widths by the total number characters of the text items (Bolded texts and new line elements are excluded to not skew the results).

Issue 2: They lack contexts and associations.When we read a resume, we scan a resume line by line. Our brains can process each section via visual cues such as texts' boldness and proximity, where we can quickly associate texts closer together to be a related group. The extracted text items however currently don't have those contexts/associations and are just disjointed elements.

Solution: To tackle this issue, the resume parser reconstructs those contexts and associations similar to how our brains do it, through grouping them into lines and sections.

LinesLine Content

Step 3. Group lines into sections

Now that we have the lines, the next step is to group them into sections. The main idea is to find section titles and group their following lines (content) together. Section titles are detected by checking whether a line is bolded and has short text content (a heuristic). Once section titles are identified, the rest of the lines that follow are grouped as their content until the next section title is reached.

A section is represented by its section title and an array of lines. The table below shows the 0 sections that are detected: The section titles are bolded and the lines associated with the section are highlighted with the same colors.

LinesLine Content

Step 4. Extract resume from sections

Feature Scoring System

As a demonstration, the table below shows 3 resume attributes in the profile section of the resume PDF added.

Resume AttributeText (Highest Feature Score)Feature Scores of Other Texts
Name
Email
Phone

Feature Sets

Name Feature Sets
Feature FunctionFeature Matching Score
Contains only letters, spaces or periods+3
Is bolded+2
Contains all uppercase letters+2
Contains @-4 (match email)
Contains number-4 (match phone)
Contains ,-4 (match address)
Contains /-4 (match url)

Core Feature Function

Resume AttributeCore Feature FunctionRegex
NameContains only letters, spaces or periods/^[a-zA-Z\s\.]+$/
EmailMatch email format xxx@xxx.xxx xxx can be anything not space/\S+@\S+\.\S+/
PhoneMatch phone format (xxx)-xxx-xxxx () and - are optional/\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}/
LocationMatch city and state format {City, ST}/[A-Z][a-zA-Z\s]+, [A-Z]{2}/
UrlMatch url format xxx.xxx/xxx/\S+\.[a-z]+\/\S+/
SchoolContains a school keyword, e.g. College, University, School
DegreeContains a degree keyword, e.g. Associate, Bachelor, Master
GPAMatch GPA format x.xx/[0-4]\.\d{1,2}/
DateContains date keyword related to year, month, seasons or the word PresentYear: /(?:19|20)\d{2}/
Job TitleContains a job title keyword, e.g. Analyst, Engineer, Intern
CompanyIs bolded or doesn't match job title & date
ProjectIs bolded or doesn't match date

Special Case: Subsections

And that is everything about the ResumeFlow parser algorithm :)

Written by Xitang on June 2023