← All work

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.

Role
End-to-end ML workflow
Modelling
Jupyter · scikit-learn (KNN)
Features
TF-IDF over cleaned text
Interface
Streamlit
98%test accuracy
2upload formats
7workflow stages
2pickled artefacts shipped

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.

  1. 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.

  2. NLTK for tokenisation and stopwords

    Standard preprocessing, applied identically in both training and inference — which is precisely where this kind of pipeline usually breaks.

  3. 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.

  4. 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 KNeighborsClassifier over 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.

  5. Vectoriser pickled alongside the model

    tfidf.pkl ships with clf.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.

  6. 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.

● Live Try it live ↗ Running on Streamlit Community Cloud — upload a résumé as PDF or TXT. Full local setup below.
  1. Install

    git clone https://github.com/pinkaofc/Resume-Screening-App.git
    cd Resume-Screening-App
    pip install -r requirements.txt
  2. Run the app

    streamlit run app.py
  3. 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

Pythonscikit-learnTF-IDFNLTKStreamlitPyPDF2python-docxJupyterpickle
Read the source on GitHub ↗