| import gradio as gr |
| import os |
| import openai |
| import re |
| import PyPDF2 |
| 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': |
| text = "" |
| try: |
| with open(file_path, "rb") as pdf_file: |
| pdf_reader = PyPDF2.PdfReader(pdf_file) |
| num_pages = len(pdf_reader.pages) |
| |
| for page_num in range(num_pages): |
| page = pdf_reader.pages[page_num] |
| text += page.extract_text() |
| |
| return text |
| except Exception as e: |
| return str(e) |
|
|
| elif file_extension == '.txt': |
| with open(file_path, 'r') as file: |
| |
| return file.read() |
| else: |
| return "Unsupported file type" |
|
|
| def responce_from_ai(self,job_description, resume): |
|
|
|
|
|
|
| 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:** |
| Introduction to say we've assessment the resume |
| the result should be in this format: |
| Matched Percentage: Precisely [get matching percentage between job description and resume]%. |
| Qualification Matching Percentage: [matching percentage between job description and resume qualifications]. |
| Skills Matching Percentage: [matching percentage between job description and resume skills]. |
| Experience Matching Percentage: [matching percentage between job description and resume experience]. |
| Reason : [Reasons for why this resume matched and not matched.]. |
| Skills To Improve : [Mention the skills to improve for the candidate according to the given job description. If there are no matches, simply say N/A.]. |
| Keywords : [Return the matched keywords from resume and job_description. If there are no matches, simply say N/A.] |
| Company : [Extracted company name from job description]. |
| Irrevelant: [mention the Irrevelant skills and expericence] |
| Recommend Course: [mention specific course to recommend the candidate for job description needs]. |
| Experience: [mention specific experience to recommend the candidate for job description needs]. |
| Tailor Your Application: [Emphasize relevant areas]. |
| Certifications: [Pursue certifications in mention area]. |
| Feel free to contact us for further clarification. |
| Best wishes, |
| Your job is to write a proper E-Mail to the candidate from the organization with the job role, the candidate's name, organization name, and the body of this E-Mail should be in the above format. |
| """, |
| temperature=0, |
| max_tokens=1000, |
| stop=None, |
| ) |
| generated_text = response.choices[0].text.strip() |
| |
| return generated_text |
|
|
| def clear(self,jobDescription,resume,result_email): |
| jobDescription = None |
| resume = None |
| result_email = None |
| return jobDescription, resume, result_email |
|
|
| def main(self,job_description_path, resume_list_path): |
|
|
| tot_result = "" |
| print(tot_result) |
| job_description = self.extract_text_from_file(job_description_path.name) |
| for resume_path in resume_list_path: |
| resume = self.extract_text_from_file(resume_path.name) |
| result = self.responce_from_ai(job_description,resume) |
| tot_result = tot_result + result + "\n-------------------------------------------------------------------------------------\n" |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| return tot_result |
|
|
| def gradio_interface(self): |
| with gr.Blocks(css="style.css",theme='karthikeyan-adople/hudsonhayes-gray') as app: |
| gr.HTML("""<center class="darkblue" style='background-color:rgb(0,1,36); text-align:center;padding:25px;'><center><h1 class ="center"> |
| <img src="file=logo.png" height="110px" width="280px"></h1></center> |
| <br><h1 style="color:#fff">Candidate Assessment and Communication</h1></center>""") |
| with gr.Row(elem_id="col-container"): |
| with gr.Column(scale=0.55, min_width=150, ): |
| jobDescription = gr.File(label="Job Description", file_types = [".pdf",".txt"]) |
| with gr.Column(scale=0.55, min_width=150): |
| resume = gr.File(label="Resume", file_types = [".pdf",".txt"] , file_count="multiple") |
| with gr.Row(elem_id="col-container"): |
| with gr.Column(scale=0.80, min_width=150): |
| analyse = gr.Button("Analyse") |
| with gr.Column(scale=0.20, min_width=150): |
| clear_btn = gr.ClearButton() |
| with gr.Row(elem_id="col-container"): |
| with gr.Column(scale=1.0, min_width=150): |
| result_email = gr.Textbox(label="E-mail", lines=10) |
| |
| |
| |
| analyse.click(self.main, [jobDescription, resume], [result_email]) |
| clear_btn.click(self.clear,[jobDescription,resume,result_email],[jobDescription,resume,result_email] ) |
|
|
| app.launch(debug = True) |
|
|
| if __name__ == "__main__": |
| resume = ResumeAnalyser() |
| answer = resume.gradio_interface() |