DreamStream-1 commited on
Commit
138c957
·
verified ·
1 Parent(s): bf3038a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +14 -26
app.py CHANGED
@@ -8,6 +8,7 @@ import re
8
  import google.generativeai as genai
9
  import time
10
  import concurrent.futures
 
11
 
12
  # Load pre-trained embedding model for basic analysis
13
  sentence_model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
@@ -67,6 +68,7 @@ required_skills = [
67
  ]
68
 
69
  # Helper Functions
 
70
  def extract_text_from_file(file_path):
71
  ext = os.path.splitext(file_path)[1].lower()
72
  if ext == ".txt":
@@ -102,7 +104,6 @@ def analyze_with_gemini(resume_text, job_desc):
102
  return response.text.strip()
103
 
104
  def extract_management_details(gemini_response):
105
- # Regular expressions for extracting leadership and management details
106
  leadership_exp_pattern = r"Team Leadership Experience \(years\):\s*(\d+)"
107
  management_exp_pattern = r"Management Experience \(years\):\s*(\d+)"
108
  management_skills_pattern = r"Management Skills\s*[:\-]?\s*(.*?)(?=\n|$)"
@@ -118,7 +119,6 @@ def extract_management_details(gemini_response):
118
  return leadership_years, management_years, skills
119
 
120
  def extract_candidate_details(gemini_response):
121
- # Regular expressions for extracting candidate details
122
  name_pattern = r"Candidate Name\s*[:\-]?\s*(.*?)(?=\n|$)"
123
  email_pattern = r"Email Address\s*[:\-]?\s*(.*?)(?=\n|$)"
124
  contact_pattern = r"Contact Number\s*[:\-]?\s*(.*?)(?=\n|$)"
@@ -134,7 +134,6 @@ def extract_candidate_details(gemini_response):
134
  return name, email, contact
135
 
136
  def calculate_role_score(role_keywords):
137
- # Score based on the seniority of the leadership role
138
  seniority_score = 0
139
  role_hierarchy = {
140
  "CEO": 5,
@@ -147,32 +146,27 @@ def calculate_role_score(role_keywords):
147
  }
148
 
149
  for keyword, score in role_hierarchy.items():
150
- if keyword.lower() in role_keywords.lower():
151
- seniority_score = max(seniority_score, score) # Highest score from role hierarchy
152
 
153
  return seniority_score
154
 
155
  def calculate_advanced_match(leadership_years, management_years, skills, required_skills, role_keywords, max_leadership_exp=10, max_management_exp=10):
156
- # Assign weights for leadership, management, and skills
157
- leadership_weight = 0.35 # 35% weight to leadership
158
- management_weight = 0.35 # 35% weight to management
159
- skills_weight = 0.2 # 20% weight to skills
160
- role_weight = 0.1 # 10% weight to role seniority
161
 
162
- # Normalize years of experience to a 100% scale
163
  leadership_score = min(leadership_years / max_leadership_exp, 1.0) * 100
164
  management_score = min(management_years / max_management_exp, 1.0) * 100
165
 
166
- # Adjust for role seniority
167
- role_score = calculate_role_score(role_keywords) # Role score based on seniority of role
168
- role_score = role_score * 100 # Normalize role score to 100 scale
169
 
170
- # Calculate skill match: percentage of required skills found in the resume
171
- skills_matched = sum(1 for skill in required_skills if skill.lower() in skills.lower())
172
  total_skills = len(required_skills)
173
  skill_match_score = (skills_matched / total_skills) * 100
174
 
175
- # Calculate the overall match score
176
  overall_match = (leadership_score * leadership_weight) + \
177
  (management_score * management_weight) + \
178
  (skill_match_score * skills_weight) + \
@@ -192,15 +186,11 @@ def process_resume(resume, job_desc, progress_callback):
192
  "Gemini Analysis": "Failed to extract text from resume."
193
  }
194
 
195
- # Detailed analysis with Gemini API
196
  try:
197
  gemini_analysis = analyze_with_gemini(resume_text, job_desc)
198
- # Extract leadership and management details
199
  leadership_years, management_years, skills = extract_management_details(gemini_analysis)
200
- # Calculate overall match percentage using enhanced calculation
201
  role_keywords = gemini_analysis.lower()
202
  overall_match = calculate_advanced_match(leadership_years, management_years, skills, required_skills, role_keywords)
203
- # Extract candidate details
204
  name, email, contact = extract_candidate_details(gemini_analysis)
205
  except Exception as e:
206
  gemini_analysis = f"Gemini analysis failed: {str(e)}"
@@ -218,16 +208,13 @@ def process_resume(resume, job_desc, progress_callback):
218
  "Gemini Analysis": gemini_analysis
219
  }
220
 
221
- # Main Gradio UI
222
  def analyze_resumes(resumes, job_desc):
223
  progress = gr.Progress()
224
  results = []
225
 
226
- # Check for maximum number of resumes
227
  if len(resumes) > MAX_RESUMES:
228
  return "Error: Cannot upload more than 10 resumes."
229
 
230
- # Process resumes concurrently
231
  with concurrent.futures.ThreadPoolExecutor() as executor:
232
  futures = []
233
  for resume in resumes:
@@ -239,7 +226,7 @@ def analyze_resumes(resumes, job_desc):
239
  resume_count_message = f"{len(resumes)} resume(s) uploaded."
240
  return pd.DataFrame(results), resume_count_message
241
 
242
- # Gradio Interface
243
  iface = gr.Interface(
244
  fn=analyze_resumes,
245
  inputs=[
@@ -247,7 +234,8 @@ iface = gr.Interface(
247
  gr.Textbox(label="Job Description", lines=5)
248
  ],
249
  outputs=["dataframe", "text"],
250
- live=True
 
251
  )
252
 
253
  iface.launch()
 
8
  import google.generativeai as genai
9
  import time
10
  import concurrent.futures
11
+ from fuzzywuzzy import fuzz
12
 
13
  # Load pre-trained embedding model for basic analysis
14
  sentence_model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
 
68
  ]
69
 
70
  # Helper Functions
71
+
72
  def extract_text_from_file(file_path):
73
  ext = os.path.splitext(file_path)[1].lower()
74
  if ext == ".txt":
 
104
  return response.text.strip()
105
 
106
  def extract_management_details(gemini_response):
 
107
  leadership_exp_pattern = r"Team Leadership Experience \(years\):\s*(\d+)"
108
  management_exp_pattern = r"Management Experience \(years\):\s*(\d+)"
109
  management_skills_pattern = r"Management Skills\s*[:\-]?\s*(.*?)(?=\n|$)"
 
119
  return leadership_years, management_years, skills
120
 
121
  def extract_candidate_details(gemini_response):
 
122
  name_pattern = r"Candidate Name\s*[:\-]?\s*(.*?)(?=\n|$)"
123
  email_pattern = r"Email Address\s*[:\-]?\s*(.*?)(?=\n|$)"
124
  contact_pattern = r"Contact Number\s*[:\-]?\s*(.*?)(?=\n|$)"
 
134
  return name, email, contact
135
 
136
  def calculate_role_score(role_keywords):
 
137
  seniority_score = 0
138
  role_hierarchy = {
139
  "CEO": 5,
 
146
  }
147
 
148
  for keyword, score in role_hierarchy.items():
149
+ if fuzz.partial_ratio(keyword.lower(), role_keywords.lower()) > 80:
150
+ seniority_score = max(seniority_score, score)
151
 
152
  return seniority_score
153
 
154
  def calculate_advanced_match(leadership_years, management_years, skills, required_skills, role_keywords, max_leadership_exp=10, max_management_exp=10):
155
+ leadership_weight = 0.35
156
+ management_weight = 0.35
157
+ skills_weight = 0.2
158
+ role_weight = 0.1
 
159
 
 
160
  leadership_score = min(leadership_years / max_leadership_exp, 1.0) * 100
161
  management_score = min(management_years / max_management_exp, 1.0) * 100
162
 
163
+ role_score = calculate_role_score(role_keywords)
164
+ role_score = role_score * 100
 
165
 
166
+ skills_matched = sum(1 for skill in required_skills if fuzz.partial_ratio(skill.lower(), skills.lower()) > 80)
 
167
  total_skills = len(required_skills)
168
  skill_match_score = (skills_matched / total_skills) * 100
169
 
 
170
  overall_match = (leadership_score * leadership_weight) + \
171
  (management_score * management_weight) + \
172
  (skill_match_score * skills_weight) + \
 
186
  "Gemini Analysis": "Failed to extract text from resume."
187
  }
188
 
 
189
  try:
190
  gemini_analysis = analyze_with_gemini(resume_text, job_desc)
 
191
  leadership_years, management_years, skills = extract_management_details(gemini_analysis)
 
192
  role_keywords = gemini_analysis.lower()
193
  overall_match = calculate_advanced_match(leadership_years, management_years, skills, required_skills, role_keywords)
 
194
  name, email, contact = extract_candidate_details(gemini_analysis)
195
  except Exception as e:
196
  gemini_analysis = f"Gemini analysis failed: {str(e)}"
 
208
  "Gemini Analysis": gemini_analysis
209
  }
210
 
 
211
  def analyze_resumes(resumes, job_desc):
212
  progress = gr.Progress()
213
  results = []
214
 
 
215
  if len(resumes) > MAX_RESUMES:
216
  return "Error: Cannot upload more than 10 resumes."
217
 
 
218
  with concurrent.futures.ThreadPoolExecutor() as executor:
219
  futures = []
220
  for resume in resumes:
 
226
  resume_count_message = f"{len(resumes)} resume(s) uploaded."
227
  return pd.DataFrame(results), resume_count_message
228
 
229
+ # Gradio Interface with Submit Button and Progress Bar
230
  iface = gr.Interface(
231
  fn=analyze_resumes,
232
  inputs=[
 
234
  gr.Textbox(label="Job Description", lines=5)
235
  ],
236
  outputs=["dataframe", "text"],
237
+ live=False, # Disable live updating
238
+ allow_flagging="never" # Optional: Disables the flagging feature
239
  )
240
 
241
  iface.launch()