algotrix / resume_analyzer.py
sounnak100's picture
feat: Add Sounak's Renew System for Deep Resume Analysis
086d80e
from models import Resume, JobDescription
from typing import Dict, Any
class ResumeAnalyzer:
"""
Renew System for Judging and Analyzing Resumes Sounak
Deep heuristic-based analysis comparing candidate skills with JD requirements.
"""
@staticmethod
def analyze(resume: Resume, jd: JobDescription) -> Dict[str, Any]:
match_skills = set([s.lower() for s in resume.skills]).intersection(set([s.lower() for s in jd.required_skills]))
missing_skills = set([s.lower() for s in jd.required_skills]) - set([s.lower() for s in resume.skills])
bonus_skills = set([s.lower() for s in resume.skills]).intersection(set([s.lower() for s in jd.preferred_skills]))
# Experience Check
exp_verdict = "Adequate"
if resume.experience_years < jd.min_experience:
exp_verdict = f"Missing {jd.min_experience - resume.experience_years} years"
elif jd.max_experience and resume.experience_years > jd.max_experience:
exp_verdict = "Over-qualified"
else:
exp_verdict = "Strong Fit"
# Pros & Cons
pros = []
cons = []
if match_skills:
pros.append(f"Matches {len(match_skills)} core skills.")
if bonus_skills:
pros.append(f"Brings {len(bonus_skills)} bonus skills to the role.")
if exp_verdict == "Strong Fit":
pros.append("Experience aligns perfectly with requirements.")
if missing_skills:
cons.append(f"Missing critical tech stack: {', '.join(missing_skills)}.")
if exp_verdict.startswith("Missing"):
cons.append(f"Lacks requisite years of experience ({exp_verdict}).")
return {
"match_skills": list(match_skills),
"missing_skills": list(missing_skills),
"bonus_skills": list(bonus_skills),
"experience_verdict": exp_verdict,
"pros": pros,
"cons": cons,
"overall_judgment": "Recommended for Interview" if (len(match_skills) >= len(jd.required_skills)//2 and not exp_verdict.startswith("Missing")) else "Caution/Reject"
}
resume_analyzer = ResumeAnalyzer()