Project Record
Skill Graph & Profession Inference
Hard-skill extraction from CVs, skill-relationship graph, and profession inference via balanced vector matching.
Executive Summary
Quant hiring teams often receive CVs that list tools and projects but never state the role a candidate is best suited for. A senior engineer with Python, SQL, and Airflow on their CV may never write “Data Engineer,” yet their profile strongly suggests it. I built a system that reads hard skills from CVs, maps them through a skill relationship graph, and infers suitable professions without relying on self-reported job titles.
The approach also handles a common fairness problem: candidates who list fewer skills look like better matches under naive scoring, even when experienced generalists have broader but equally relevant backgrounds. The system balances precision and recall using an F1-style score and gives partial credit for related skills in a relationship graph.
Skill terms are weighted with TF-IDF so common buzzwords do not overpower discriminative tools, and cosine and F1 matching operate on those weighted vectors.
This demonstrates feature extraction from unstructured documents, graph-based matching, vector similarity, and interpretable scoring for recruitment workflows.
Problem
We need to (1) extract a structured hard-skill profile from unstructured CV text, (2) handle CVs with very different numbers of listed skills without biasing toward specialists, and (3) infer profession fit when role titles are missing or misleading. A naive match ratio penalizes experienced generalists: three matching skills out of ten reads worse than three out of five, even when the broader profile may be stronger.
Model
Let be the skill vocabulary extracted from a CV. Represent each candidate as
where is the TF-IDF weight of skill in the candidate CV relative to a hard-skill corpus:
Each profession has a prototype vector derived from successful employees in that role, also TF-IDF-weighted. Cosine similarity and F1 matching operate on these vectors (and graph-smoothed variants below).
Profession suitability uses cosine similarity on TF-IDF-weighted vectors:
The predicted profession is
Balanced role matching addresses the specialist–generalist trade-off. Define
and use an F1-style harmonic mean:
This rewards coverage of required skills while avoiding excessive penalty for broader backgrounds.
Skill relationship graph. Skills are not independent. Define where vertices are skills and edges encode co-occurrence or taxonomy relationships (e.g. Python–Pandas–NumPy). Candidates receive partial credit for neighbouring skills:
where controls graph smoothing and is the edge weight. This reduces sparsity when CVs describe experience differently from the target job description.
Implementation
- CV parsing: bag-of-skills extraction with TF-IDF weighting against a custom hard-skill library (tools, languages, frameworks, domains).
- Skill graph: relationship database allowing substitution and partial credit when a listed skill is adjacent to a required one.
- Profession prototypes: built from historical hires or role templates.
- Scoring: TF-IDF-weighted cosine similarity for profession inference; TF-IDF vectors with F1-style balance for role–candidate hard-skill fit.
- Output: ranked profession hypotheses and per-skill contribution breakdown for recruiter review.
Trade-offs
Cosine similarity is robust for sparse vectors but sensitive to vocabulary coverage. TF-IDF depends on corpus quality—stale or narrow corpora can mis-rank emerging tools; graph smoothing partially offsets sparsity. The skill graph requires maintenance as tools evolve. F1 balancing improves fairness between specialists and generalists but still depends on how completely the CV lists skills—senior candidates with minimal CVs may need graph smoothing or manual override. The model is interpretable: recruiters can inspect which skills and graph neighbours drove the score.