|
import gradio as gr |
|
import PyPDF2 |
|
import os |
|
import openai |
|
import re |
|
import plotly.graph_objects as go |
|
|
|
class ResumeAnalyser: |
|
def __init__(self): |
|
pass |
|
def extract_text_from_file(self,file_path): |
|
|
|
file_extension = os.path.splitext(file_path)[1] |
|
|
|
if file_extension == '.pdf': |
|
with open(file_path, 'rb') as file: |
|
|
|
reader = PyPDF2.PdfFileReader(file) |
|
|
|
|
|
extracted_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: |
|
|
|
return file.read() |
|
|
|
else: |
|
return "Unsupported file type" |
|
|
|
def responce_from_ai(self,textjd, textcv): |
|
resume = self.extract_text_from_file(textjd) |
|
job_description = self.extract_text_from_file(textcv) |
|
|
|
response = openai.Completion.create( |
|
engine="text-davinci-003", |
|
prompt=f""" |
|
Given the job description and the resume, assess the matching percentage to 100 and if 100 percentage not matched mention the remaining percentage with reason. **Job Description:**{job_description}**Resume:**{resume} |
|
**Detailed Analysis:** |
|
the result should be in this format: |
|
Matched Percentage: [matching percentage]. |
|
Reason : [list out Reason for why Matched Percentage]. |
|
Skills To Improve : [Mention the skills How to improve and get 100 percentage this job description matching]. |
|
Keywords : [matched key words from {job_description} and {resume}]. |
|
""", |
|
temperature=0, |
|
max_tokens=100, |
|
n=1, |
|
stop=None, |
|
) |
|
generated_text = response.choices[0].text.strip() |
|
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 = None |
|
reason = None |
|
skills_to_improve = None |
|
keywords = None |
|
|
|
for line in lines: |
|
if line.startswith('Matched Percentage:'): |
|
match = re.search(r"Matched Percentage: (\d+)%", line) |
|
print(match) |
|
if match: |
|
matched_percentage = int(match.group(1)) |
|
elif line.startswith('Reason'): |
|
reason = line.split(':')[1].strip() |
|
elif line.startswith('Skills To Improve'): |
|
skills_to_improve = line.split(':')[1].strip() |
|
elif line.startswith('Keywords'): |
|
keywords = line.split(':')[1].strip() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
labels = ['Matched', 'Remaining'] |
|
values = [matched_percentage, 100 - matched_percentage] |
|
|
|
fig = go.Figure(data=[go.Pie(labels=labels, values=values)]) |
|
|
|
|
|
|
|
return match,reason, skills_to_improve, keywords,fig |
|
|
|
|
|
def gradio_interface(self): |
|
with gr.Blocks(css="style.css",theme=gr.themes.Soft()) as app: |
|
gr.HTML("""<img class="leftimage" align="left" src="https://companieslogo.com/img/orig/RAND.AS_BIG-0f1935a4.png?t=1651813778" alt="Image" width="210" height="210"> |
|
<img class="rightimage" align="right" src="https://workllama.com/wp-content/uploads/2022/05/WL_Logo.svg" alt="Image" width="210" height="210">""") |
|
|
|
with gr.Row(): |
|
with gr.Column(elem_id="col-container"): |
|
gr.HTML( |
|
"""<br style="color:white;">""" |
|
) |
|
gr.HTML( |
|
"""<h2 style="text-align:center; color:"white">WorkLLama Resume Matcher</h2> """ |
|
) |
|
gr.HTML("<br>") |
|
with gr.Row(): |
|
with gr.Column(scale=0.45, min_width=150, ): |
|
jobDescription = gr.File(label="Job Description") |
|
with gr.Column(scale=0.45, min_width=150): |
|
resume = gr.File(label="Resume") |
|
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="Reason",lines=8) |
|
with gr.Column(scale=1.0, min_width=150): |
|
skills = gr.Textbox(label="Skills",lines=8) |
|
with gr.Column(scale=1.0, min_width=150): |
|
keywords = gr.Textbox(label="Keywords",lines=8) |
|
with gr.Row(): |
|
with gr.Column(scale=1.0, min_width=150): |
|
pychart = gr.Plot(label="Matching Percentage Chart") |
|
analyse.click(self.matching_percentage, [jobDescription, resume], [perncentage,reason,skills,keywords,pychart]) |
|
|
|
app.launch() |
|
|
|
resume=ResumeAnalyser() |
|
resume.gradio_interface() |