File size: 1,756 Bytes
5dec17e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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