# import packages
import streamlit as st
import os
from utils import load_file, plot_similarity_scores
from constants import StreamlitException
from nlp import (
clean_text, split_text, summarize_text,
extract_person_names_and_email, extract_tech_skills,
calculate_similarity, qna_query, lang_model
)
from constants import API_TOKEN, VESRION
os.environ["HUGGINGFACEHUB_API_TOKEN"] = API_TOKEN
def process_exception(e):
st.error(e.message)
st.stop()
if __name__ == "__main__":
# Set page width to a larger size
st.set_page_config(layout="wide")
# Streamlit app UI
st.write(
"""
ResuMate
🚀 Transforming the recruitment and staffing experience through Generative AI
""",
unsafe_allow_html=True
)
st.write("")
st.write("")
st.sidebar.write("")
with st.sidebar.expander("🤖 About", expanded=False):
st.write("This app is powered by free and open-source **Langchain** and **LLM technology**.")
st.write("Developed by **[Chandramauli Chaudhuri](https://www.linkedin.com/in/chandramaulic/)**.")
st.write("")
st.write(f"Version **{VESRION}**.")
# Upload a file, share job description and summarize its content
#st.sidebar.write("")
st.sidebar.header("User Inputs")
#st.sidebar.write("")
job_description_raw = st.sidebar.text_area("Enter the job description:")
#st.sidebar.write("")
job_description = clean_text(job_description_raw)
#st.write("")
uploaded_file = st.sidebar.file_uploader("Upload a resume:", type=["docx", "pdf", "ppt", "pptx"])
#st.sidebar.write("")
# Spinner set-up
with st.spinner("Details loading, please wait.."):
if uploaded_file is not None:
load_file_result = load_file(st, uploaded_file)
if type(load_file_result) is StreamlitException:
process_exception(load_file_result)
else:
resume_text_raw, lang_loader = load_file_result
resume_text = clean_text(resume_text_raw)
doc = lang_model(resume_text)
st.subheader("📃 Overview")
st.write("")
# Set up candidate name & email extraction
person_names, emails = extract_person_names_and_email(resume_text)
st.write("**Candidate's name:** " + ", ".join(person_names))
st.write("")
st.write("**Candidate's email address:** " + ", ".join(emails))
st.write("")
# Set up job description summarization
summarization_result = summarize_text(job_description)
if type(summarization_result) is StreamlitException:
process_exception(summarization_result)
else:
st.write("**Job description summary:** " + summarization_result)
st.write("")
# Set up resume summarization
summarization_result = summarize_text(resume_text)
if type(summarization_result) is StreamlitException:
process_exception(summarization_result)
else:
st.write("**Candidate's resume summary:** " + summarization_result)
st.write("")
st.write("")
st.subheader("🔍 Fitment")
st.write("")
# Set up technical skill extraction
st.write("**Candidate's key technical skills:** " + ", ".join(extract_tech_skills(doc)))
st.write("")
# Set up percentage match calculation
st.write("**Percentage match between job description and candidate's resume:** " + f"{calculate_similarity(job_description, resume_text):.2f}%" + "\n")
st.write("")
# Set up percentage match calculation at sentence level
job_description_phrases = split_text(job_description)
resume_phrases = split_text(resume_text)
st.write('**Percentage resume match against TOP 10 job description items:**')
if job_description_raw != '':
fig = plot_similarity_scores(job_description_phrases, resume_phrases)
st.plotly_chart(fig, use_container_width=True)
# Set up user Q&A
user_input = st.sidebar.text_input("Ask any other resume-related questions:", "")
if user_input:
answer = qna_query(lang_loader, user_input)
st.sidebar.write(answer)