← Atlas

Project Record

Skill Graph & Profession Inference

Hard-skill extraction from CVs, skill-relationship graph, and profession inference via balanced vector matching.

Domains
HiringQuant Recruiting
Capability
Scoring & Decision Models
Methods
Vector MatchingGraph MatchingScoringTf Idf

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 S={s1,s2,,sn}S = \{s_1, s_2, \ldots, s_n\} be the skill vocabulary extracted from a CV. Represent each candidate as

x=(w1,w2,,wn)x = (w_1, w_2, \ldots, w_n)

where wiw_i is the TF-IDF weight of skill sis_i in the candidate CV relative to a hard-skill corpus:

wi=tf(si,doc)idf(si,corpus)w_i = \text{tf}(s_i, \text{doc}) \cdot \text{idf}(s_i, \text{corpus})

Each profession pp has a prototype vector vpv_p derived from successful employees in that role, also TF-IDF-weighted. Cosine similarity and F1 matching operate on these vectors (and graph-smoothed variants wiw_i' below).

Profession suitability uses cosine similarity on TF-IDF-weighted vectors:

Score(p,x)=xvpxvp\text{Score}(p, x) = \frac{x \cdot v_p}{\|x\| \, \|v_p\|}

The predicted profession is

p^=argmaxpScore(p,x)\hat{p} = \arg\max_p \text{Score}(p, x)

Balanced role matching addresses the specialist–generalist trade-off. Define

Precision=Matched SkillsCandidate Skills,Recall=Matched SkillsRequired Skills\text{Precision} = \frac{|\text{Matched Skills}|}{|\text{Candidate Skills}|}, \quad \text{Recall} = \frac{|\text{Matched Skills}|}{|\text{Required Skills}|}

and use an F1-style harmonic mean:

F1=2PrecisionRecallPrecision+RecallF_1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}

This rewards coverage of required skills while avoiding excessive penalty for broader backgrounds.

Skill relationship graph. Skills are not independent. Define G=(V,E)G = (V, E) where vertices are skills and edges encode co-occurrence or taxonomy relationships (e.g. Python–Pandas–NumPy). Candidates receive partial credit for neighbouring skills:

wi=wi+λ(i,j)Ewjαijw_i' = w_i + \lambda \sum_{(i,j) \in E} w_j \cdot \alpha_{ij}

where λ\lambda controls graph smoothing and αij\alpha_{ij} is the edge weight. This reduces sparsity when CVs describe experience differently from the target job description.

Implementation

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.

Related Work