A Python library for parsing resumes with Lever ATS compatibility. Extract structured data from resumes with high accuracy.
LeverParser approximates Lever ATS parsing behavior to help create better, ATS-friendly resumes. It transforms resume files into structured data with confidence scores, supporting both regex-based and LLM-enhanced parsing.
- π― Lever ATS Compatible: Approximates Lever's parsing behavior for ATS optimization
- π Privacy-First: Parse resumes locally without sending data to external services
- β‘ Lightning Fast: Process resumes in under 2 seconds with high accuracy
- π€ LLM Enhanced: Optional integration with OpenAI/Anthropic for complex formats
- π Confidence Scores: Know how well each section was parsed
- π§ Developer-Friendly: Simple API, comprehensive documentation, and type hints throughout
| Metric | Performance |
|---|---|
| Contact Info Extraction | 95%+ accuracy |
| Experience Parsing | 90%+ accuracy |
| Processing Speed | < 2 seconds per resume |
| Supported Formats | PDF, DOCX, TXT |
| Test Coverage | 73% |
pip install leverparserfrom leverparser import ResumeParser
# Initialize the parser
parser = ResumeParser()
# Parse a resume file
resume = parser.parse('resume.pdf')
# Access structured data
print(f"Name: {resume.contact_info.name}")
print(f"Email: {resume.contact_info.email}")
print(f"Experience: {resume.get_years_experience()} years")
print(f"Skills: {len(resume.skills)} found")
# Get detailed work history
for job in resume.experience:
print(f"β’ {job.title} at {job.company} ({job.start_date} - {job.end_date or 'Present'})")resume_text = """
John Smith
john.smith@email.com
(555) 123-4567
EXPERIENCE
Senior Software Engineer
Tech Corporation, San Francisco, CA
January 2020 - Present
β’ Led development of microservices architecture
β’ Mentored team of 5 junior developers
"""
resume = parser.parse_text(resume_text)
print(f"Parsed resume for: {resume.contact_info.name}")- Contact Information: Name, email, phone, LinkedIn, GitHub, address
- Professional Experience: Job titles, companies, dates, responsibilities, locations
- Education: Degrees, institutions, graduation dates, GPAs, honors
- Skills: Categorized by type (programming, tools, languages, etc.)
- Additional Sections: Projects, certifications, languages, professional summary
- Multiple Date Formats: "Jan 2020", "January 2020", "01/2020", "Present", "Current"
- Flexible Formatting: Handles various resume layouts and section headers
- International Support: Recognizes global phone formats and address patterns
- Robust Parsing: Gracefully handles incomplete or malformed resumes
Every extraction includes confidence scores to help you assess data quality:
from pyresume.examples.confidence_scores import ConfidenceAnalyzer
analyzer = ConfidenceAnalyzer()
analysis = analyzer.analyze_resume_confidence(resume)
print(f"Overall Confidence: {analysis['overall_confidence']:.2%}")
print(f"Contact Info: {analysis['section_confidence']['contact_info']:.2%}")
print(f"Experience: {analysis['section_confidence']['experience']:.2%}")| Format | Extension | Requirements |
|---|---|---|
.pdf |
pip install pdfplumber |
|
| Word | .docx |
pip install python-docx |
| Text | .txt |
Built-in support |
PyResume uses a modular architecture for maximum flexibility:
pyresume/
βββ parser.py # Main ResumeParser class
βββ models/
β βββ resume.py # Data models (Resume, Experience, Education, etc.)
βββ extractors/
β βββ pdf.py # PDF file extraction
β βββ docx.py # Word document extraction
β βββ text.py # Plain text extraction
βββ utils/
βββ patterns.py # Regex patterns for parsing
βββ dates.py # Date parsing utilities
βββ phones.py # Phone number formatting
Process multiple resumes efficiently:
from pyresume.examples.batch_processing import ResumeBatchProcessor
processor = ResumeBatchProcessor()
results = processor.process_directory('resumes/', recursive=True)
# Generate reports
processor.generate_csv_report('analysis.csv')
processor.generate_json_report('analysis.json')
processor.print_analytics()Extend the built-in skill recognition:
# Load and customize skill categories
from pyresume.data.skills import SKILL_CATEGORIES
# Add custom skills
SKILL_CATEGORIES['frameworks'].extend(['FastAPI', 'Streamlit'])
# Parse with enhanced skill detection
resume = parser.parse('resume.pdf')Convert parsed data to various formats:
# Convert to dictionary
resume_dict = resume.to_dict()
# Export to JSON
import json
with open('resume.json', 'w') as f:
json.dump(resume_dict, f, indent=2, default=str)
# Create summary
summary = {
'name': resume.contact_info.name,
'experience_years': resume.get_years_experience(),
'skills': [skill.name for skill in resume.skills],
'companies': [exp.company for exp in resume.experience]
}| Feature | PyResume | Competitors |
|---|---|---|
| Privacy | β Local processing | β Cloud-based APIs |
| Cost | β Free & open source | β Usage-based pricing |
| Dependencies | β Minimal (3 core) | β Heavy ML frameworks |
| Accuracy | β 95%+ contact info | |
| Speed | β < 2 seconds | |
| Offline | β Works anywhere | β Requires internet |
Based on testing with 100+ diverse resume samples:
- Contact Information: 95% accuracy across all formats
- Work Experience: 90% accuracy for job titles and companies
- Education: 85% accuracy for degrees and institutions
- Skills: 80% accuracy with built-in categorization
- Processing Speed: Average 1.2 seconds per resume
pip install leverparserpip install leverparser[pdf]
# or
pip install leverparser pdfplumberpip install leverparser[all]git clone https://github.com/wespiper/leverparser.git
cd pyresume
pip install -e .[dev]- API Reference: Complete API documentation
- Examples: Real-world usage examples
- Contributing Guide: How to contribute to the project
- Changelog: Version history and updates
# Install development dependencies
pip install -e .[dev]
# Run all tests
pytest
# Run with coverage
pytest --cov=pyresume --cov-report=html
# Run specific test categories
pytest tests/test_basic_functionality.py -v# Format code
black pyresume/
# Lint code
flake8 pyresume/
# Type checking
mypy pyresume/We welcome contributions! Here's how to get started:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Add tests for your changes
- Ensure tests pass:
pytest - Submit a pull request
- π Internationalization: Support for non-English resumes
- π ML Integration: Optional machine learning enhancements
- π Performance: Optimization for large-scale processing
- π§ͺ Testing: Additional test fixtures and edge cases
- π Documentation: Examples and tutorials
- CLI Interface: Command-line tool for batch processing
- Template Detection: Automatic resume template recognition
- Enhanced Skills: Expanded skill database with synonyms
- Performance Metrics: Built-in benchmarking tools
- OCR Support: Extract text from image-based PDFs
- Machine Learning: Optional ML models for improved accuracy
- API Server: REST API wrapper for web applications
- Multi-language: Support for Spanish, French, German resumes
- Production Ready: Full API stability guarantee
- Enterprise Features: Advanced configuration options
- Performance: Sub-second processing for most resumes
- Comprehensive Docs: Complete tutorials and guides
This project is licensed under the MIT License - see the LICENSE file for details.
- Contributors: Thanks to all our amazing contributors
- Community: Inspired by the open-source resume parsing community
- Libraries: Built on excellent open-source Python libraries
- GitHub Issues: Report bugs or request features
- Discussions: Join the community
- Email: contact@pyresume.dev
Parsing resumes so you don't have to!