SSF-MiniLM Finetuned v2 — Skill Extraction Embedding Model
A sentence-transformers model fine-tuned from all-MiniLM-L6-v2 for matching job description sentences to standardized skills from Singapore's SkillsFuture Framework (SSF).
The model maps sentences and skill names into a 384-dimensional dense vector space where job description text lands close to its corresponding skill, enabling accurate semantic skill extraction, tagging, and retrieval.
Highlights
AUC 0.995 on held-out validation (up from 0.978 baseline)
97.1% best accuracy on skill-sentence matching (up from 92.8% baseline)
Covers 2,196 unique skills across all SSF sectors
Fast inference: 22M params, runs efficiently on CPU and GPU
Drop-in replacement for all-MiniLM-L6-v2 — same API, better skill matching
The model learns to maximize cosine similarity between a JD sentence and its correct skill, while minimizing similarity to randomly-sampled incorrect skills. This contrastive setup produces well-separated embeddings.
Embeddings encoded with normalize_embeddings=True. Cosine similarity computed as dot product of normalized vectors.
Model
AUC
Acc @ 0.5
Best Accuracy
Pos Mean Sim
Neg Mean Sim
all-MiniLM-L6-v2 (baseline)
0.978
0.810
0.928
0.530
0.133
SSF-MiniLM v1 (1 epoch)
0.989
0.949
0.952
0.799
0.131
SSF-MiniLM v2 (5 epochs)
0.995
0.968
0.971
0.845
0.088
Key Observations
AUC improved from 0.978 to 0.995 — the model almost perfectly ranks correct skills above incorrect ones
Positive similarity increased from 0.530 to 0.845 — correct pairs are now strongly matched
Negative similarity dropped from 0.133 to 0.088 — incorrect pairs are pushed further apart
Best accuracy improved from 92.8% to 97.1% — +4.3% absolute improvement over baseline
Accuracy @ 0.5 jumped from 81.0% to 96.8% — the default threshold works well out of the box
Metrics Explained
AUC: Measures ranking quality — how often the model scores positive pairs above negative pairs (1.0 = perfect ranking)
Accuracy @ 0.5: Classification accuracy using cosine similarity threshold of 0.5
Best Accuracy: Best accuracy found by scanning thresholds from 1st–99th percentile of scores
Pos/Neg Mean Similarity: Average cosine similarity for correct vs incorrect skill pairs
Performance Summary
Strengths
Excellent skill discrimination (AUC 0.995) across 2,196 diverse skills
Strong positive/negative separation (0.845 vs 0.088 mean similarity)
Works well with the default 0.5 threshold — no tuning needed for most applications
Small model footprint (~87MB) enables fast CPU inference
Covers a comprehensive range of workforce skills: IT, healthcare, engineering, finance, creative, trades, and more
Weaknesses
Optimized for SkillsFuture Framework skills — may underperform on skills not in the SSF taxonomy
Trained on synthetic JD sentences — real-world JDs with unusual formatting or jargon may need additional fine-tuning
Short text bias — best with single sentences or phrases; long paragraphs should be split into sentences first
English only
Limitations
Domain specificity: The model is fine-tuned on Singapore's SkillsFuture Framework. Skills from other taxonomies (O*NET, ESCO, ISCO) may not match as precisely without further adaptation.
Synthetic training data: JD-style sentences were generated by an LLM (Qwen3-1.7B), which may not capture all real-world phrasing variations.
No cross-lingual support: English only. Multilingual JDs will need translation first.
Short text focus: Designed for sentence-level matching. For multi-paragraph JDs, split into sentences before encoding.
Skill taxonomy coverage: Limited to the 2,196 skills in the SSF dataset. New or niche skills outside this taxonomy will fall back to base model behavior.
Ethical Considerations
Bias: The SSF taxonomy reflects Singapore's workforce structure. Skills from underrepresented or emerging fields may have fewer training examples.
Fairness: The model matches text to skills — it does not evaluate candidates. Applications should ensure skill matching does not introduce hiring bias.
Responsible use: This model is a tool for structuring skill data, not for making automated hiring decisions. Always include human review in high-stakes HR workflows.
Data provenance: Training data is synthetically generated. No personal or proprietary job description data was used in training.
Usage
Quick Start (Sentence Transformers)
pip install -U sentence-transformers
python
1from sentence_transformers import SentenceTransformer
23# Load the model4model = SentenceTransformer("imocha-ai-org/ssf-miniLM-finetuned-v2")56# Encode job description sentences and skills7sentences =[8"Design and implement scalable data pipelines for real-time analytics.",9"Manage patient records and ensure compliance with healthcare regulations.",10]11skills =[12"Data Engineering",13"Healthcare Records Management",14"Polymer Processing",15]1617sentence_embeddings = model.encode(sentences, normalize_embeddings=True)18skill_embeddings = model.encode(skills, normalize_embeddings=True)1920# Compute similarity (dot product of normalized vectors = cosine similarity)21import numpy as np
22similarities = np.dot(sentence_embeddings, skill_embeddings.T)23print(similarities)24# sentence 0 -> "Data Engineering" = high score25# sentence 1 -> "Healthcare Records Management" = high score
Skill Extraction Pipeline
python
1from sentence_transformers import SentenceTransformer
2import numpy as np
34model = SentenceTransformer("imocha-ai-org/ssf-miniLM-finetuned-v2")56# Your skill taxonomy (or load from SSF dataset)7skills =["Data Engineering","Machine Learning","Project Management","Cloud Computing"]8skill_embeddings = model.encode(skills, normalize_embeddings=True)910# Extract skills from a JD sentence11jd_sentence ="Build and deploy ML models on AWS with CI/CD pipelines."12jd_embedding = model.encode([jd_sentence], normalize_embeddings=True)1314scores = np.dot(jd_embedding, skill_embeddings.T)[0]15threshold =0.51617for skill, score insorted(zip(skills, scores), key=lambda x:-x[1]):18if score >= threshold:19print(f" {skill}: {score:.3f}")
1@inproceedings{reimers-2019-sentence-bert,
2 title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
3 author = "Reimers, Nils and Gurevych, Iryna",
4 booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
5 month = "11",
6 year = "2019",
7 publisher = "Association for Computational Linguistics",
8 url = "https://arxiv.org/abs/1908.10084",
9}