from qdrant_client import QdrantClient from ats_optimizer.data_models.resume import Resume from ats_optimizer.data_models.job_description import JobDescription # from utils.logger import logger # from ..utils.logger import logger from ats_optimizer.utils.logger import logger class ResumeAnalyzer: def __init__(self): self.client = QdrantClient(":memory:") self.client.set_model("BAAI/bge-base-en") def parse_resume(self, file_path: str) -> Resume: """Step 1: Parse resume with formatting preservation""" # Uses python-docx for Word docs, pdfminer for PDFs raw_text, formatting = FileHandler.extract_with_formatting(file_path) return Resume(raw_text, formatting) def parse_jd(self, file_path: str) -> JobDescription: """Step 2: Analyze job description""" raw_text = FileHandler.extract_text(file_path) return JobDescription(raw_text) def calculate_ats_score(self, resume: Resume, jd: JobDescription) -> dict: """Step 3: Comprehensive ATS scoring""" # Enhanced scoring with 5 factors scores = { 'keyword': self._keyword_match_score(resume, jd), 'section': self._section_completeness(resume, jd), 'vector': self._vector_similarity(resume, jd), 'experience': self._experience_match(resume, jd), 'education': self._education_match(resume, jd) } scores['overall'] = sum(w * s for w, s in [ (0.3, scores['keyword']), (0.2, scores['section']), (0.25, scores['vector']), (0.15, scores['experience']), (0.1, scores['education']) ]) return scores