Spaces:
Sleeping
Sleeping
| from dotenv import load_dotenv | |
| import base64 | |
| import streamlit as st | |
| import os | |
| import io | |
| import PyPDF2 as pdf | |
| import json | |
| import google.generativeai as genai | |
| # Load environment variables | |
| load_dotenv() | |
| # Configure Google Generative AI | |
| genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) | |
| def get_missing_keywords(resume_text, jd_text): | |
| # Tokenize the job description text | |
| jd_keywords = set(jd_text.lower().split()) | |
| # Tokenize the resume text | |
| resume_keywords = set(resume_text.lower().split()) | |
| # Identify missing keywords from JD in the resume | |
| missing_keywords = jd_keywords - resume_keywords | |
| return list(missing_keywords) | |
| def summarize_job_description(jd_text): | |
| # Split job description into sentences | |
| sentences = jd_text.split('.') | |
| # Take the first few sentences as the summary | |
| summary = '. '.join(sentences[:3]) # Change the number to adjust summary length | |
| return summary | |
| def get_gemini_repsonse(resume_text, jd_text, option): | |
| input_prompt = f""" | |
| Hey Act Like a skilled or very experienced ATS (Application Tracking System) | |
| with a deep understanding of the tech field, software engineering, data science, | |
| data analysis, and big data engineering. Your task is to evaluate the resume based | |
| on the given job description. You must consider the job market is very competitive | |
| and you should provide the best assistance for improving the resumes. | |
| Assign the percentage Matching based on JD and the missing keywords with high accuracy. | |
| resume:{resume_text} | |
| description:{jd_text} | |
| option:{option} | |
| I want the response in one single string having the structure | |
| {{"JD Match":"%","MissingKeywords":[],"Profile Summary":""}} | |
| """ | |
| model = genai.GenerativeModel('gemini-pro') | |
| response = model.generate_content(input_prompt) | |
| parsed_response = json.loads(response.text) | |
| if option == "Review Resume": | |
| return resume_text | |
| elif option == "%age Match": | |
| return f"The resume matches the job description by {parsed_response['JD Match']}." | |
| elif option == "Missing Elements": | |
| missing_elements = get_missing_keywords(resume_text, jd_text) | |
| if missing_elements: | |
| return f"The following elements are missing in the resume as required in the job description: {', '.join(missing_elements)}" | |
| else: | |
| return "All required elements are present in the resume." | |
| elif option == "Summarize JD": | |
| return summarize_job_description(jd_text) | |
| def input_pdf_text(uploaded_file): | |
| reader = pdf.PdfReader(uploaded_file) | |
| text = "" | |
| for page in reader.pages: | |
| text += page.extract_text() | |
| return text | |
| # Set background color and padding | |
| st.markdown( | |
| """ | |
| <style> | |
| body { | |
| background-color: #add8e6; /* Light blue background */ | |
| color: #333333; | |
| font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; | |
| } | |
| .stButton button { | |
| border-radius: 25px; /* Rounded border for buttons */ | |
| width: 150px; | |
| padding: 10px 20px; | |
| border: none; | |
| cursor: pointer; | |
| transition: all 0.3s ease; | |
| background-color: #add8e6; /* Light blue color for buttons */ | |
| color: white; | |
| } | |
| .stButton button:hover { | |
| background-color: #87ceeb; /* Darker blue color on hover */ | |
| } | |
| .radio-button-container .css-hgdyqz { | |
| display: flex; | |
| flex-direction: row; | |
| } | |
| .radio-button-container .css-17e50e2 label { | |
| margin-right: 20px; | |
| } | |
| .footer { | |
| background-color: #add8e6; /* Light blue color */ | |
| color: white; | |
| padding: 20px; | |
| text-align: center; | |
| border-radius: 10px; | |
| } | |
| .footer a { | |
| color: white; | |
| text-decoration: none; | |
| margin: 0 10px; | |
| } | |
| .line { | |
| width: 100%; | |
| margin-top: 10px; | |
| border-top: 1px solid white; | |
| } | |
| .powered-by { | |
| margin-top: 20px; | |
| font-size: 14px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .powered-by img { | |
| width: 20px; | |
| height: 20px; | |
| margin-right: 5px; | |
| } | |
| .title { | |
| font-size: 36px; /* Increased font size */ | |
| padding: 20px; | |
| border-radius: 15px; | |
| background-color: #add8e6; /* Light blue color for title */ | |
| color: white; | |
| text-align: center; | |
| text-shadow: 2px 2px #333333; /* Adding text shadow effect */ | |
| } | |
| .job-description { | |
| border-radius: 15px; | |
| padding: 20px; | |
| background-color: #ffffff; /* White color for job description */ | |
| margin-bottom: 20px; | |
| } | |
| .upload-resume { | |
| border-radius: 15px; | |
| padding: 20px; | |
| background-color: #ffffff; /* White color for resume upload */ | |
| } | |
| .image-container { | |
| margin-top: 20px; /* Added margin to create a gap */ | |
| text-align: center; | |
| } | |
| .image-container img { | |
| margin-bottom: 20px; /* Added margin below the image */ | |
| } | |
| .bright-text { | |
| font-weight: bold; /* Make text bold */ | |
| color: #ff5733; /* Make text colorful */ | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| # Image Container with Gap | |
| st.markdown("<div class='image-container'><img src='https://media.geeksforgeeks.org/wp-content/uploads/20240108181204/Top-10-AI-Resume-Assessment-Tools-copy.webp' style='max-width: 100%;'></div>", unsafe_allow_html=True) | |
| # Job Description Input | |
| st.markdown("---") | |
| st.subheader("Job Description") | |
| jd = st.text_area("Paste the Job Description", height=100) | |
| uploaded_file = st.file_uploader("Upload Your Resume (PDF)", type="pdf", help="Please upload the PDF file of your resume.") | |
| # Options Selection | |
| st.markdown("---") | |
| st.subheader("Select Option") | |
| options = ["Review Resume", | |
| "%age Match", | |
| "Missing Elements", | |
| "Summarize JD"] | |
| selected_option = st.radio("", options, index=0) | |
| # Analyze Button | |
| st.markdown("---") | |
| if st.button("Analyze", key="analyze_button"): # Key added to the button to change color on each click | |
| if uploaded_file is not None and jd != "": | |
| resume_text = input_pdf_text(uploaded_file) | |
| response = get_gemini_repsonse(resume_text, jd, selected_option) | |
| st.subheader(response) | |
| if selected_option == "Review Resume": | |
| st.markdown("---") | |
| st.subheader("Resume Preview:") | |
| st.write(resume_text) # Display processed resume text | |
| else: | |
| st.warning("Please upload the resume and paste the job description before submitting.") | |
| # Footer | |
| # Image URL | |
| image_url = "https://cdn.pixabay.com/photo/2023/08/15/14/05/banner-8192025_960_720.png" | |
| # Image HTML | |
| image_html = f'<img src="{image_url}" style="max-width: 100%; border-radius: 10px;">' | |
| # Footer with Image and Light Blue Color | |
| footer_with_image_light_blue = f""" | |
| <div class="footer"> <!-- Light blue background color --> | |
| <div class="image-container">{image_html}</div> <!-- Moved the image to the footer --> | |
| <div class="line"></div> | |
| <div class="connect-text bright-text">Connect with me at</div> <!-- Added Connect with me text with bright color --> | |
| <a href="https://github.com/FasilHameed" target="_blank"><img src="https://img.icons8.com/plasticine/30/000000/github.png" alt="GitHub"></a> | |
| <a href="https://www.linkedin.com/in/faisal--hameed/" target="_blank"><img src="https://img.icons8.com/plasticine/30/000000/linkedin.png" alt="LinkedIn"></a> | |
| <a href="tel:+917006862681"><img src="https://img.icons8.com/plasticine/30/000000/phone.png" alt="Phone"></a> | |
| <a href="mailto:faisalhameed763@gmail.com"><img src="https://img.icons8.com/plasticine/30/000000/gmail.png" alt="Gmail"></a> | |
| <div class="line"></div> | |
| <div class="powered-by bright-text">Powered By <img src="https://img.icons8.com/clouds/30/000000/gemini.png" alt="Gemini"> Gemini π« and Streamlit π</div> <!-- Bright color for powered by text --> | |
| </div> | |
| """ | |
| # Render Footer with Image and Light Blue Color | |
| st.markdown(footer_with_image_light_blue, unsafe_allow_html=True) | |