File size: 3,576 Bytes
3dde54d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
VALID_ROLES = [
    "Frontend Developer",
    "Backend Developer",
    "Full Stack Developer",
    "AI/ML Engineer",
    "Data Scientist",
    "Data Analyst",
    "Data Engineer",
    "Unknown",
]

VALID_LEVELS = [
    "Fresh",
    "Junior",
    "Senior",
]

ROLE_KEYWORDS = {
    "Frontend Developer": [
        "frontend",
        "front-end",
        "react",
        "next.js",
        "nextjs",
        "vue",
        "angular",
        "javascript",
        "typescript",
        "html",
        "css",
    ],
    "Backend Developer": [
        "backend",
        "back-end",
        "api",
        "node.js",
        "nodejs",
        "express",
        "fastapi",
        "django",
        "flask",
        "spring",
        "laravel",
        "postgresql",
        "mysql",
    ],
    "Full Stack Developer": [
        "full stack",
        "fullstack",
        "mern",
        "mean",
        "react",
        "node.js",
        "express",
        "mongodb",
    ],
    "AI/ML Engineer": [
        "machine learning",
        "ml engineer",
        "artificial intelligence",
        "ai engineer",
        "deep learning",
        "tensorflow",
        "pytorch",
        "llm",
        "nlp",
        "computer vision",
    ],
    "Data Scientist": [
        "data scientist",
        "predictive modeling",
        "feature engineering",
        "statistics",
        "scikit-learn",
    ],
    "Data Analyst": [
        "data analyst",
        "power bi",
        "tableau",
        "excel",
        "dashboard",
        "reporting",
        "sql",
    ],
    "Data Engineer": [
        "data engineer",
        "etl",
        "elt",
        "data pipeline",
        "airflow",
        "spark",
        "hadoop",
        "warehouse",
    ],
}


def map_role(raw_role):
    """

    Map extracted role text into one of supported system roles.

    """

    if not raw_role:
        return "Unknown"

    role = str(raw_role).lower()

    for canonical_role, keywords in ROLE_KEYWORDS.items():
        if any(keyword in role for keyword in keywords):
            return canonical_role

    return "Unknown"


def infer_role_from_skills(skills, current_role=""):
    """

    Infer the most likely supported role from title and detected skills.

    """

    mapped_role = map_role(current_role)
    if mapped_role != "Unknown":
        return mapped_role

    if not isinstance(skills, list):
        return "Unknown"

    skill_text = " ".join(str(skill).lower() for skill in skills)
    scores = {role: 0 for role in ROLE_KEYWORDS}

    for role, keywords in ROLE_KEYWORDS.items():
        for keyword in keywords:
            if keyword in skill_text:
                scores[role] += 1

    best_role = max(scores, key=scores.get)
    return best_role if scores[best_role] > 0 else "Unknown"


def normalize_level(level, years_of_experience=0):
    """

    Normalize the experience level to supported buckets.

    """

    if isinstance(level, str):
        lowered = level.strip().lower()

        if lowered in {"fresh", "fresher", "intern", "entry", "entry-level"}:
            return "Fresh"
        if lowered in {"junior", "jr", "mid", "associate"}:
            return "Junior"
        if lowered in {"senior", "sr", "lead", "principal"}:
            return "Senior"

    if years_of_experience >= 3:
        return "Senior"
    if years_of_experience >= 1:
        return "Junior"
    return "Fresh"