File size: 1,191 Bytes
4b63522
b86ec7b
4b63522
 
4a365d5
4b63522
b86ec7b
 
 
 
 
4a365d5
 
 
 
 
 
4b63522
 
 
 
4a365d5
 
 
 
 
4b63522
4a365d5
 
4b63522
 
 
 
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
# utils/ranker.py
import os
from sentence_transformers import SentenceTransformer, util
from .utils import extract_text_from_pdf
import PyPDF2

# Set safe cache directories for Hugging Face models (especially for read-only environments like Hugging Face Spaces)
os.environ["HF_HOME"] = "/tmp/hf"
os.environ["TRANSFORMERS_CACHE"] = "/tmp/hf"
os.environ["SENTENCE_TRANSFORMERS_HOME"] = "/tmp/hf"


model = SentenceTransformer('all-MiniLM-L6-v2')

def extract_text_from_pdf(file_storage):
    reader = PyPDF2.PdfReader(file_storage)
    return " ".join([page.extract_text() or '' for page in reader.pages])

def rank_resumes_by_semantic_similarity(resume_files, job_description):
    job_embedding = model.encode(job_description, convert_to_tensor=True)
    results = []

    for resume_file in resume_files:
        text = extract_text_from_pdf(resume_file)
        resume_embedding = model.encode(text, convert_to_tensor=True)
        score = util.cos_sim(job_embedding, resume_embedding).item()
        results.append({
            "filename": resume_file.filename,
            "score": round(score, 4)
        })

    results.sort(key=lambda x: x['score'], reverse=True)
    return results