# 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()