DreamStream-1's picture
Update app.py
78bff52 verified
raw
history blame
4.72 kB
import gradio as gr
import requests
import json
import os
from sentence_transformers import util
# Set up API endpoint and API Key
api_key = os.getenv("GOOGLE_API_KEY") # Store your API Key in environment variables
api_url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1-2:embedText" # Adjust as per your model version
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def get_gemini_embeddings(text):
data = {
"model": "gemini-1-2", # Replace with the actual model you are using
"text": text
}
# Send POST request to Gemini API
response = requests.post(api_url, headers=headers, json=data)
if response.status_code == 200:
response_data = response.json()
return response_data.get("embeddings", [])
else:
print(f"Error: {response.status_code} - {response.text}")
return []
def extract_text_from_resume(resume_file):
# Extract text from resume (you can use libraries like PyPDF2 or textract for PDFs)
return "Sample resume text"
def extract_leadership_experience(resume_text):
# Logic to extract leadership experience from resume text
return "Leadership Experience Example"
def extract_entities_via_gemini(resume_text):
# Logic to extract named entities (e.g., Name, Email, Contact) using Gemini API
return {"name": "John Doe", "email": "john.doe@example.com", "contact": "123-456-7890"}
def save_results_to_csv(results):
import csv
csv_file_path = "/tmp/results.csv"
with open(csv_file_path, mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["Resume Name", "Similarity Score (%)", "Eligibility", "Name", "Leadership Experience", "Email", "Contact"])
for result in results:
writer.writerow(result)
return csv_file_path
def check_similarity(job_description, resume_files):
results = []
# Get embeddings for the job description using Gemini
job_emb = get_gemini_embeddings(job_description)
if not job_emb:
return "Error in embedding job description using Gemini API."
for resume_file in resume_files:
resume_text = extract_text_from_resume(resume_file)
if not resume_text:
results.append((resume_file.name, 0, "Not Eligible", None, "No leadership experience", "No Email", "No Contact"))
continue
# Get embeddings for the resume using Gemini
resume_emb = get_gemini_embeddings(resume_text)
if not resume_emb:
results.append((resume_file.name, 0, "Not Eligible", None, "No leadership experience", "No Email", "No Contact"))
continue
# Calculate similarity score between job description and resume
similarity_score = util.pytorch_cos_sim(job_emb, resume_emb)[0][0].item()
similarity_percentage = similarity_score * 100
leadership_experience = extract_leadership_experience(resume_text)
contact_info = extract_entities_via_gemini(resume_text)
if similarity_score >= 0.50:
candidate_name = contact_info.get('name', 'Unknown Candidate')
results.append((
resume_file.name,
similarity_percentage,
"Eligible",
candidate_name,
leadership_experience,
contact_info.get('email', 'No Email'),
contact_info.get('contact', 'No Contact')
))
else:
results.append((
resume_file.name,
similarity_percentage,
"Not Eligible",
None,
leadership_experience,
contact_info.get('email', 'No Email'),
contact_info.get('contact', 'No Contact')
))
csv_file_path = save_results_to_csv(results)
return results, csv_file_path
def download_results(results):
return save_results_to_csv(results)
# Gradio UI
with gr.Blocks() as demo:
with gr.Row():
job_desc_input = gr.Textbox(label="Job Description", lines=3)
resume_input = gr.Files(label="Upload Resumes", file_count="multiple", file_types=[".pdf", ".txt"])
results_output = gr.Dataframe(headers=["Resume Name", "Similarity Score (%)", "Eligibility", "Name", "Leadership Experience", "Email", "Contact"])
check_button = gr.Button("Check Similarity")
# Set up button's action
check_button.click(
check_similarity,
inputs=[job_desc_input, resume_input],
outputs=[results_output, gr.File(label="Download CSV", value=download_results)]
)
demo.launch()