This project builds
Installation:
pip install jobselectIt uses:
Data preparation (model/prep/data_prep.py)
tesnorflow/pytorch → tensorflow/pytorch).model/prep/prepared_data.npz (TF-IDF arrays + labels + indexes)model/prep/vectorizer.pkl (fitted TF-IDF vectorizer)model/prep/label_vocab.json (skill label vocabulary)Model training (model/model.py)
BCEWithLogitsLoss (multi-label setting).model_out/skill_classifier.pt (model weights)model_out/training_history.json (train/test loss curves)Evaluation (model/eval.py)
Prediction / Inference (model/pred.py)
.
├─ data/
│ ├─ raw/
│ │ └─ Job_descriptions.csv # Raw input dataset
│ ├─ sample_data/
│ │ └─ test.txt # Example JD, Role and Type for testing
│ └─ clean/
│ ├─ cleaned_job_descriptions.csv # Cleaned master CSV
│ ├─ cleaned_job_descriptions_internships.csv
│ ├─ cleaned_job_descriptions_junior.csv
│ └─ cleaned_job_descriptions_senior.csv
│
├─ model/
│ ├─ prep/
│ │ ├─ data_prep.py # TF-IDF + multi-hot label creation + train/test split
│ │ ├─ sym_map.py # Synonym/phrase normalization map used during prep
│ │ ├─ vectorizer.pkl # Saved TF-IDF vectorizer (generated by data_prep)
│ │ ├─ prepared_data.npz # Saved arrays (generated by data_prep)
│ │ └─ label_vocab.json # Skill label vocabulary (generated by data_prep)
│ │
│ ├─ model.py # PyTorch multi-label classifier training
│ ├─ eval.py # Thresholded evaluation + F1 metrics + baseline comparison
│ └─ pred.py # Predict top-k skills for new text
│
├─ model_out/
│ ├─ skill_classifier.pt # Trained model weights (generated by model.py)
│ └─ training_history.json # Training loss history (generated by model.py)
│
├─ cli/
│ ├─ jobselect.py # Rich terminal CLI (prompts + prints top skills)
│ ├─ model_select.py # Inference routing: API-first, LOCAL fallback (key resolved lazily)
│ └─ api_val.py # API key prompt / mode selection for CLI
│
├─ test/
│ └─ test_model.py # Pytest checks expected artifacts exist in model_out/ and model/prep/
│
├─ notebooks/
│ ├─ 01_EDA.ipynb # Exploratory Data Analysis
│ └─ 02_Data_Engineering.ipynb # Data engineering / cleaning notes
│
├─ api/
│ ├─ JobAnalyze_API.py # FastAPI service + Pydantic validation + API-key verification
│ ├─ pred.py # API/server-side prediction wrapper (imports model.pred)
│ └─ supabase_client.py # Optional API key persistence (Supabase)
│
├─ pipeline.py # Executes notebooks + training/eval steps in order
├─ pyproject.toml # Installs as a cli tool (jobselect)
├─ requirements.txt
└─ README.md
See requirements.txt for the exact dependencies.
git clone https://github.com/Ak47xdd/Job-Description-Analysis.git
pip install -r requirements.txt
This builds the TF-IDF features and label vocabulary from the cleaned CSV.
python model/prep/data_prep.py
Expected outputs:
model/prep/prepared_data.npzmodel/prep/vectorizer.pklmodel/prep/label_vocab.jsonpython model/model.py
Expected outputs:
model_out/skill_classifier.ptmodel_out/training_history.jsonpython model/eval.py
Outputs include:
from api.pred import JobAnalyze_6k
data/sample_data/test.txt contains an example job description inside. Use:
JobAnalyze_6k(job_desc, role="AI Engineer", job_type="Junior", top_k=50)
python -m cli.jobselect
# or after install
pip install jobselect
jobselect
The CLI:
Currently, the API service is under development, you could press Enter on first screen:
Enter to skip to LOCAL ModeRun api/JobAnalyze_API.py. Requests must include:
JobAnalyze_6k_Key with a valid API keyJob_Desc, Role, and Type (validated via Pydantic)"{job_desc} {role} {job_type}"BCEWithLogitsLoss).model/eval.py uses a fixed threshold of 0.3. For production use, you may want per-label thresholds tuned on a validation set.cli/jobselect.py) using rich + pyfiglet for interactive top-skill display.api/JobAnalyze_API.py.api/supabase_client.py.cli/api_val.py + cli/model_select.py): uses API when a key is available, otherwise falls back to local inference.model/prep/sym_map.py) applied during data preparation.pipeline.py) to execute notebooks and training steps in sequence.data_prep.pymax_features, ngram_range, min_df)Developed with ❤️ by Akshay Babu
For questions, feedback, or collaboration opportunities, feel free to reach out!
This repository follows a common pattern for multi-label NLP baselines: TF-IDF features + a simple neural network + sigmoid-based multi-label outputs.