CoolFace
Datasetpublic

Careerflow/ResumeExtractBench

ResumeExtractBench ResumeExtractBench is a benchmark for schema-guided structured extraction from resume documents. Given a resume PDF and a JSON Schema, systems must return structured data covering personal details, work history, education, skills, and more. Dataset Size: 38 documents (handwritten + adversarial distractors) Schema Sections Scored: 9 (basics, experience, education, projects, summary, certifications, awards, volunteering, skills) Domains: 6 (engineering… See the full description on the dataset page: https://huggingface.co/datasets/Careerflow/ResumeExtractBench.

sourceHugging Facecc-by-4.0updated 13h agoView on Hugging Face
0likes57downloads
Dataset Card

ResumeExtractBench

ResumeExtractBench is a benchmark for schema-guided structured extraction from resume documents. Given a resume PDF and a JSON Schema, systems must return structured data covering personal details, work history, education, skills, and more.

  • —Dataset Size: 38 documents (handwritten + adversarial distractors)
  • —Schema Sections Scored: 9 (basics, experience, education, projects, summary, certifications, awards, volunteering, skills)
  • —Domains: 6 (engineering, healthcare, legal, data science, government, general)
  • —License: CC-BY-4.0

Quick Links: 💻 Code & CLI | 🏢 Careerflow


Dataset Introduction

Document Composition

Challenge CategoryDocumentsDescription
Handwritten resumes28Scanned handwritten resumes testing OCR and layout understanding
Adversarial distractors10Synthetic resumes with intentional parsing challenges
Total38

Source Composition

  • —Handwritten documents: 28
  • —Synthetic (LaTeX-generated): 10
  • —All documents classified as "hard" difficulty

Challenge Categories

C1: Handwritten Resumes — Scanned handwritten documents with natural variation in handwriting, layout, and legibility. Tests OCR accuracy, spatial reasoning, and robustness to non-standard formatting. Typical failures: misread characters, merged/split words, missed sections, hallucinated content from ambiguous handwriting.

C2: Adversarial Distractors — Synthetic resumes with intentional parsing challenges designed to stress-test extraction robustness:

DistractorChallenge
Date chaosInconsistent date formats within the same resume (Jan 2020, 2020-06, 06/2021, Summer 2022)
Esoteric titlesNon-standard job titles (Chief Vibes Officer, Growth Hacker), salary listed, entity confusion
European regionalGerman-style CV with date of birth, marital status, nationality, military service, German grade scale
Functional formatSkills-first layout with no chronological work history
Identity confusionMulti-part names, honorifics, maiden names, father's name, testimonial quotes with other people's titles
MultilingualEnglish resume with French and Spanish intertwined
Prompt injectionHidden white text injection, PDF metadata injection, keyword stuffing in 6pt font
Prose narrativeThird-person writing, no bullet points, 500-word personal statement, emoji section markers
Same company repeatSame employer listed 4 times with company renamed mid-tenure and overlapping dates
Skill-name collisionCandidate name collides with programming language (Ruby Chen at Python Solutions Inc.)

Domain Coverage

DomainDocuments
Engineering11
General10
Healthcare7
Legal7
Data Science2
Government1

Usage

Loading with Datasets

python
from huggingface_hub import snapshot_download
import json

root = snapshot_download(
    repo_id="careerflow/ResumeExtractBench",
    repo_type="dataset",
)

with open(f"{root}/test.jsonl") as f:
    cases = [json.loads(line) for line in f if line.strip()]

schema = json.load(open(f"{root}/schema.json"))

for case in cases:
    pdf_path = f"{root}/{case['files']['pdf']}"
    ground_truth = case["ground_truth"]
    # Run your extractor on pdf_path against schema
    # Compare output to ground_truth

Running Evaluation with CLI

bash
pip install git+https://github.com/careerflow/resume-extract-bench.git
resume-bench download                                          # download dataset
resume-bench run --pipeline gpt-5.6 --split test               # run extraction
resume-bench grade --split test                                 # score against GT
resume-bench leaderboard                                        # view results

Bring Your Own Predictions

bash
resume-bench grade-file my_predictions.jsonl --split test

Predictions JSONL supports two formats:

Flat format (recommended):

json
{"resume_id": "board-certified-ocularist-jane-doe", "basics": {"fname": "Jane", "lname": "Doe", ...}, "experience": [...], ...}

Wrapped format:

json
{"resume_id": "board-certified-ocularist-jane-doe", "prediction": {"basics": {...}, "experience": [...], ...}}

Dataset Files

  • —test.jsonl: 38 test cases (one JSON object per line)
  • —schema.json: Target JSON Schema for extraction (resume_v1)
  • —pdfs/: Source resume PDFs

Dataset Format

Each JSONL line represents one resume test case:

json
{
    "resume_id": "distractor-date-chaos-inconsistent-date-formats-throughout",
    "files": {"pdf": "pdfs/distractor-date-chaos-inconsistent-date-formats-throughout.pdf"},
    "ground_truth": { ... },
    "difficulty": "hard",
    "layout_tags": ["distractor", "inconsistent-date-formats"],
    "source": "synthetic-distractor",
    "domain": "software-engineering",
    "schema_version": "resume_v1"
}

Field Definitions

FieldTypeDescription
resume_idstringUnique identifier (PDF filename stem)
files.pdfstringRelative path to source PDF
ground_truthobjectHuman-verified structured extraction conforming to schema.json
difficultystringDifficulty level (easy, medium, hard)
layout_tagslist[string]Visual and structural challenge tags
sourcestringResume origin: expert-handwritten, synthetic-distractor
domainstringProfessional domain of the resume
schema_versionstringSchema version (resume_v1)

Extraction Schema (resume_v1)

The schema defines 9 sections that must be extracted from each resume:

SectionTypeKey FieldsScored
basicsSingleton objectfname, lname, email, phone, city, state, country, hasPersonalPhotoPer-field accuracy
experienceEntity listcompany, position, startMonth/Year, endMonth/Year, city, description[]Entity P/R/F1 + description token F1
educationEntity listinstitution, area, studyType, startMonth/Year, endMonth/Year, description[]Entity P/R/F1 + description token F1
projectsEntity listname, url, description[]Entity P/R/F1 + description token F1
personalSummaryFree text—Token F1
certificationsEntity listname, issuerEntity P/R/F1
awardsEntity listtitleEntity P/R/F1
volunteeringEntity listorganization, position, startYear, endYear, description[]Entity P/R/F1 + description token F1
skillsFlat listcategory, skills[]Set-level P/R/F1

See schema.json for the full JSON Schema definition.


Evaluation Metrics

Scoring Methods

  1. 1.Entity-Level F1: Entities (experience entries, education entries, etc.) are aligned between prediction and ground truth using the Hungarian algorithm (optimal bipartite matching via scipy.optimize.linear_sum_assignment). Match quality is determined by Jaro-Winkler similarity on key fields (threshold: 0.5).
  1. 1.Description Token F1: For matched entities with description arrays, a bag-of-words token F1 score measures description quality.
  1. 1.Hallucination Rate: Fraction of predicted entities that have no match in ground truth (spurious predictions).
  1. 1.Omission Rate: Fraction of ground truth entities that have no match in predictions (missed extractions).

All scoring is deterministic with no model in the loop.

Aggregate Metrics

Per-section scores are averaged across all resumes. The overall F1 is the mean of all section F1 scores, providing a single leaderboard ranking metric.


Leaderboard

Results from the full 155-resume benchmark (includes this dataset plus additional medium-difficulty resumes):

RankModelOverall F1Halluc. RateOmission Rate
1LlamaExtract Agentic Plus0.9455.1%2.9%
2Claude Opus0.9375.1%3.6%
3Extend Extract0.9374.3%4.3%
4Extend Max Context0.9354.7%4.6%
5Reducto Extract0.9315.4%4.1%
6Gemini 3.5 Flash0.9285.8%4.3%
7Reducto Deep0.9236.3%4.9%
8GPT-5.50.9219.4%2.5%
9GPT-5.60.9208.7%3.2%
10Gemma 4 26B0.9146.5%5.4%

19 models benchmarked. Full results available in the [code repository](https://github.com/careerflow/resume-extract-bench).


Tag Taxonomy

ResumeExtractBench tags documents along three axes:

AxisTagsDescription
Sourceexpert-handwritten, synthetic-distractorHow the resume was created
Difficultyeasy, medium, hardOverall extraction difficulty
Domainengineering, healthcare, legal, data-science, government, generalProfessional domain

Layout tags provide additional visual/structural metadata per resume (e.g., handwritten, fancy-templates, canva).


Citation

bibtex
@misc{careerflow2026resumeextractbench,
    title={ResumeExtractBench: A Benchmark for Schema-Guided Resume Extraction},
    author={Careerflow and LlamaIndex},
    year={2026},
    url={https://huggingface.co/datasets/careerflow/ResumeExtractBench},
}

License

All documents are synthetic or expert-created with fictional personal information. Released under CC-BY-4.0.