File size: 2,694 Bytes
5ba68ca
df7b6ac
 
 
 
 
5ba68ca
8f69556
 
 
 
 
 
 
 
 
 
 
 
 
5ba68ca
8f69556
 
 
 
 
 
 
 
 
5ba68ca
8f69556
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5ba68ca
 
8f69556
 
 
 
 
 
 
 
 
 
 
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# IMPORT FIX: Handle huggingface_hub compatibility
import sys
if "huggingface_hub" in sys.modules:
    sys.modules.pop("huggingface_hub")
    import huggingface_hub
    sys.modules["huggingface_hub"] = huggingface_hub

import gradio as gr
import json
import numpy as np
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import pdfplumber
from utils import extract_skills, clean_text

# Load job roles data
with open('job_roles.json') as f:
    job_roles = json.load(f)

# Load Sentence-BERT model
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')

# Precompute job role embeddings
role_descriptions = [f"{role['title']}: {role['description']} Skills: {', '.join(role['skills'])}" 
                     for role in job_roles]
role_embeddings = model.encode(role_descriptions)

def analyze_resume(resume_file):
    # Extract text from PDF
    text = ""
    with pdfplumber.open(resume_file) as pdf:
        for page in pdf.pages:
            text += page.extract_text()
    
    if not text:
        return "Error: Could not extract text from PDF"
    
    cleaned_text = clean_text(text)
    
    # Get resume embedding
    resume_embedding = model.encode([cleaned_text])[0]
    
    # Calculate similarities
    similarities = cosine_similarity([resume_embedding], role_embeddings)[0]
    top_indices = np.argsort(similarities)[-3:][::-1]
    
    # Prepare results
    results = []
    for idx in top_indices:
        role = job_roles[idx]
        resume_skills = extract_skills(cleaned_text)
        required_skills = role['skills']
        matching_skills = list(set(resume_skills) & set(required_skills))
        missing_skills = list(set(required_skills) - set(resume_skills))
        
        results.append({
            "title": role['title'],
            "description": role['description'],
            "matching_skills": matching_skills,
            "missing_skills": missing_skills,
            "similarity": f"{similarities[idx]:.2f}"
        })
    
    return results

# Gradio interface
with gr.Blocks(title="Career Path Recommender") as demo:
    gr.Markdown("# 🚀 Career Path Recommender")
    gr.Markdown("Upload your resume to discover your top 3 career matches with skill gap analysis")
    
    with gr.Row():
        # FIXED: Changed type to 'filepath'
        resume_input = gr.File(label="Upload Resume (PDF)", type="filepath")
        output = gr.JSON(label="Recommended Career Paths")
    
    submit_btn = gr.Button("Analyze Resume")
    submit_btn.click(
        fn=analyze_resume,
        inputs=resume_input,
        outputs=output
    )

if __name__ == "__main__":
    demo.launch()