|
|
|
import streamlit as st |
|
import docx2txt |
|
import fitz |
|
import re |
|
import nltk |
|
from collections import Counter |
|
nltk.download('punkt') |
|
|
|
|
|
def extract_text(uploaded_file): |
|
if uploaded_file.name.endswith('.pdf'): |
|
pdf_document = fitz.open(stream=uploaded_file.read(), filetype="pdf") |
|
text = "" |
|
for page in pdf_document: |
|
text += page.get_text() |
|
return text |
|
elif uploaded_file.name.endswith('.docx'): |
|
return docx2txt.process(uploaded_file) |
|
else: |
|
return None |
|
|
|
|
|
def extract_keywords(jd_text): |
|
words = nltk.word_tokenize(jd_text) |
|
words = [w.lower() for w in words if w.isalpha()] |
|
common_words = Counter(words) |
|
keywords = [word for word, freq in common_words.items() if freq >= 1] |
|
return keywords |
|
|
|
|
|
def enhance_resume(resume_text, keywords): |
|
enhanced_text = resume_text |
|
missing_keywords = [] |
|
for keyword in keywords: |
|
if keyword.lower() not in resume_text.lower(): |
|
missing_keywords.append(keyword) |
|
if missing_keywords: |
|
enhanced_text += "\n\nAdditional Skills: " + ", ".join(missing_keywords) |
|
return enhanced_text, missing_keywords |
|
|
|
|
|
st.title("JobForge - Resume Optimizer") |
|
st.write("Upload your resume and paste a job description to optimize your resume!") |
|
|
|
uploaded_resume = st.file_uploader("Upload Your Resume", type=["pdf", "docx"]) |
|
|
|
job_description = st.text_area("Paste Job Description Here") |
|
|
|
if st.button("Forge My Resume"): |
|
if uploaded_resume and job_description: |
|
with st.spinner('Forging your resume...'): |
|
resume_text = extract_text(uploaded_resume) |
|
jd_keywords = extract_keywords(job_description) |
|
enhanced_resume, missing_keywords = enhance_resume(resume_text, jd_keywords) |
|
|
|
st.subheader("Optimized Resume Preview:") |
|
st.text_area("", enhanced_resume, height=400) |
|
|
|
st.subheader("Match Score:") |
|
match_percent = (len(jd_keywords) - len(missing_keywords)) / len(jd_keywords) * 100 |
|
st.write(f"Your resume matches {match_percent:.2f}% of the job description.") |
|
|
|
st.subheader("Missing Keywords:") |
|
if missing_keywords: |
|
st.write(", ".join(missing_keywords)) |
|
else: |
|
st.success("Your resume covers all keywords!") |
|
else: |
|
st.error("Please upload a resume and paste a job description to proceed.") |
|
|