AI Resume Screening System is a portfolio-ready Flask application that parses resumes, extracts skills and keywords with NLP, compares them to a job description, and ranks candidates using a hybrid scoring approach.
- Upload one job description and multiple resumes
- Extract skills from resumes and job posts using spaCy phrase matching
- Generate keywords from cleaned text with TF-IDF
- Score candidates using a hybrid of skill overlap and text similarity
- Store jobs, resumes, and ranking results in SQL via SQLAlchemy
- Use PostgreSQL in production or SQLite for quick local development
- Access both server-rendered pages and JSON API endpoints
- Python
- Flask
- spaCy
- Scikit-learn
- SQLAlchemy
- PostgreSQL
app/
services/
static/
templates/
data/
samples/
tests/
run.py
- Create a virtual environment and activate it.
- Install dependencies:
pip install -r requirements.txt
- Copy
.env.exampleto.envand update values if needed. - Optional but recommended: install the spaCy English model:
The app still runs with a lightweight fallback tokenizer if the model is not installed.
python -m spacy download en_core_web_sm
- Start the app:
python run.py
The app will create the SQLite database automatically if DATABASE_URL is not set.
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/resume_screening
SECRET_KEY=replace-this
UPLOAD_FOLDER=uploads
SPACY_MODEL=en_core_web_smSECRET_KEY=local-dev-secret
DATABASE_URL=sqlite:///resume_screening.db
UPLOAD_FOLDER=uploads
SPACY_MODEL=en_core_web_sm- Create a job description from the dashboard or
POST /api/jobs. - Upload multiple
.txtor.pdfresumes from the dashboard orPOST /api/resumes/upload. - Run the screening flow from the dashboard or
POST /api/screenings/run. - Review ranked results on the UI or via
GET /api/screenings/<job_id>/results.
Create a job:
curl -X POST http://127.0.0.1:5000/api/jobs \
-H "Content-Type: application/json" \
-d "{\"title\": \"Python NLP Engineer\", \"description\": \"Need Python, Flask, PostgreSQL, spaCy, and scikit-learn.\"}"Upload resumes:
curl -X POST http://127.0.0.1:5000/api/resumes/upload \
-F "resumes=@samples/resumes/alex_johnson.txt" \
-F "resumes=@samples/resumes/sam_lee.txt"Run screening:
curl -X POST http://127.0.0.1:5000/api/screenings/run \
-H "Content-Type: application/json" \
-d "{\"job_id\": 1}"Get results:
curl http://127.0.0.1:5000/api/screenings/1/results- Add dashboard screenshot here
- Add ranking results screenshot here
samples/job_description.txtsamples/resumes/alex_johnson.txtsamples/resumes/sam_lee.txt
Run:
pytest