HR-Test / app.py
DreamStream-1's picture
Update app.py
45921c5 verified
raw
history blame
3.45 kB
import streamlit as st
import subprocess
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import PyPDF2
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from transformers import pipeline
from gemini_flash import GeminiFlash # Adjust if Gemini Flash is available
# Ensure that NLTK's stopwords are available
nltk.download('punkt')
nltk.download('stopwords')
# Initialize Hugging Face NER pipeline
ner_model = pipeline("ner", model="dbmdz/bert-large-cased-finetuned-conll03-english")
# Initialize Gemini Flash for prompt engineering
prompt_engineer = GeminiFlash()
# Streamlit Interface
st.title("AI Resume and Job Description Analyzer")
# Step 1: Resume Upload
uploaded_file = st.file_uploader("Upload Resume (PDF)", type="pdf")
if uploaded_file is not None:
# Read the PDF file
pdf_reader = PyPDF2.PdfReader(uploaded_file)
resume_text = ""
for page in range(len(pdf_reader.pages)):
resume_text += pdf_reader.pages[page].extract_text()
# Display the resume text
st.text_area("Resume Text", resume_text, height=300)
# Step 2: Job Description Input
job_description = st.text_area("Enter Job Description")
if job_description:
# Preprocess job description using NLTK
stop_words = set(stopwords.words("english"))
tokens = word_tokenize(job_description)
filtered_tokens = [word for word in tokens if word.lower() not in stop_words]
ps = nltk.PorterStemmer()
stemmed_tokens = [ps.stem(word) for word in filtered_tokens]
preprocessed_job_description = " ".join(stemmed_tokens)
# Display preprocessed job description
st.text_area("Processed Job Description", preprocessed_job_description)
# Step 3: Named Entity Recognition (NER) on Resume using Hugging Face Transformers
if resume_text:
entities = ner_model(resume_text)
# Display extracted entities
st.subheader("Named Entities from Resume")
st.write(entities)
# Step 4: Candidate-Job Relevance Using Cosine Similarity
if resume_text and job_description:
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([job_description, resume_text])
cosine_sim = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
st.write(f"Cosine Similarity (Relevance): {cosine_sim[0][0]:.2f}")
# Step 5: Gemini Flash - Prompt Engineering (using Gemini Flash to craft relevant prompts for an LLM)
if resume_text and job_description:
prompt = f"""
Given the resume text and job description, evaluate how well the candidate's qualifications match the job requirements.
Resume: {resume_text}
Job Description: {job_description}
Based on the information provided, generate a detailed match score between the candidate and the job.
"""
# Use Gemini Flash to refine and enhance the prompt (assuming Gemini Flash enhances the prompt)
enhanced_prompt = prompt_engineer.refine_prompt(prompt)
# Display the enhanced prompt (for debugging or transparency)
st.subheader("Enhanced Prompt for LLM")
st.write(enhanced_prompt)
# Here you would typically pass the `enhanced_prompt` to a large language model (LLM) API or model for evaluation
# For demonstration purposes, assume a function `get_llm_response` exists that interacts with a model.
# response = get_llm_response(enhanced_prompt)
# st.write("LLM Response:", response)