import streamlit as st import fitz # PyMuPDF for PDF extraction import pandas as pd import torch from sentence_transformers import SentenceTransformer from model import JobRecommendationSystem # ----------------- PAGE CONFIG (must be FIRST) ----------------- st.set_page_config(page_title="AI Job Recommender", page_icon="💼", layout="wide") # ----------------- CACHE HEAVY STUFF ----------------- @st.cache_resource def load_model(): """Load and quantize the SentenceTransformer model once""" try: model = SentenceTransformer("./paraphrase-MiniLM-L6-v2", device="cpu") # local except Exception: model = SentenceTransformer("sentence-transformers/paraphrase-MiniLM-L6-v2", device="cpu") # fallback return torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8) @st.cache_resource def load_recommender(): """Load recommender system once with cached embeddings""" return JobRecommendationSystem("JobsFE.csv") MODEL = load_model() recommender = load_recommender() # ----------------- STREAMLIT UI ----------------- st.markdown( """ """, unsafe_allow_html=True ) st.title("💼 AI-Powered Job Recommendation System") st.write("📄 Upload your resume as a **PDF file** and get tailored job recommendations with direct apply links.") # ----------------- FILE UPLOADER ----------------- uploaded_file = st.file_uploader("Upload your resume (PDF only)", type=["pdf"], help="Only PDF resumes are supported.") def extract_text_from_pdf(pdf_file): """Extract text from uploaded PDF resume""" doc = fitz.open(stream=pdf_file.read(), filetype="pdf") text = "\n".join([page.get_text("text") for page in doc]) return text.strip() resume_text = "" if uploaded_file: with st.spinner("⏳ Extracting text from your resume..."): resume_text = extract_text_from_pdf(uploaded_file) # ----------------- JOB RECOMMENDATIONS ----------------- if st.button("🔍 Recommend Jobs"): if resume_text: with st.spinner("🤖 Analyzing your resume and finding best matches..."): job_results = recommender.recommend_jobs(resume_text, top_n=20) st.success(f"✅ Found {len(job_results)} job recommendations for you!") for i, job in enumerate(job_results, start=1): with st.container(): st.markdown('