DreamStream-1 commited on
Commit
78bff52
·
verified ·
1 Parent(s): db96d15

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -80
app.py CHANGED
@@ -1,78 +1,49 @@
1
  import gradio as gr
2
- import os
3
- import csv
4
- import re
5
  import requests
6
- from sentence_transformers import SentenceTransformer, util
 
 
7
 
8
- # Initialize Sentence-Transformer model
9
- model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
 
10
 
11
- # Define a function to extract leadership experience from resume text
12
- def extract_leadership_experience(resume_text):
13
- # Define leadership-related keywords/phrases
14
- leadership_keywords = [
15
- "led", "managed", "team lead", "supervised", "coordinated", "directed",
16
- "oversaw", "responsible for", "led a team", "executed", "mentored",
17
- "project manager", "leadership role", "department head", "team captain"
18
- ]
19
-
20
- # Convert resume text to lower case for case-insensitive matching
21
- resume_text_lower = resume_text.lower()
22
-
23
- # Look for matches in the resume text
24
- leadership_experience = []
25
- for keyword in leadership_keywords:
26
- if re.search(r"\b" + re.escape(keyword) + r"\b", resume_text_lower):
27
- leadership_experience.append(keyword)
28
-
29
- # Return leadership experience as a string
30
- if leadership_experience:
31
- return ", ".join(set(leadership_experience))
32
- else:
33
- return "No leadership experience found"
34
 
35
- # Define a function to extract contact info using Gemini API (simulated here)
36
- def extract_entities_via_gemini(resume_text):
37
- # This is a simulation of the Google Gemini API. Replace with your actual API calls.
38
- response = requests.post(
39
- "https://your-gemini-api-endpoint.com", # Replace with actual endpoint
40
- data={"text": resume_text}
41
- )
 
42
 
43
- # Simulate successful response with mock data
44
  if response.status_code == 200:
45
- data = response.json()
46
- return {
47
- "name": data.get("name", "Unknown"),
48
- "email": data.get("email", "No Email"),
49
- "contact": data.get("contact", "No Contact")
50
- }
51
  else:
52
- return {
53
- "name": "Unknown",
54
- "email": "No Email",
55
- "contact": "No Contact"
56
- }
57
 
58
- # Function to extract text from resumes (assumes .pdf or .txt files)
59
  def extract_text_from_resume(resume_file):
60
- # Add your extraction logic here based on the file type (e.g., PDF, DOCX, TXT)
61
- try:
62
- if resume_file.name.endswith('.txt'):
63
- with open(resume_file.name, 'r') as file:
64
- return file.read()
65
- elif resume_file.name.endswith('.pdf'):
66
- # Add logic to extract text from PDF
67
- return "Extracted text from PDF file"
68
- else:
69
- return ""
70
- except Exception as e:
71
- return ""
72
 
73
- # Function to save results to CSV
74
  def save_results_to_csv(results):
75
- csv_file_path = "/tmp/resume_results.csv"
 
76
  with open(csv_file_path, mode='w', newline='') as file:
77
  writer = csv.writer(file)
78
  writer.writerow(["Resume Name", "Similarity Score (%)", "Eligibility", "Name", "Leadership Experience", "Email", "Contact"])
@@ -80,31 +51,35 @@ def save_results_to_csv(results):
80
  writer.writerow(result)
81
  return csv_file_path
82
 
83
- # Function to check similarity and process resumes
84
  def check_similarity(job_description, resume_files):
85
  results = []
86
- job_emb = model.encode(job_description, convert_to_tensor=True)
87
-
 
 
 
 
 
88
  for resume_file in resume_files:
89
  resume_text = extract_text_from_resume(resume_file)
90
  if not resume_text:
91
  results.append((resume_file.name, 0, "Not Eligible", None, "No leadership experience", "No Email", "No Contact"))
92
  continue
93
 
94
- # Check for similarity between resume and job description
95
- resume_emb = model.encode(resume_text, convert_to_tensor=True)
 
 
 
 
 
 
96
  similarity_score = util.pytorch_cos_sim(job_emb, resume_emb)[0][0].item()
97
-
98
- # Convert similarity score to percentage
99
  similarity_percentage = similarity_score * 100
100
-
101
- # Extract leadership experience
102
  leadership_experience = extract_leadership_experience(resume_text)
103
-
104
- # Extract name, email, and contact info using Google Gemini API
105
  contact_info = extract_entities_via_gemini(resume_text)
106
 
107
- # Set a higher similarity threshold for eligibility
108
  if similarity_score >= 0.50:
109
  candidate_name = contact_info.get('name', 'Unknown Candidate')
110
  results.append((
@@ -127,15 +102,13 @@ def check_similarity(job_description, resume_files):
127
  contact_info.get('contact', 'No Contact')
128
  ))
129
 
130
- # Now return results and the file path of the CSV
131
  csv_file_path = save_results_to_csv(results)
132
  return results, csv_file_path
133
 
134
- # Function to download the results as a CSV file
135
  def download_results(results):
136
  return save_results_to_csv(results)
137
 
138
- # Define Gradio Interface
139
  with gr.Blocks() as demo:
140
  with gr.Row():
141
  job_desc_input = gr.Textbox(label="Job Description", lines=3)
@@ -143,7 +116,6 @@ with gr.Blocks() as demo:
143
 
144
  results_output = gr.Dataframe(headers=["Resume Name", "Similarity Score (%)", "Eligibility", "Name", "Leadership Experience", "Email", "Contact"])
145
 
146
- # Define the button to trigger similarity check
147
  check_button = gr.Button("Check Similarity")
148
 
149
  # Set up button's action
@@ -153,5 +125,4 @@ with gr.Blocks() as demo:
153
  outputs=[results_output, gr.File(label="Download CSV", value=download_results)]
154
  )
155
 
156
- # Launch Gradio interface
157
  demo.launch()
 
1
  import gradio as gr
 
 
 
2
  import requests
3
+ import json
4
+ import os
5
+ from sentence_transformers import util
6
 
7
+ # Set up API endpoint and API Key
8
+ api_key = os.getenv("GOOGLE_API_KEY") # Store your API Key in environment variables
9
+ api_url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1-2:embedText" # Adjust as per your model version
10
 
11
+ headers = {
12
+ "Authorization": f"Bearer {api_key}",
13
+ "Content-Type": "application/json"
14
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
+ def get_gemini_embeddings(text):
17
+ data = {
18
+ "model": "gemini-1-2", # Replace with the actual model you are using
19
+ "text": text
20
+ }
21
+
22
+ # Send POST request to Gemini API
23
+ response = requests.post(api_url, headers=headers, json=data)
24
 
 
25
  if response.status_code == 200:
26
+ response_data = response.json()
27
+ return response_data.get("embeddings", [])
 
 
 
 
28
  else:
29
+ print(f"Error: {response.status_code} - {response.text}")
30
+ return []
 
 
 
31
 
 
32
  def extract_text_from_resume(resume_file):
33
+ # Extract text from resume (you can use libraries like PyPDF2 or textract for PDFs)
34
+ return "Sample resume text"
35
+
36
+ def extract_leadership_experience(resume_text):
37
+ # Logic to extract leadership experience from resume text
38
+ return "Leadership Experience Example"
39
+
40
+ def extract_entities_via_gemini(resume_text):
41
+ # Logic to extract named entities (e.g., Name, Email, Contact) using Gemini API
42
+ return {"name": "John Doe", "email": "john.doe@example.com", "contact": "123-456-7890"}
 
 
43
 
 
44
  def save_results_to_csv(results):
45
+ import csv
46
+ csv_file_path = "/tmp/results.csv"
47
  with open(csv_file_path, mode='w', newline='') as file:
48
  writer = csv.writer(file)
49
  writer.writerow(["Resume Name", "Similarity Score (%)", "Eligibility", "Name", "Leadership Experience", "Email", "Contact"])
 
51
  writer.writerow(result)
52
  return csv_file_path
53
 
 
54
  def check_similarity(job_description, resume_files):
55
  results = []
56
+
57
+ # Get embeddings for the job description using Gemini
58
+ job_emb = get_gemini_embeddings(job_description)
59
+
60
+ if not job_emb:
61
+ return "Error in embedding job description using Gemini API."
62
+
63
  for resume_file in resume_files:
64
  resume_text = extract_text_from_resume(resume_file)
65
  if not resume_text:
66
  results.append((resume_file.name, 0, "Not Eligible", None, "No leadership experience", "No Email", "No Contact"))
67
  continue
68
 
69
+ # Get embeddings for the resume using Gemini
70
+ resume_emb = get_gemini_embeddings(resume_text)
71
+
72
+ if not resume_emb:
73
+ results.append((resume_file.name, 0, "Not Eligible", None, "No leadership experience", "No Email", "No Contact"))
74
+ continue
75
+
76
+ # Calculate similarity score between job description and resume
77
  similarity_score = util.pytorch_cos_sim(job_emb, resume_emb)[0][0].item()
 
 
78
  similarity_percentage = similarity_score * 100
79
+
 
80
  leadership_experience = extract_leadership_experience(resume_text)
 
 
81
  contact_info = extract_entities_via_gemini(resume_text)
82
 
 
83
  if similarity_score >= 0.50:
84
  candidate_name = contact_info.get('name', 'Unknown Candidate')
85
  results.append((
 
102
  contact_info.get('contact', 'No Contact')
103
  ))
104
 
 
105
  csv_file_path = save_results_to_csv(results)
106
  return results, csv_file_path
107
 
 
108
  def download_results(results):
109
  return save_results_to_csv(results)
110
 
111
+ # Gradio UI
112
  with gr.Blocks() as demo:
113
  with gr.Row():
114
  job_desc_input = gr.Textbox(label="Job Description", lines=3)
 
116
 
117
  results_output = gr.Dataframe(headers=["Resume Name", "Similarity Score (%)", "Eligibility", "Name", "Leadership Experience", "Email", "Contact"])
118
 
 
119
  check_button = gr.Button("Check Similarity")
120
 
121
  # Set up button's action
 
125
  outputs=[results_output, gr.File(label="Download CSV", value=download_results)]
126
  )
127
 
 
128
  demo.launch()