Final RTP Report2
Final RTP Report2
i
DECLARATION
We hereby declare that this Real Time Research Project Report titled "AI-Driven Job Matching and
Recommendation Platform" is a genuine project work carried out by us, in [Link] (Computer
Science and Engineering) degree course of Jawaharlal Nehru Technology University Hyderabad, and
has not been submitted to any other course or university for the award of any degree by us.
Rayed Hasan
Abhishek Kumar Gupta
Ambati Sahiti
Sudini Abhigna Reddy
Sundaragiri Shiva Sai Abhinav
iv
DEPARTMENT OF COMPUTER SCIENCE
BHARAT INSTITUTE OF ENGINEERING AND TECHNOLOGY
(An Autonomous Institution)
Accredited by NAAC’A’ Grade, Accredited by NBA (UG Programmes: CSE, ECE)
Approved by AICTE, Affiliated to JNTUH Hyderabad
Ibrahimpatnam-501510, Hyderabad, Telangana
Certificate
This is to certify that the Real Time Research Project Report work entitled “AI-Driven Job
Matching and Recommendation Platform” is the Bonafide work done
By
RAYED HASAN (24E11A05A5)
ABHISHEK KUMAR GUPTA (24E11A05C3)
AMBATI SAHITI (24E11A05C5)
SUDINI ABHIGNA REDDY (24E11A05A7)
SUNDARAGIRI SHIVA SAI ABHINAV (24E11A05B5)
iv
ACKNOWLEDGEMENT
The satisfaction that accompanies the successful completion of the task would be put incomplete
without the mention of the people who made it possible, whose constant guidance and
encouragement crown all the efforts with success.
We avail this opportunity to express our deep sense of gratitude and hearty thanks to Shri CH.
Venugopal Reddy, Chairman of BIET, for providing congenial atmosphere and encouragement.
We would like to thank Prof. G. Kumaraswamy Rao, Director, Former Director & O.S. of DLRL
Ministry of Defence, and Mr. D. Vinay, Admin Coordinator, Mr. D. Vinay, Admin Incharge for
having provided all the facilities and support.
We would like to thank our Academic Incharge DR. VELMURUGAN P., Assistant Professor of
CSE, for their expert guidance and encouragement at various levels of Project.
We place highest regards to our Parent, our Friends and Well-wishers who helped a lot in making
the report of this project.
iv
ABSTRACT
The "AI-Driven Job Matching and Recommendation Platform" — codename Martian — is a machine
learning system that automates resume-to-job matching using Natural Language Processing (NLP)
and vector similarity techniques. The project addresses a critical gap in traditional recruitment
workflows, which rely heavily on manual screening, keyword-only filtering, and are prone to
unconscious human bias.
The system ingests resumes (PDF/TXT) and job descriptions, preprocesses them through a
standardized NLP pipeline powered by SpaCy and NLTK, extracts domain-specific technical skills
using a curated ontology of 292+ skills, and converts text into TF-IDF feature vectors using Scikit-
learn. Cosine similarity is computed between a candidate's resume vector and each job description
vector to produce an objective match score, enabling ranked job recommendations for candidates and
ranked candidate shortlists for recruiters.
The backend is implemented with Flask providing REST API endpoints, data is persisted in SQLite,
and the frontend delivers results dynamically through vanilla HTML5/CSS3/JavaScript. The system
has been functionally validated through end-to-end testing — including resume uploads, JD creation,
and similarity matching — as evidenced by live application logs from the development cycle.
Key Features:
• Automated resume parsing from PDF and TXT formats
• NLP preprocessing: tokenization, stop-word removal, lemmatization
• Skill extraction via PhraseMatcher against a 292-skill ontology
• TF-IDF vectorization with cosine similarity ranking
• Dual-mode dashboard: job recommendations for candidates and candidate shortlists for
recruiters
• REST API backend with Flask and persistent SQLite storage
Keywords: Natural Language Processing, TF-IDF, Cosine Similarity, Resume Parsing, Job Matching,
Flask, SpaCy, Scikit-learn, SQLite, Recommendation System
TABLE OF CONTENTS
Titles Page no.
Acknowledgements iii
Abstract v
Table of Contents vi
List of Figures vii
List of Symbols and Abbreviations viii
1. INTRODUCTION
1.1. Introduction to smart canteen billing system 1
1.2. Analysis and explanation of problems 2
1.3. Data Collection 3
2. RELATED WORKS
2.1. Literature Review 4
2.2. Literature Survey 5
3. MOTIVATION 6
4. OBJECTIVES
4.1. Feasibility Study 7
4.2. Study of System 8
4.3. Basic Objectives 8
4.4. Scope 9
5. PROBLEM STATEMENT
5.1. Title Justification 10
5.2. Existing System 11
5.3. Features of Proposed System 12
6. FUNCTIONAL REQUIREMENTS
6.1. Hardware Configuration 13
6.2. Software Configuration 18
7. SYSTEM DESIGN METHODOLOGY
7.1. DFD Diagrams 23
7.2. UML Diagrams 23
7.3. Database Design 23
7.4. Architecture Flow 24
8. EXPERIMENTAL STUDIES
8.1. Source Code 26
8.2. System Test Cases 28
8.3. Result Analysis 31
9. CONCLUSION AND FUTURE SCOPE 33
10. REFERENCES 35
LIST OF FIGURES
INTRODUCTION
1.1 Introduction to AI-Driven Job Matching and Recommendation Platform
The AI-Driven Job Matching and Recommendation Platform — developed under the project
codename Martian — represents a significant advancement in automating the modern recruitment
lifecycle. In today's hyper-competitive job market, both candidates and recruiters face an
overwhelming volume of data. A typical recruiter may receive hundreds of applications for a single
role, while a job seeker simultaneously faces thousands of available listings. Traditional methods
are entirely inadequate to navigate this complexity with any degree of precision or fairness.
Martian is a machine learning system that bridges this gap by analysing textual signals — skills,
experience, educational qualifications, and job requirements — to compute an objective, data-
driven match score between a candidate's resume and a set of job descriptions. The platform
operates along two parallel flows: a Candidate Flow, where a job seeker uploads a resume and
receives a ranked list of the most relevant job openings, and a Recruiter Flow, where an HR
professional or company submits a job description and receives a prioritised shortlist of matching
candidates.
At its technical core, the system implements a Natural Language Processing (NLP) pipeline using
SpaCy and NLTK to clean, tokenize, and lemmatize raw textual input. Skill entities are identified
using a PhraseMatcher loaded with a curated ontology of over 292 technical skills spanning
programming languages, frameworks, data science tools, and DevOps technologies. The cleaned
text is then vectorized using TF-IDF (Term Frequency — Inverse Document Frequency) from
Scikit-learn, and cosine similarity is used to rank results. A Flask-based REST API backend serves
all matching operations, with SQLite providing lightweight but persistent data storage.
The platform is intentionally designed as a prototype for academic demonstration under JNTUH's
R22 regulation framework, while simultaneously reflecting industrial-grade engineering
decisions: modular architecture, testable components, graceful error handling, and a clear upgrade
path toward semantic deep learning models such as BERT. The system has been validated through
a full development cycle, and live application logs confirm successful end-to-end operation from
resume upload through skill extraction, vectorization, similarity scoring, and ranked output.
9
AI-Driven Job Matching and Recommendation Platform
Resume Corpus:
A set of representative sample resumes in PDF format was assembled covering diverse technical
profiles — software developers, data analysts, frontend engineers, and data scientists. These were
processed through the system during development and validation cycles, as confirmed by the
10
AI-Driven Job Matching and Recommendation Platform
application log entries showing successful parsing of [Link] (609 chars, 10 skills),
[Link] (609 chars, 5 skills), and [Link] (617 chars, 8 skills), among others.
The Kaggle Resume Dataset (2,400+ resumes across 24 job categories) was identified as the
primary source for expanded corpus development.
Skill Ontology:
A JSON-formatted skill ontology was curated and loaded at runtime, covering 292 technical skills
built into a PhraseMatcher with 293 skill patterns. The ontology spans programming languages
(Python, Java, C++, JavaScript, SQL), ML/AI frameworks (TensorFlow, Scikit-learn, PyTorch),
web frameworks (Flask, React, [Link]), and DevOps tools (Docker, AWS, Git, Kubernetes). This
ontology directly drives the skill extraction module and is the foundation for both resume and JD
skill tagging.
11
AI-Driven Job Matching and Recommendation Platform
RELATED WORKS
2.1 Literature Review
The academic and industrial exploration of automated resume-to-job matching and
recommendation systems has evolved substantially over the past two decades, driven by advances
in information retrieval, NLP, and machine learning.
Early approaches to resume screening relied on structured data extraction — parsing fixed-format
resumes into predefined fields and applying rule-based filters. Research from the early 2000s, such
as work on the ROME (Referentiel des Metiers) ontology, established the importance of structured
skill taxonomies in matching systems. However, these approaches were brittle and failed when
resume formatting deviated from expected templates.
Research into Named Entity Recognition (NER) for skill extraction has shown that domain-
adapted models trained on professional text significantly outperform general-purpose NER. Work
by Sayfullina et al. (2018) demonstrated that a BiLSTM model trained on job posting corpora
achieved an F1 score of 0.87 for skill entity recognition. The Martian system uses SpaCy's
PhraseMatcher as a computationally efficient proxy, with a clear upgrade path to a fine-tuned NER
model once annotated training data is available.
Industry-scale systems such as LinkedIn Recruiter and Google for Jobs employ hybrid
architectures combining structured extraction, graph-based skill ontologies, and neural
embeddings. While these are far beyond the scope of an academic prototype, they confirm the
12
AI-Driven Job Matching and Recommendation Platform
Vector Space Model Prototypes: Academic projects using Scikit-learn's TF-IDF pipeline for
resume matching consistently achieve cosine similarity scores between 0.6 and 0.9 for well-
matched pairs, validating the approach. A key finding from the literature is that vocabulary size
and ngram range significantly impact match quality — particularly the inclusion of bigrams like
"machine learning" and "data analysis" to preserve multi-word skill names. The Martian TF-IDF
configuration explicitly sets ngram_range=(1,2) for this reason.
Flask-Based Prototype APIs: The Flask microframework has been widely adopted in academic
NLP prototypes for its simplicity and minimal boilerplate. Literature on Flask-based ML APIs
recommends Blueprint-based route separation for maintainability — a pattern the Martian
architecture implements through separate candidate and recruiter route modules. Survey findings
also confirm that SQLite is the standard choice for prototype-scale persistence, with PostgreSQL
identified as the natural upgrade for production.
Identified Gaps in Existing Work: The survey revealed two consistent weaknesses in existing
prototypes: first, the absence of real-time vectorizer refitting when new documents are added to
the corpus (a stale vocabulary problem); and second, poor handling of low-quality or non-standard
PDF layouts. Martian directly addresses both — implementing corpus-wide vectorizer refitting on
every document addition (confirmed in the application logs), and employing a dual-library PDF
parsing strategy (PyPDF2 with [Link] fallback) to improve robustness.
13
AI-Driven Job Matching and Recommendation Platform
MOTIVATION
The driving motivation behind the development of the Martian platform is the compounding
inefficiency and inequity embedded in the current state of recruitment — a problem that affects
millions of candidates and organisations globally, and one that technology is uniquely positioned
to solve.
14
AI-Driven Job Matching and Recommendation Platform
OBJECTIVES
4.1 Feasibility Study
Before proceeding with development, a comprehensive feasibility study was conducted to ensure
the project's viability across technical, economic, and operational dimensions.
Technical Feasibility:
The chosen stack — Python 3.10+, SpaCy 3.7+, Scikit-learn 1.4+, Flask 3.x, SQLite — is a mature,
well-documented combination with extensive community support. All components are actively
maintained, have stable APIs, and are proven in production environments. SpaCy's PhraseMatcher
provides millisecond-scale skill extraction; Scikit-learn's TF-IDF and cosine_similarity functions
are highly optimised for sparse matrix operations; Flask handles HTTP routing with minimal
overhead. The system is designed to run on standard hardware with Python 3.8+ and no GPU
requirement, making it deployable without cloud infrastructure.
The technical risk profile is low for the prototype scope. PDF parsing is the highest-risk component
due to format variability, which is mitigated by the dual-library strategy (PyPDF2 + [Link]
fallback). Vectorizer accuracy is bounded by corpus quality, which is mitigated by using a real-
world resume dataset.
Economic Feasibility:
The entire technology stack is open-source, eliminating all licensing costs. Python, Flask, SpaCy,
NLTK, Scikit-learn, Pandas, NumPy, and SQLite are all zero-cost. The system runs on standard
commodity hardware without cloud dependencies, making deployment cost effectively zero
beyond the developer's time. The return on investment — in terms of recruiter hours saved and
improved candidate-job alignment — is demonstrably positive at any scale beyond a handful of
applications.
Operational Feasibility:
The web interface is designed to be accessible to non-technical users: resume upload via a standard
file picker, JD entry via a text form, and ranked results displayed with match percentage badges.
User task completion in under 2 minutes is a stated acceptance criterion. The system requires no
training or specialised knowledge to operate, and error handling provides clear, actionable
messages for unsupported file formats or missing input.
15
AI-Driven Job Matching and Recommendation Platform
Tier 1 — Presentation Layer: The web interface is built in vanilla HTML5, CSS3, and JavaScript.
Two primary views are provided: the Candidate View (resume upload, matched jobs display) and
the Recruiter View (JD entry, ranked candidates display). Asynchronous fetch() calls communicate
with the Flask REST API, enabling dynamic result rendering without full-page reloads.
Tier 2 — Application Logic Layer: Flask orchestrates all business logic through route handlers.
The candidate route receives a resume file, passes it to the Document Parser, triggers the NLP
Preprocessing Pipeline, feeds output to the Skill Extractor, and initiates the matching service. The
recruiter route follows the symmetric flow for job descriptions. The Vectorizer and Similarity
Engine operate on the combined corpus at each matching request, with the fitted TF-IDF model
persisted to disk using joblib.
Tier 3 — Data Layer: SQLite provides persistent storage for three primary tables: resumes,
job_descriptions, and match_results. The resumes and job_descriptions tables store raw text,
cleaned text, extracted skill lists, and metadata. The match_results table caches computed
similarity scores to avoid redundant computation for repeated queries. Cache invalidation is
triggered whenever a document is modified or deleted, as confirmed by the application logs.
The NLP pipeline that runs across both flows consists of six sequential steps: text lowercasing,
SpaCy tokenization, stop-word removal (SpaCy + NLTK combined corpus), lemmatization,
punctuation filtering, and PhraseMatcher-based skill entity tagging. This pipeline is stateless, side-
effect-free, and testable in isolation.
16
AI-Driven Job Matching and Recommendation Platform
Primary Objectives:
1. Automate resume parsing and text extraction from PDF and plain-text files
1. Extract skills and experience from unstructured resume text using NLP
2. Compute similarity scores between resumes and job descriptions using TF-IDF cosine similarity
3. Provide ranked job recommendations for candidates based on match score
4. Provide ranked candidate shortlists for recruiters based on match score
5. Deliver results through a functional web application with a Flask REST API backend
Secondary Objectives:
• Reduce recruiter screening workload by 60–70% at prototype scale
• Demonstrate an end-to-end ML pipeline: data ingestion, NLP, vectorization, and ranking
• Achieve recommendation relevance with cosine similarity > 0.70 for top results
• Maintain response times under 3 seconds per matching query
• Lay the architectural groundwork for future BERT/Sentence-BERT upgrades
4.4 Scope
In Scope:
• Resume upload and parsing (PDF, TXT formats)
• Job description input via manual text entry or document upload
• NLP preprocessing pipeline (tokenisation, lemmatisation, stop-word removal)
• Skill extraction from resumes and job descriptions against a 292-skill ontology
• TF-IDF vectorisation with cosine similarity matching
• Ranked job recommendation output for candidates (top-N with match percentage)
• Ranked candidate shortlist output for recruiters (with extracted skills and scores)
• Web application prototype with Flask REST API backend
• SQLite-based persistence for corpus, match results, and candidate preferences
Out of Scope:
• Real-time job scraping from external platforms (LinkedIn, Naukri, Indeed)
• User account management, authentication, or session-based profile storage
• Deep learning models such as BERT or Sentence-BERT (deferred to Phase 2)
• Mobile application development
• Evaluation of soft skills, behavioural competencies, or cultural fit
• Automated email notifications or external integrations
17
AI-Driven Job Matching and Recommendation Platform
PROBLEM STATEMENT
5.1 Title Justification
The title "AI-Driven Job Matching and Recommendation Platform" was carefully chosen to reflect
both the technical nature and the operational intent of the system. The term "AI-Driven" is justified
by the system's use of machine learning (TF-IDF vectorisation, cosine similarity ranking) and
Natural Language Processing (tokenisation, lemmatisation, NER-based skill extraction) —
techniques that constitute applied artificial intelligence in the document understanding domain.
"Job Matching" precisely describes the core technical operation: computing a quantitative
similarity score between a resume and a job description to determine fit. This is a deterministic,
reproducible, and objective operation — a sharp contrast to the subjective, inconsistent manual
screening it replaces.
Benefit Description
Improved Matching Accuracy Algorithm-driven scoring eliminates keyword-only filtering and
reduces missed qualifications
Reduced Recruiter Workload Automated ranking replaces manual resume-by-resume review,
saving hours per vacancy
Candidate Empowerment Job seekers receive relevant, ranked recommendations instead of
blind applications
Objective Shortlisting Reproducible similarity scores reduce the influence of unconscious
bias at screening stage
Scalable Architecture Modular pipeline supports future upgrades to semantic embeddings
without full rebuild
18
AI-Driven Job Matching and Recommendation Platform
mechanism to ensure that all applications receive equal consideration, and the quality of
shortlisting depends entirely on the recruiter's domain expertise and workload state. Qualified
candidates are routinely overlooked due to resume formatting, phrasing choices, or reviewer
fatigue.
19
AI-Driven Job Matching and Recommendation Platform
20
AI-Driven Job Matching and Recommendation Platform
FUNCTIONAL REQUIREMENTS
Functional requirements define the specific capabilities the system must provide. Non-functional
requirements define the performance, reliability, and quality constraints.
21
AI-Driven Job Matching and Recommendation Platform
Accuracy Top result cosine similarity > 0.70 for relevant matches
Usability Time for new user first match < 2 minutes
Reliability System uptime (local prototype) > 99%
Maintainability Module separation Parser / NLP / Vectorizer /
Matcher / UI
Portability Platform support Windows, macOS, Linux —
Python 3.8+
22
AI-Driven Job Matching and Recommendation Platform
23
AI-Driven Job Matching and Recommendation Platform
24
AI-Driven Job Matching and Recommendation Platform
• P2.6 — Skill Entity Tagging: Run PhraseMatcher against Doc to identify and annotate
skill entities
25
AI-Driven Job Matching and Recommendation Platform
26
AI-Driven Job Matching and Recommendation Platform
Activity Diagram:
27
AI-Driven Job Matching and Recommendation Platform
Class Diagram:
Primary classes and their responsibilities:
Class Key Attributes Key Methods
DocumentParser fallback_enabled: bool extract_from_pdf(),
extract_from_txt(), parse()
NLPPreprocessor nlp: [Link], preprocess(text) -> str, tokenize(),
stop_words: set lemmatize()
SkillExtractor matcher: PhraseMatcher, extract_skills(text) -> list,
ontology: dict load_ontology()
TFIDFVectorizer model: TfidfVectorizer, fit_on_corpus(), transform(text),
vocab_size: int save(), load()
28
AI-Driven Job Matching and Recommendation Platform
29
AI-Driven Job Matching and Recommendation Platform
30
AI-Driven Job Matching and Recommendation Platform
31
AI-Driven Job Matching and Recommendation Platform
32
AI-Driven Job Matching and Recommendation Platform
EXPERIMENTAL STUDIES
8.1 Source Code
The Martian platform is implemented as a modular Python project. Key code excerpts from the
primary modules are presented below:
class NLPPreprocessor:
def __init__(self):
[Link] = [Link]('en_core_web_sm')
nltk_stops = set([Link]('english'))
spacy_stops = [Link].stop_words
self.stop_words = nltk_stops.union(spacy_stops)
class SkillExtractor:
def __init__(self, nlp, ontology_path):
with open(ontology_path) as f:
[Link] = [Link](f)
[Link] = PhraseMatcher([Link], attr='LOWER')
patterns = [nlp.make_doc(skill)
for skill in [Link]['skills']]
[Link]('SKILLS', patterns)
[Link] = nlp
33
AI-Driven Job Matching and Recommendation Platform
class TFIDFVectorizerEngine:
def __init__(self):
[Link] = TfidfVectorizer(
max_features=5000,
ngram_range=(1, 2),
min_df=2,
sublinear_tf=True
)
self.is_fitted = False
@candidate_bp.route('/upload/resume', methods=['POST'])
def upload_resume():
if 'file' not in [Link]:
return jsonify({'error': 'No file provided'}), 400
file = [Link]['file']
ext = [Link]('.', 1)[-1].lower()
if ext not in ALLOWED:
return jsonify({
'error': f'Unsupported format. Allowed: pdf, txt. Got: {ext}'
}), 400
resume_id = [Link](file)
top_n = [Link]('top_n', 10, type=int)
matches = MatchService.get_job_matches(resume_id, top_n)
return jsonify({'resume_id': resume_id, 'matches': matches})
34
AI-Driven Job Matching and Recommendation Platform
SCHEMA = '''
CREATE TABLE IF NOT EXISTS resumes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL,
raw_text TEXT,
cleaned_text TEXT,
skills TEXT,
upload_date DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS job_descriptions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
company TEXT,
raw_text TEXT,
cleaned_text TEXT,
skills TEXT,
created_date DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS match_results (
id INTEGER PRIMARY KEY AUTOINCREMENT,
resume_id INTEGER REFERENCES resumes(id),
jd_id INTEGER REFERENCES job_descriptions(id),
similarity_score REAL,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);
'''
35
AI-Driven Job Matching and Recommendation Platform
Step Input Text (excerpt) Expected Skills Actual Skills (from log) Status
1 [Link] (609 Multiple tech 10 skills extracted PASSED
chars) skills
2 [Link] (609 Multiple tech 5 skills extracted PASSED
chars) skills
3 [Link] (617 Multiple tech 8 skills extracted PASSED
chars) skills
4 JD: Data Scientist (75 ML/AI skills 7 skills extracted PASSED
chars)
36
AI-Driven Job Matching and Recommendation Platform
37
AI-Driven Job Matching and Recommendation Platform
38
AI-Driven Job Matching and Recommendation Platform
System Performance:
All matching operations in the test environment completed within the 3-second performance target.
Typical vectorization and similarity computation for the test corpus (18 documents) completed in
milliseconds, well within Flask's synchronous request-response cycle. The app initialisation time
(SpaCy model load: approximately 5 seconds) occurs once at server startup and does not impact
per-request latency.
39
AI-Driven Job Matching and Recommendation Platform
The platform has been validated through a complete development and testing cycle, with
application logs confirming correct operation of every pipeline stage: PDF and TXT parsing, NLP
preprocessing with a 401-stop-word corpus, PhraseMatcher-based skill extraction from a 292-skill
ontology, TF-IDF vectorizer refitting on corpus growth, cosine similarity computation, threshold-
based ranking, cache management, and REST API delivery. The dual-mode interface successfully
serves both candidate (job recommendation) and recruiter (candidate shortlist) use cases.
The project meets all primary functional requirements defined in the PRD and achieves its stated
secondary objectives — demonstrating a complete ML pipeline, maintaining modularity, and
providing a clear upgrade path for future enhancements.
Future Scope:
40
AI-Driven Job Matching and Recommendation Platform
41
AI-Driven Job Matching and Recommendation Platform
REFERENCES
[1] J. Devlin, M. Chang, K. Lee, and K. Toutanova, "BERT: Pre-training of Deep Bidirectional
Transformers for Language Understanding," NAACL-HLT, 2019.
[2] N. Reimers and I. Gurevych, "Sentence-BERT: Sentence Embeddings using Siamese BERT-
Networks," EMNLP-IJCNLP, 2019.
[3] L. Sayfullina, E. Malmi, and A. Kannala, "Learning representations for soft skill matching," in Proc.
International Conference on Analysis of Images, Social Networks and Texts, 2018.
[4] G. Salton and M. J. McGill, Introduction to Modern Information Retrieval, McGraw-Hill, 1983.
[5] Y. Zhang and V. W. Zheng, "Job2Vec: Job Title Benchmarking with Collective Multi-View
Representation Learning," CIKM, 2018.
[6] M. Honnibal and I. Montani, "spaCy 2: Natural language understanding with Bloom embeddings,
convolutional neural networks and incremental parsing," To appear, 2017.
[7] F. Pedregosa et al., "Scikit-learn: Machine Learning in Python," Journal of Machine Learning
Research, vol. 12, pp. 2825-2830, 2011.
[8] Bird, S., Klein, E., and Loper, E., Natural Language Processing with Python. O'Reilly Media, 2009.
[9] A. Grinberg, Flask Web Development: Developing Web Applications with Python, 2nd ed., O'Reilly
Media, 2018.
[10] E. Sweigart, Automate the Boring Stuff with Python, 2nd ed., No Starch Press, 2019.
[11] Kaggle, "Resume Dataset," [Online]. Available:
[Link] [Accessed: 2026].
[12] European Commission, "ESCO — European Skills, Competences, Qualifications and Occupations,"
[Online]. Available: [Link] [Accessed: 2026].
42