Baskar2005's picture
Update app.py
c230268 verified
import gradio as gr
import PyPDF2
import os
import openai
import re
import plotly.graph_objects as go
from openai import AzureOpenAI
class ResumeAnalyser:
def __init__(self):
self.client = AzureOpenAI(azure_deployment = "GPT-3")
def extract_text_from_file(self,file_path):
# Get the file extension
file_extension = os.path.splitext(file_path)[1]
if file_extension == '.pdf':
with open(file_path, 'rb') as file:
# Create a PDF file reader object
reader = PyPDF2.PdfFileReader(file)
# Create an empty string to hold the extracted text
extracted_text = ""
# Loop through each page in the PDF and extract the text
for page_number in range(reader.getNumPages()):
page = reader.getPage(page_number)
extracted_text += page.extractText()
return extracted_text
elif file_extension == '.txt':
with open(file_path, 'r') as file:
# Just read the entire contents of the text file
return file.read()
else:
return "Unsupported file type"
def responce_from_ai(self,textjd, textcv):
job_description = self.extract_text_from_file(textjd)
resume = self.extract_text_from_file(textcv)
conversation = [
{"role": "system", "content": "You are a Reason Analyser"},
{"role": "user", "content": f"""
Given the job description and the resume, access the matching percentage to 100 and if 100 percentage not matched mention the remaining percentage with reason.if doesn't match return 0. **Job Description:**{job_description}**Resume:**{resume}
**Detailed Analysis:**
the result should be in this format:
Matched Percentage: [matching percentage].
Reason : [give me a Reason (shortly in passage) and keys from job_description and resume get this matched percentage.].
Skills To Improve : [give me a the skills How to improve and get 100 percentage job description matching (shortly in passage).].
Keywords : [give me a matched key words from {job_description} and {resume}].
"""}
]
response = self.client.chat.completions.create(
model="ChatGPT",
messages=conversation,
temperature=0,
max_tokens=500,
n=1,
stop=None,
)
generated_text = response.choices[0].message.content
print(generated_text)
return generated_text
def matching_percentage(self,job_description_path, resume_path):
job_description_path = job_description_path.name
resume_path = resume_path.name
generated_text = self.responce_from_ai(job_description_path, resume_path)
result = generated_text
lines = result.split('\n')
matched_percentage = 0
matched_percentage_txt = None
reason = None
skills_to_improve = None
keywords = None
for line in lines:
if line.startswith('Matched Percentage:'):
matched_percentage = re.search(r'\d+', line)
if matched_percentage:
matched_percentage = int(matched_percentage.group())
matched_percentage_txt = (f"Matched Percentage: {matched_percentage}%")
elif line.startswith('Reason'):
reason = line.split(':')[1].strip()
print(reason)
elif line.startswith('Skills To Improve'):
skills_to_improve = line.split(':')[1].strip()
print(skills_to_improve)
elif line.startswith('Keywords'):
keywords = line.split(':')[1].strip()
# Extract the matched percentage using regular expression
# match1 = re.search(r"Matched Percentage: (\d+)%", matched_percentage)
# matched_Percentage = int(match1.group(1))
# Creating a pie chart with plotly
labels = ['Matched', 'Remaining']
values = [matched_percentage, 100 - matched_percentage]
fig = go.Figure(data=[go.Pie(labels=labels, values=values)])
# fig.update_layout(title='Matched Percentage')
return matched_percentage_txt,reason, skills_to_improve, keywords,fig
def filename(self,uploadbutton):
return uploadbutton.name
def gradio_interface(self):
with gr.Blocks(css="style.css",theme="freddyaboulton/test-blue") as app:
# gr.HTML("""<img class="leftimage" align="left" src="https://lh5.googleusercontent.com/Oe_QQsjdEEDWZtgR5v8DHJe3aHP5rOj4FkfpCbo6CELP6xzoHh7N_nYV62cZhMQcLNlvR8xaFq7nMd4V1W-gKeIZ67QAECE9m6pRuRJah9MCdHg5N1q3oJ-4rOoxTc8ZdA=w1280" alt="Image" width="210" height="210">
# <img class="rightimage" align="right" src="https://companieslogo.com/img/orig/RAND.AS_BIG-0f1935a4.png?t=1651813778" alt="Image" width="210" height="210">""")
with gr.Row():
gr.HTML("""<center class="darkblue" text-align:center;padding:30px;'><center>
<center><h1 class ="center" style="color:#fff">ADOPLE AI</h1></center>
<br><center><h1 style="color:#fff">Resume Analyser</h1></center>""")
with gr.Row():
with gr.Column(scale=0.45, min_width=150, ):
file_jd = gr.File()
jobDescription = gr.UploadButton(
"Browse File",file_types=[".txt", ".pdf", ".doc", ".docx",".json",".csv"],
elem_classes="filenameshow")
with gr.Column(scale=0.45, min_width=150):
file_resume = gr.File()
resume = gr.UploadButton(
"Browse File",file_types=[".txt", ".pdf", ".doc", ".docx",".json",".csv"],
elem_classes="filenameshow")
with gr.Column(scale=0.10, min_width=150):
analyse = gr.Button("Analyse")
with gr.Row():
with gr.Column(scale=1.0, min_width=150):
perncentage = gr.Textbox(label="Matching Percentage",lines=8)
with gr.Column(scale=1.0, min_width=150):
reason = gr.Textbox(label="Matching Reason",lines=8)
with gr.Column(scale=1.0, min_width=150):
skills = gr.Textbox(label="Skills To Improve",lines=8)
with gr.Column(scale=1.0, min_width=150):
keywords = gr.Textbox(label="Matched Keywords",lines=8)
with gr.Row():
with gr.Column(scale=1.0, min_width=150):
pychart = gr.Plot(label="Matching Percentage Chart")
jobDescription.upload(self.filename,jobDescription,file_jd)
resume.upload(self.filename,resume,file_resume)
analyse.click(self.matching_percentage, [jobDescription, resume], [perncentage,reason,skills,keywords,pychart])
app.launch()
resume=ResumeAnalyser()
resume.gradio_interface()