Downloads · 30 days
93
28% of all-time downloads
Misbahuddin/job-title-normalizer-e5-small
job-title-normalizer-e5-small is a sentence similarity model from Misbahuddin. Use it when you need a score for how close two texts are. It is set up for sentence-transformers. The card lists the license as mit.
The lightweight variant of job-title-normalizer-e5-base: a 118M-param sentence encoder fine-tuned to normalize messy, multilingual job titles to a canonical occupation taxonomy (ESCO + ONET), framed as retrieval over…
Downloads · 30 days
93
28% of all-time downloads
All-time downloads
332
Public
Parameters
118M
488 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors471 MB · 96%
From the Hugging Face model README
The lightweight variant of job-title-normalizer-e5-base: a 118M-param sentence encoder fine-tuned to normalize messy, multilingual job titles to a canonical occupation taxonomy (ESCO + O*NET), framed as retrieval over 4,055 canonical occupations. ~2.5× smaller and faster than the e5-base variant at a modest accuracy cost — the right choice for CPU serving and bulk backfills.
Live demo: https://job-title-normalizer-525186107937.us-central1.run.app (Cloud Run; may cold-start ~1 min)
Held-out test set of 15,248 real ESCO/O*NET titles; split by occupation (zero train/test occupation overlap, asserted at build time).
| Slice | Method | Recall@1 | Recall@5 | Recall@10 | MRR |
|---|---|---|---|---|---|
| Overall | BM25 (lexical) | 0.095 | 0.163 | 0.183 | 0.124 |
| Overall | zero-shot e5-small | 0.226 | 0.371 | 0.437 | 0.286 |
| Overall | this model | 0.367 | 0.539 | 0.601 | 0.441 |
| FR→EN | this model | 0.525 | 0.737 | 0.799 | 0.618 |
| DE→EN | this model | 0.523 | 0.745 | 0.815 | 0.619 |
BM25 scores MRR 0.034 cross-lingually; this model reaches 0.619. For the best accuracy, use the e5-base variant (overall MRR 0.463 vs 0.441).
intfloat/multilingual-e5-small (mean pooling, query:/passage: prefixes, 384-dim).MultipleNegativesRankingLoss, scale 20), wrapped in MatryoshkaLoss (dims 384/256/128/64).NoDuplicatesDataLoader. Trained on an RTX 4060 Laptop (8 GB) in ~8 min.The e5 family needs asymmetric prefixes: titles as query: …, canonical labels as
passage: …. Forgetting them silently degrades accuracy.
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim
model = SentenceTransformer("Misbahuddin/job-title-normalizer-e5-small")
canonicals = [
"passage: software developer",
"passage: data scientist",
"passage: nurse responsible for general care",
]
query = "query: Krankenpfleger" # German → English canonical
q = model.encode(query, normalize_embeddings=True)
c = model.encode(canonicals, normalize_embeddings=True)
scores = cos_sim(q, c)[0]
print(canonicals[int(scores.argmax())], float(scores.max()))
Vectors are L2-normalized (cosine == dot product) — use FAISS IndexFlatIP for production.
Matryoshka truncation to 256/128/64 dims works after re-normalizing. Calibrate an
abstention threshold: out-of-taxonomy queries return low-score nearest neighbours rather
than failing.
ONET® is a trademark of USDOL/ETA. This model was produced using ONET data but is not endorsed by USDOL/ETA. ESCO is a service of the European Commission; this model is not endorsed by the Commission.