Spaces:
Running
Running
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 |