Spaces:
Runtime error
Runtime error
| 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), | |
| } |