SkillSync.htm

SkillSync

Python, NLP, ML, Flask

View project →

SkillSync is technically a web app, but the meat of the project is the NLP pipeline which sits behind it. For this project, I was responsible for building out the NLP pipeline which scores a candidate's resume against a series of job descriptions, and computes an interpretable match score to guide users towards job openings for which they are strong matches. The pipeline operated on three major axes: skill matching, education coverage, and semantic similarity.

Skills matching, the most difficult of the three, relied on a GLiNER transformer model to perform zero-shot named entity recognition (NER) alongside a deterministic skills library sourced from O*NET and ESCO. Resumes and job descriptions would first be checked for exact matches against the deterministic library, followed by a GLiNER inference pass and some fuzzy semantic matching. This way, we built a catalogue of skills for both the user and each job posting, and could develop a scoring function scaled from 0-1 using a shifted sigmoid.

Semantic matching is performed using a sliding window of 30 tokens, with a stride of 10. Each of these windows was then embedded (a proxy for sentences or bullet points) and compared to a job listing. Each job embedding window is matched with its most similar resume window, and the mean cosine similarities of these windows with their best resume matches are passed through an empirically fit normal CDF to compute a match score from 0-1.

Finally, education coverage was simply computed using some elaborate regex matching. While certainly the least elaborate of the three, it proved relatively robust under testing.

The final score was computed as a convex combination of these three axes. I.e. \(0.45 \cdot \text{Skill Coverage} + 0.45 \cdot \text{Semantic Similarity} + 0.1 \cdot \text{Education Coverage}\). For more details, please check out our final report, and our intersections poster.