An end-to-end system that extracts structured dataβSkills, Work Experience, Education, and Languagesβfrom resumes in PDF, DOCX, and TXT formats.
Built with a fine-tuned RoBERTa-base model (via spaCy-transformers), a FastAPI backend, and a React frontendβachieving 96.77% F1-score on resume entity recognition.
- Dataset: 60 resumes (1,555 annotated entities) (42 train, 8 dev, 10 test)
- Model: spaCy transformer (RoBERTa-base fine-tuned)
- Best Test F1-score: 96.77% (overall)
- Entities extracted: Skills, Work Experience, Education, Languages
- π Upload resumes (PDF, DOCX, TXT).
- π€ AI-powered extraction of:
- π― Skills
- πΌ Work Experience
- π Education
- π Languages
- π Instant structured output for downstream use.
- π» Web interface + REST API.
- Languages: Python, TypeScript
- NLP Framework: spaCy transformers (RoBERTa-base)
- Backend: FastAPI, Uvicorn
- Frontend: React / Next.js
- Parsing Tools: pdfplumber, docx2txt
- Data Annotation: Label Studio
- Pretrained Model: RoBERTa-base
- DevOps & Tools: Git, Docker, AWS, Vercel
- Methodologies: Data preprocessing, tokenization, regex bootstrapping, model evaluation with F1/Precision/Recall
The resume parser now uses a fine-tuned transformer model for superior entity recognition:
- Base Model: RoBERTa-base (125M parameters)
- Framework: spaCy-transformers
- Training: Fine-tuned on resume domain
- Learning Rate: 5e-5 with linear warmup
- Batch Size: 128 with dynamic padding
- Max Steps: 20,000 with early stopping (patience: 1,600 steps)
- Optimizer: AdamW with weight decay
- β Better contextual understanding of resume text
- β Improved generalization to unseen resume formats
- β Higher accuracy on complex entity boundaries
- β State-of-the-art transformer architecture
The spaCy transformer model was fine-tuned on manually annotated resumes using transfer learning:
- Base Model: RoBERTa-base (pretrained on general text)
- Fine-tuning Dataset: 60 annotated resumes
- Split:
- 42 resumes β Training
- 8 resumes β Development (validation)
- 10 resumes β Test (final evaluation)
- Text extraction & normalization from PDF/DOCX
- Transformer tokenization with RoBERTa tokenizer
- Fine-tuning with spaCy's transformer NER architecture
- Early stopping to prevent overfitting
- Comprehensive evaluation on held-out test set
On the held-out test set (10 resumes):
| Metric | Score |
|---|---|
| Precision (NER P) | 95.02% |
| Recall (NER R) | 98.59% |
| F1-score (NER F) | 96.77% |
| Entity | Precision | Recall | F1 |
|---|---|---|---|
| π Education | 96.97 | 96.97 | 96.97 |
| πΌ Work Exp. | 84.62 | 100.00 | 91.67 |
| π― Skill | 95.77 | 98.55 | 97.14 |
| π Language | 100.00 | 100.00 | 100.00 |
β‘ Why not accuracy?
For NER tasks, accuracy is misleading because the majority of tokens are not entities. Instead, the F1-score (harmonic mean of precision & recall) is the gold-standard metric in NLP.
I'm currently improving the accuracy of the Resume Parser using these methodologies:
- Expanding dataset with more annotated resumes (beyond current 60).
- Annotating more Work Experience and Education entities to address weaker categories.
- Reviewing and enforcing annotation consistency (e.g., clear rules for job titles, companies, skills).
- Experimenting with larger spaCy models (
en_core_web_md,en_core_web_lg). - Fine-tuning transformer-based models (BERT, RoBERTa) using
spacy-transformers. - Hyperparameter tuning: adjusting learning rate, batch size, training iterations.
git clone https://github.com/yourusername/resume-parser.git
cd resume-parsercd backend
pip install -r requirements.txt
uvicorn main:app --reloadcd frontend
npm install
npm run devcurl -X POST "http://localhost:8000/parse" \
-F "file=@sample_resume.pdf"MIT License. Free to use & modify.
