06 · MACHINE LEARNING · NLP
Resume Screening App
Repository codename · Automated Resume Classifier
An end-to-end resume classifier — trained to 98% test accuracy in a notebook, then shipped as a Streamlit app that reads PDFs and returns a job category instantly.
01 — THE PROBLEM
Recruiters lose hours to the first pass over a résumé pile — not evaluating candidates, just sorting them into the right stack. It is repetitive, it is mechanical, and it is exactly the shape of problem a classifier handles well.
The goal was to carry one model the whole distance: from a raw uploaded file through to a prediction in a browser, with nothing left stranded in a notebook.
02 — ARCHITECTURE
PDF / TXT upload → clean (URLs, emails, symbols, whitespace) → NLTK tokenise + stopword removal → TF-IDF vectorise (tfidf.pkl) → classifier (clf.pkl) → predicted job category
03 — BUILD LOG
The decisions that shaped the system, and why each one was made.
-
Cleaning before anything clever
Raw résumé text is full of URLs, email addresses, stray symbols and inconsistent whitespace — all of which become noise features that a vectoriser will happily learn from. Stripping them first did more for accuracy than any later tuning.
-
NLTK for tokenisation and stopwords
Standard preprocessing, applied identically in both training and inference — which is precisely where this kind of pipeline usually breaks.
-
TF-IDF rather than embeddings
Résumé categories are driven by distinctive vocabulary: specific frameworks, tools and job titles. TF-IDF captures exactly that signal, trains in seconds and stays interpretable. Reaching for transformer embeddings here would have added weight without adding information.
-
Trained in a notebook, evaluated properly
Model development happened in Jupyter, reaching 98% accuracy on held-out test data across 25 categories including Data Science, Java Developer, HR, Python Developer and Mechanical Engineer. The shipped classifier is a
KNeighborsClassifierover the TF-IDF vectors — a sensible fit here, since résumés in the same job family cluster tightly in that feature space and the model needs no retraining to absorb a new example. -
Vectoriser pickled alongside the model
tfidf.pklships withclf.pkl. Serialising the model alone is a classic mistake — inference has to vectorise new text into the exact same feature space, so the fitted vectoriser is part of the artefact, not a detail to rebuild at runtime. -
Parsing at the edge
PyPDF2 and python-docx pull text out of uploads, so a recruiter can drop in the file they already have rather than pasting plain text.
04 — WALKTHROUGH
Running it end to end.
-
Install
git clone https://github.com/pinkaofc/Resume-Screening-App.git cd Resume-Screening-App pip install -r requirements.txt -
Run the app
streamlit run app.py -
Use it
Upload a résumé as PDF or TXT and the predicted job category comes back immediately — cleaning, vectorising and classification all run behind that single upload.
05 — STACK