File size: 5,357 Bytes
c5002df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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):
      # 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):
      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            : [reason for Matched Percentage].
                  Skills To Improve : [Mention the skills to improve and get 100 percentage 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

      match = re.search(r"(Matched Percentage: (.+))", result)
      percentage = match.group(1)

      match = re.search(r"(Reason: (.+))", result)
      reason = match.group(1)

      match = re.search(r"(Skills To Improve: (.+))", result)
      skills = match.group(1)

      match = re.search(r"(Keywords: (.+))", result)
      keywords = match.group(1)


      # Extract the matched percentage using regular expression
      match1 = re.search(r"Matched Percentage: (\d+)%", 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 percentage,reason, skills, 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()