smr123/resume-job-classifier
resume-job-classifier
CPU-friendly 3-class text classifier that routes documents into `resume`, `job_post`, or `other`.
Use it to pre-filter text before resume parsers, job extractors, or downstream LLM pipelines.
Used in production
This model routes browser captures in [AI Career OS](https://github.com/semirturgay/ai-career-os), an open-source, local-first career assistant.
Its Chrome extension reads the visible text of whatever page you have open, this classifier decides whether that text is a single job posting, and only then does an LLM extract structured fields. Deciding "is this even a job post?" is a classification problem rather than a prompting one, so it runs here — locally, in single-digit milliseconds per chunk on a laptop CPU — instead of spending an LLM call and a round trip to find out the user was on a search results page.
Everything downstream runs on a model you control, including a local 9B through Ollama or LM Studio.
Labels
Model details
Evaluation (test split, n=140)
Known failure modes: very short text, and resume-style phrasing like "seeking a position" can be confused with job posts.
Usage — Transformers
from transformers import pipeline
clf = pipeline(
"text-classification",
model="smr123/resume-job-classifier",
top_k=None,
)
result = clf("We are hiring a Senior Software Engineer with Python experience.")
print(result)
# [{'label': 'job_post', 'score': 0.59}, ...]Usage — ONNX INT8 (CPU)
Primary deployment artifact: onnx/model_int8.onnx (~34 MB).
import numpy as np
from transformers import AutoTokenizer
from optimum.onnxruntime import ORTModelForSequenceClassification
model = ORTModelForSequenceClassification.from_pretrained(
"smr123/resume-job-classifier",
subfolder="onnx",
file_name="model_int8.onnx",
)
tokenizer = AutoTokenizer.from_pretrained("smr123/resume-job-classifier")
text = "Senior Engineer at Acme Corp. Built APIs with Python and Go."
inputs = tokenizer(
text,
return_tensors="pt",
truncation=True,
padding="max_length",
max_length=512,
)
logits = model(**inputs).logits[0].numpy()
probs = np.exp(logits - logits.max())
probs /= probs.sum()
label = model.config.id2label[str(int(probs.argmax()))]
print(label, float(probs.max()))Intended use
- Document routing in hiring/recruiting pipelines
- Pre-filtering before resume or job parsing
- Research and fine-tuning on custom labeled data
Limitations
- Not a hiring decision tool
- Not PII extraction or validation
- Not legal or compliance screening
- Performance drops on very short or ambiguous text
Artifacts in this repo
config.json
model.safetensors # PyTorch weights (fine-tune / reproduce)
tokenizer.json
onnx/model.onnx # float32 export
onnx/model_int8.onnx # INT8 — recommended for CPU inferenceSource code
- Training, eval, and export: https://github.com/semirturgay/resume-job-classifier
- Used in production by: https://github.com/semirturgay/ai-career-os
License
Apache-2.0
