halimbahae's picture
Update app.py
288df6b verified
raw
history blame
5.61 kB
import gradio as gr
from huggingface_hub import InferenceClient
from PyPDF2 import PdfReader
import requests
from bs4 import BeautifulSoup
# Initialize the Inference Client
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
def extract_text_from_pdf(file):
if file is None:
return ""
reader = PdfReader(file)
text = ""
for page in reader.pages:
text += page.extract_text()
return text
def parse_score(score_text):
try:
return float(score_text.strip('%').strip()) / 100
except ValueError:
return None
def ats_friendly_checker(file):
resume_text = extract_text_from_pdf(file)
system_message = "Evaluate the following resume for ATS-friendliness and provide a score and feedback."
message = resume_text
response = client.chat_completion(
[{"role": "system", "content": system_message}, {"role": "user", "content": message}],
max_tokens=512,
temperature=0.7,
top_p=0.95
).choices[0].message.content
score_text = response.split("\n")[0].split(":")[-1].strip()
feedback = "\n".join(response.split("\n")[1:])
score = parse_score(score_text)
if score is not None:
score *= 100 # Convert to percentage
else:
score = 0
feedback = "Error parsing score from the response."
return score, feedback
def scrape_job_description(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
job_description = soup.get_text(separator=" ", strip=True)
return job_description
def resume_match_checker(file, job_url):
resume_text = extract_text_from_pdf(file)
job_description = scrape_job_description(job_url)
system_message = "Compare the following resume with the job description and provide a match score and feedback."
message = f"Resume: {resume_text}\n\nJob Description: {job_description}"
response = client.chat_completion(
[{"role": "system", "content": system_message}, {"role": "user", "content": message}],
max_tokens=512,
temperature=0.7,
top_p=0.95
).choices[0].message.content
match_score_text = response.split(":")[-1].strip()
feedback = "\n".join(response.split("\n")[1:])
match_score = parse_score(match_score_text)
if match_score is not None:
match_score *= 100 # Convert to percentage
else:
match_score = 0
feedback = "Error parsing match score from the response."
return match_score, feedback
def resume_quality_score(file):
resume_text = extract_text_from_pdf(file)
system_message = "Evaluate the following resume for overall quality and provide a score and interpretation."
message = resume_text
response = client.chat_completion(
[{"role": "system", "content": system_message}, {"role": "user", "content": message}],
max_tokens=512,
temperature=0.7,
top_p=0.95
).choices[0].message.content
score_lines = response.split("\n")
quality_score_text = score_lines[0].split(":")[-1].strip()
interpretation = "\n".join(score_lines[1:])
quality_score = parse_score(quality_score_text)
if quality_score is not None:
quality_score *= 100 # Convert to percentage
else:
quality_score = 0
interpretation = "Error parsing quality score from the response."
return quality_score, interpretation
def text_to_overleaf(resume_text):
system_message = "Convert the following resume text to Overleaf code."
message = resume_text
response = client.chat_completion(
[{"role": "system", "content": system_message}, {"role": "user", "content": message}],
max_tokens=512,
temperature=0.7,
top_p=0.95
).choices[0].message.content
overleaf_code = response
return overleaf_code
# Define the Gradio interface
with gr.Blocks() as demo:
gr.Markdown("# Resume Enhancement Tool\nEnhance your resume with the following features.")
with gr.Tab("ATS-Friendly Checker"):
with gr.Row():
resume = gr.File(label="Upload your Resume (PDF)")
score = gr.Number(label="ATS Score", interactive=False)
feedback = gr.Textbox(label="Feedback", interactive=False)
resume.upload(ats_friendly_checker, resume, [score, feedback])
with gr.Tab("Resume Match Checker"):
with gr.Row():
resume = gr.File(label="Upload your Resume (PDF)")
job_url = gr.Textbox(label="Job Description URL")
match_score = gr.Number(label="Match Score", interactive=False)
feedback = gr.Textbox(label="Feedback", interactive=False)
gr.Button("Check Match").click(resume_match_checker, [resume, job_url], [match_score, feedback])
with gr.Tab("Resume Quality Score"):
with gr.Row():
resume = gr.File(label="Upload your Resume (PDF)")
quality_score = gr.Number(label="Quality Score", interactive=False)
interpretation = gr.Textbox(label="Interpretation", interactive=False)
resume.upload(resume_quality_score, resume, [quality_score, interpretation])
with gr.Tab("Text to Overleaf Code"):
with gr.Row():
resume_text = gr.Textbox(label="Resume Text")
overleaf_code = gr.Textbox(label="Overleaf Code", interactive=False)
resume_text.submit(text_to_overleaf, resume_text, overleaf_code)
gr.Markdown("---\nBuilt with love by [Bahae Eddine HALIM](https://www.linkedin.com/in/halimbahae/)")
if __name__ == "__main__":
demo.launch(share=True)