CoolFace
Modelpublic

smr123/resume-job-classifier

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
0likes16downloads
Model Card

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

LabelDescription
resumeCVs, experience blocks, skills lists
job_postJob descriptions, role requirements, hiring posts
otherEverything else (bios, emails, blog posts, product copy, etc.)

Model details

Base modelmicrosoft/MiniLM-L12-H384-uncased
TrainingFull fine-tune on ~1,389 labeled examples
Max length512 tokens
Versionv1.0.0

Evaluation (test split, n=140)

MetricValue
Accuracy95.0%
Macro-F10.95
ClassPrecisionRecallF1
resume1.000.930.96
job_post0.880.950.92
other0.941.000.97

Known failure modes: very short text, and resume-style phrasing like "seeking a position" can be confused with job posts.

Usage — Transformers

python
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).

python
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 inference

Source 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