Spaces:
Runtime error
Runtime error
from Models import Models | |
class ResumeSegmenter: | |
def __init__(self, zero_shot_classifier): | |
self.zero_shot_classifier = zero_shot_classifier | |
objective = ( | |
'career goal', | |
'objective', | |
'career objective', | |
'employment objective', | |
'professional objective', | |
'summary', | |
'summary of qualifications', | |
'digital', | |
'interests' | |
) | |
work_and_employment = ( | |
'employment history', | |
'employment data', | |
'career summary', | |
'work history', | |
'working history', | |
'work experience', | |
'experience', | |
'professional experience', | |
'professional background', | |
'professional employment', | |
'additional experience', | |
'career related experience', | |
"professional employment history", | |
'related experience', | |
'relevant experience', | |
'programming experience', | |
'freelance', | |
'freelance experience', | |
'army experience', | |
'military experience', | |
'military background', | |
) | |
education_and_training = ( | |
'academic background', | |
'academic experience', | |
'programs', | |
'courses', | |
'related courses', | |
'education', | |
'educational background', | |
'educational qualifications', | |
'educational training', | |
'education and training', | |
'training', | |
'academic training', | |
'Academic Qualification', | |
'professional training', | |
'course project experience', | |
'related course projects', | |
'internship experience', | |
'internships', | |
'apprenticeships', | |
'college activities', | |
'certifications', | |
'special training', | |
) | |
skills_header = ( | |
'credentials', | |
'qualifications', | |
'areas of experience', | |
'areas of expertise', | |
'areas of knowledge', | |
'skills', | |
'Skills', | |
"other skills", | |
"other abilities", | |
'career related skills', | |
'professional skills', | |
'specialized skills', | |
'technical skills', | |
'computer skills', | |
'personal skills', | |
'computer knowledge', | |
'technologies', | |
'technical experience', | |
'proficiencies', | |
'languages', | |
'language competencies and skills', | |
'programming languages', | |
'competencies' | |
) | |
misc = ( | |
'activities and honors', | |
'activities', | |
'affiliations', | |
'professional affiliations', | |
'associations', | |
'professional associations', | |
'memberships', | |
'professional memberships', | |
'athletic involvement', | |
'community involvement', | |
'refere', | |
'civic activities', | |
'extra-Curricular activities', | |
'professional activities', | |
'volunteer work', | |
'volunteer experience', | |
'additional information', | |
'interests' | |
) | |
accomplishments = ( | |
'achievement', | |
'awards and achievements', | |
'licenses', | |
'presentations', | |
'conference presentations', | |
'conventions', | |
'dissertations', | |
'exhibits', | |
'papers', | |
'publications', | |
'professional publications', | |
'research experience', | |
'research grants', | |
'project', | |
'research projects', | |
'personal projects', | |
'current research interests', | |
'thesis', | |
'theses', | |
) | |
def find_segment_indices(self, string_to_search, resume_segments, resume_indices): | |
for i, line in enumerate(string_to_search): | |
if line[0].islower(): | |
continue | |
header = line.lower() | |
if [o for o in self.objective if header.startswith(o)]: | |
try: | |
resume_segments['objective'][header] | |
except: | |
resume_indices.append(i) | |
header = [o for o in self.objective if header.startswith(o)][0] | |
resume_segments['objective'][header] = i | |
elif [w for w in self.work_and_employment if header.startswith(w)]: | |
try: | |
resume_segments['work_and_employment'][header] | |
except: | |
resume_indices.append(i) | |
header = [w for w in self.work_and_employment if header.startswith(w)][0] | |
resume_segments['work_and_employment'][header] = i | |
elif [e for e in self.education_and_training if header.startswith(e)]: | |
try: | |
resume_segments['education_and_training'][header] | |
except: | |
resume_indices.append(i) | |
header = [e for e in self.education_and_training if header.startswith(e)][0] | |
resume_segments['education_and_training'][header] = i | |
elif [s for s in self.skills_header if header.startswith(s)]: | |
try: | |
resume_segments['skills'][header] | |
except: | |
resume_indices.append(i) | |
header = [s for s in self.skills_header if header.startswith(s)][0] | |
resume_segments['skills'][header] = i | |
elif [m for m in self.misc if header.startswith(m)]: | |
try: | |
resume_segments['misc'][header] | |
except: | |
resume_indices.append(i) | |
header = [m for m in self.misc if header.startswith(m)][0] | |
resume_segments['misc'][header] = i | |
elif [a for a in self.accomplishments if header.startswith(a)]: | |
try: | |
resume_segments['accomplishments'][header] | |
except: | |
resume_indices.append(i) | |
header = [a for a in self.accomplishments if header.startswith(a)][0] | |
resume_segments['accomplishments'][header] = i | |
def slice_segments(self, string_to_search, resume_segments, resume_indices): | |
resume_segments['contact_info'] = string_to_search[:resume_indices[0]] | |
sec_idxs = {} | |
for section, value in resume_segments.items(): | |
if section == 'contact_info': | |
continue | |
for sub_section, start_idx in value.items(): | |
end_idx = len(string_to_search) | |
if (resume_indices.index(start_idx) + 1) != len(resume_indices): | |
end_idx = resume_indices[resume_indices.index(start_idx) + 1] | |
sec_idxs[section] = (start_idx, end_idx) | |
# print(start_idx, end_idx) | |
resume_segments[section][sub_section] = string_to_search[start_idx:end_idx] | |
return sec_idxs | |
def find_true_segment(self, dict_of_segments, segment_name): | |
segment_classes = { | |
'objective': ["objective", "other"], | |
'work_and_employment':["employment history", "other"], | |
'education_and_training': ["education", "other"], | |
'skills': ["skills", "other"], | |
'accomplishments': ["accomplishments", "other"], | |
'misc': ["misc", "other"], | |
'contact_info': ["contact information", "other"] | |
} | |
classes = segment_classes[segment_name] | |
scores = [] | |
segs = dict_of_segments.keys() | |
for seg in segs: | |
sequence = dict_of_segments[seg] | |
score = self.zero_shot_classifier(' '.join(sequence), classes)["scores"][0] | |
scores.append(score) | |
res = sorted(zip(dict_of_segments.keys(), scores), key=lambda x: x[1], reverse=True) | |
if len(res): | |
return res[0][0] | |
else: return 0 | |
def segment(self, string_to_search): | |
print("Segmenting the Resume..") | |
resume_segments = { | |
'objective': {}, | |
'work_and_employment': {}, | |
'education_and_training': {}, | |
'skills': {}, | |
'accomplishments': {}, | |
'misc': {} | |
} | |
resume_indices = [] | |
self.find_segment_indices(string_to_search, resume_segments, resume_indices) | |
if len(resume_indices) != 0: | |
sec_idx = self.slice_segments(string_to_search, resume_segments, resume_indices) | |
else: | |
resume_segments['contact_info'] = [] | |
for segment in resume_segments: | |
if segment == "contact_info": continue | |
if not len(resume_segments[segment]) > 1: | |
if len(resume_segments[segment]) == 1: | |
only_key = list(resume_segments[segment].keys())[0] | |
resume_segments[segment] = resume_segments[segment][only_key][1:] | |
continue | |
if segment != "work_and_employment": continue | |
true_seg = self.find_true_segment(resume_segments[segment], segment) | |
if not true_seg: | |
resume_segments[segment] = [] | |
else: | |
resume_segments[segment] = resume_segments[segment][true_seg][1:] | |
return resume_segments | |