An end-to-end AI-powered system that analyzes resumes, extracts key information, and provides intelligent job matching recommendations. Built with MLOps best practices, featuring automated CI/CD pipelines and deployed on HuggingFace Spaces.
- π PDF Resume Parsing: Intelligent extraction of text from PDF resumes
- π§ NLP-Powered Analysis: Uses transformer models for skill extraction and summarization
- π― ATS Score Calculation: Evaluates resume compatibility with Applicant Tracking Systems
- π Job Matching: Semantic similarity matching using sentence embeddings
- π Skill Gap Analysis: Identifies missing skills for target roles
- π‘ Smart Recommendations: Suggests improvements and suitable job roles
- π MLOps Pipeline: Complete CI/CD, model versioning, and monitoring
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β Upload ββββββΆβ FastAPI ββββββΆβ ML Models β
β Resume PDF β β Backend β β (HF Hub) β
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β
βΌ
ββββββββββββββββ
β Gradio UI β
β Frontend β
ββββββββββββββββ
- Transformers: HuggingFace transformers for NLP tasks
- Sentence-Transformers: Semantic similarity and embeddings
- spaCy: Named Entity Recognition and text processing
- PyPDF2: PDF text extraction
- FastAPI: High-performance API framework
- Pydantic: Data validation and settings management
- Python 3.9+: Core programming language
- Gradio: Interactive web interface
- Plotly: Data visualization
- GitHub Actions: CI/CD pipeline
- HuggingFace Hub: Model versioning and storage
- HuggingFace Spaces: Deployment platform
- Docker: Containerization (optional)
- Pytest: Testing framework
- Black & Flake8: Code quality tools
# Clone the repository
git clone https://github.com/yourusername/Resume_Analyzer_MLOps.git
cd Resume_Analyzer_MLOps
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Download spaCy model
python -m spacy download en_core_web_sm
# Run the application
python app.py# Build the image
docker build -t resume-analyzer .
# Run the container
docker run -p 7860:7860 resume-analyzer- Launch the application:
python app.py - Open your browser at
http://localhost:7860 - Upload a PDF resume
- Optionally paste a job description
- Click "Analyze Resume"
- View results including:
- ATS Score
- Extracted Skills
- Job Matches
- Skill Gap Analysis
- Improvement Recommendations
import requests
# Upload resume
with open("resume.pdf", "rb") as f:
files = {"file": f}
data = {"job_description": "Python developer with ML experience"}
response = requests.post(
"http://localhost:8000/api/analyze",
files=files,
data=data
)
print(response.json())Resume_Analyzer_MLOps/
βββ src/
β βββ __init__.py
β βββ resume_parser.py # PDF parsing and text extraction
β βββ nlp_processor.py # NLP models and skill extraction
β βββ job_matcher.py # Embedding-based job matching
β βββ ats_scorer.py # ATS score calculation
β βββ utils.py # Helper functions
βββ models/
β βββ __init__.py
β βββ model_loader.py # Model loading and caching
βββ api/
β βββ __init__.py
β βββ main.py # FastAPI endpoints
βββ tests/
β βββ __init__.py
β βββ test_parser.py
β βββ test_nlp.py
β βββ test_api.py
βββ data/
β βββ sample_resumes/ # Sample resumes for testing
β βββ job_database.json # Sample job descriptions
βββ logs/
β βββ app.log # Application logs
βββ .github/
β βββ workflows/
β βββ ci.yml # GitHub Actions CI/CD
βββ app.py # Main Gradio application
βββ requirements.txt # Python dependencies
βββ Dockerfile # Docker configuration
βββ .gitignore # Git ignore rules
βββ README.md # This file
βββ LICENSE # MIT License
# Run all tests
pytest tests/ -v
# Run with coverage
pytest tests/ --cov=src --cov-report=html
# Run specific test
pytest tests/test_parser.py -v- Models stored on HuggingFace Hub
- Version-controlled model artifacts
- Easy rollback capabilities
- Automated testing on push
- Code quality checks (Black, Flake8)
- Automatic deployment to HF Spaces
- Request/response logging
- Performance metrics tracking
- Error monitoring and alerting
- Pinned dependencies
- Seed setting for deterministic results
- Documented model versions
# Extract text from PDF
resume_text = parse_resume("resume.pdf")# Use NER and pattern matching
skills = extract_skills(resume_text)
experience = extract_experience(resume_text)
education = extract_education(resume_text)# Calculate ATS compatibility
ats_score = calculate_ats_score(
resume_text,
formatting_score,
keyword_match,
section_completeness
)# Generate embeddings and find similar jobs
resume_embedding = model.encode(resume_text)
job_embeddings = model.encode(job_descriptions)
similarities = cosine_similarity(resume_embedding, job_embeddings)# Compare resume skills with job requirements
missing_skills = required_skills - resume_skills
recommendations = generate_recommendations(missing_skills)- Create a new Space on HuggingFace
- Connect your GitHub repository
- Configure Space settings:
- SDK: Gradio
- Python version: 3.9
- Push to main branch - auto-deployment triggers!
HF_TOKEN=your_huggingface_token # For model access
LOG_LEVEL=INFO # Logging level
MAX_FILE_SIZE=10 # Max upload size (MB)- Resume Processing: ~2-3 seconds per resume
- ATS Score Calculation: <1 second
- Job Matching: ~1-2 seconds for 100 jobs
- API Response Time: <5 seconds average
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- HuggingFace for model hosting and deployment
- Sentence-Transformers team for embedding models
- FastAPI team for the excellent framework
- Gradio team for the UI framework
Your Name - [Your Email]
Project Link: https://github.com/yourusername/Resume_Analyzer_MLOps
Made with β€οΈ and π€ by [Your Name]