hr_scoring / services /scoring.py
mahmodGendy's picture
Upload 12 files
ef416ef verified
from sentence_transformers import util
from models.similarity_model import model
from database.job_titles import get_job_requirements
import re
from datetime import datetime
def compute_similarity(resume_text, job_title):
emb1 = model.encode(resume_text, convert_to_tensor=True)
emb2 = model.encode(job_title, convert_to_tensor=True)
score = util.cos_sim(emb1, emb2)
return float(score)
def skill_score(resume_text, job_title):
data = get_job_requirements(job_title)
if not data:
return 0
required = data["required_skills"]
resume_lower = resume_text.lower()
found = 0
for skill in required:
if skill.lower() in resume_lower:
found += 1
return found / len(required) if required else 0
def preferred_skill_score(resume_text, job_title):
data = get_job_requirements(job_title)
if not data:
return 0
preferred = data.get("preferred_skills", [])
resume_lower = resume_text.lower()
found = 0
for skill in preferred:
if skill.lower() in resume_lower:
found += 1
return found / len(preferred) if preferred else 0
def extract_years_of_experience(text):
text_lower = text.lower()
m = re.search(r"(\d{1,2})\s*\+?\s*(years|yrs)", text_lower)
if m:
return int(m.group(1))
m = re.search(r"(19|20)\d{2}", text_lower)
if m:
year = int(m.group(0))
return max(0, datetime.now().year - year)
return 0
def experience_score(resume_text, job_title):
data = get_job_requirements(job_title)
if not data:
return 0
years = extract_years_of_experience(resume_text)
min_exp = data["min_experience"]
pref_exp = data["preferred_experience"]
if years >= pref_exp:
return 1
if years >= min_exp:
return 0.7
if years > 0:
return 0.4
return 0
def education_score(resume_text):
t = resume_text.lower()
if "phd" in t or "doctorate" in t:
return 1.0
if "master" in t:
return 0.8
if "bachelor" in t:
return 0.6
return 0.3
def final_score(resume_text, job_title):
data = get_job_requirements(job_title)
if not data:
return {"decision": "REJECT", "final_score": 0}
weights = data["weight_adjustments"]
sim = compute_similarity(resume_text, job_title)
skill = skill_score(resume_text, job_title)
pref = preferred_skill_score(resume_text, job_title)
exp = experience_score(resume_text, job_title)
edu = education_score(resume_text)
score = (
sim * weights["similarity"]
+ skill * weights["skills"]
+ exp * weights["experience"]
+ edu * weights["education"]
)
score += pref * 0.05
score = min(score, 1)
decision = "ACCEPT" if score >= 0.6 else "REJECT"
return {
"decision": decision,
"final_score": round(score, 3),
"similarity": round(sim, 3),
"skill_score": round(skill, 3),
"preferred_bonus": round(pref, 3),
"experience_score": round(exp, 3),
"education_score": round(edu, 3),
}