Spaces:
Sleeping
Sleeping
| # 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() |