|
|
from typing import Dict, List, Any |
|
|
|
|
|
import spacy |
|
|
from spacy.matcher import PhraseMatcher |
|
|
from skillNer.general_params import SKILL_DB |
|
|
from skillNer.skill_extractor_class import SkillExtractor |
|
|
|
|
|
import torch |
|
|
import torch.nn as nn |
|
|
import torch.nn.functional as F |
|
|
from transformers import LongformerTokenizer, LongformerModel |
|
|
import requests |
|
|
import os |
|
|
from dotenv import load_dotenv |
|
|
|
|
|
import re |
|
|
from datetime import datetime |
|
|
import time |
|
|
|
|
|
|
|
|
load_dotenv('.env.local') |
|
|
|
|
|
Resume_num_labels = None |
|
|
class EndpointHandler(): |
|
|
def __init__(self, path=""): |
|
|
|
|
|
|
|
|
self.hf_token = os.getenv('HUGGINGFACE_TOKEN') |
|
|
if not self.hf_token: |
|
|
print("Warning: HUGGINGFACE_TOKEN environment variable not set") |
|
|
self.Resume_label_map = { |
|
|
"RT": 0, |
|
|
"SST": 1, |
|
|
"SSC": 2, |
|
|
"AST": 3, |
|
|
"ASC": 4, |
|
|
"EDST": 5, |
|
|
"EDSC": 6, |
|
|
"SKST": 7, |
|
|
"SKSC": 8, |
|
|
"HST": 9, |
|
|
"HSC": 10, |
|
|
"CST": 11, |
|
|
"CSC": 12, |
|
|
"EST": 13, |
|
|
"EJT": 14, |
|
|
"EDT": 15, |
|
|
"ECT": 16, |
|
|
"EDC": 17 |
|
|
} |
|
|
global Resume_num_labels |
|
|
self.Resume_num_labels = len(self.Resume_label_map) |
|
|
Resume_num_labels = self.Resume_num_labels |
|
|
|
|
|
self.Resume_labels = [ |
|
|
{"value": "RT", "label": "Resume Title"}, |
|
|
{"value": "SST", "label": "Summary Section Title"}, |
|
|
{"value": "SSC", "label": "Summary Section Content"}, |
|
|
{"value": "AST", "label": "Accomplishments Section Title"}, |
|
|
{"value": "ASC", "label": "Accomplishments Section Content"}, |
|
|
{"value": "EDST", "label": "Education Section Title"}, |
|
|
{"value": "EDSC", "label": "Education Section Content"}, |
|
|
{"value": "SKST", "label": "Skills Section Title"}, |
|
|
{"value": "SKSC", "label": "Skills Section Content"}, |
|
|
{"value": "HST", "label": "Highlights Section Title"}, |
|
|
{"value": "HSC", "label": "Highlights Section Content"}, |
|
|
{"value": "CST", "label": "Certifications Section Title"}, |
|
|
{"value": "CSC", "label": "Certifications Section Content"}, |
|
|
{"value": "EST", "label": "Experience Section Title"}, |
|
|
{"value": "EJT", "label": "Experience Job Title"}, |
|
|
{"value": "EDT", "label": "Experience Date Range Title"}, |
|
|
{"value": "ECT", "label": "Experience Company Title"}, |
|
|
{"value": "EDC", "label": "Experience Description Content"} |
|
|
] |
|
|
|
|
|
|
|
|
self.Resume_tokenizer = LongformerTokenizer.from_pretrained("allenai/longformer-base-4096") |
|
|
self.Resume_tokenizer.cls_token |
|
|
|
|
|
|
|
|
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
|
self.Resume_model = LongformerSentenceClassifier(num_labels=Resume_num_labels) |
|
|
self.Resume_model.to(self.device) |
|
|
|
|
|
self.Resume_model.load_state_dict(torch.load(path + "/ResumeSegmentClassifier8thEpochV3.pth", map_location=self.device)) |
|
|
|
|
|
|
|
|
self.Resume_model.eval() |
|
|
nlp = spacy.load("en_core_web_lg") |
|
|
self.skill_extractor = SkillExtractor(nlp, SKILL_DB, PhraseMatcher) |
|
|
|
|
|
|
|
|
def predict_resume_sections(self, model, text, tokenizer, device): |
|
|
model.eval() |
|
|
|
|
|
|
|
|
encoding = tokenizer( |
|
|
text, |
|
|
return_tensors="pt", |
|
|
truncation=True, |
|
|
padding="max_length", |
|
|
max_length=4096 |
|
|
) |
|
|
|
|
|
input_ids = encoding["input_ids"].to(device) |
|
|
attention_mask = encoding["attention_mask"].to(device) |
|
|
|
|
|
|
|
|
cls_positions = (input_ids == tokenizer.cls_token_id).nonzero(as_tuple=True)[1] |
|
|
cls_positions = cls_positions.unsqueeze(0).to(device) |
|
|
|
|
|
|
|
|
global_attention_mask = torch.zeros_like(input_ids) |
|
|
global_attention_mask[:, cls_positions] = 1 |
|
|
|
|
|
|
|
|
with torch.no_grad(): |
|
|
logits = model( |
|
|
input_ids=input_ids, |
|
|
attention_mask=attention_mask, |
|
|
global_attention_mask=global_attention_mask, |
|
|
cls_positions=cls_positions |
|
|
) |
|
|
|
|
|
logits = logits.squeeze(0) |
|
|
probs = F.softmax(logits, dim=-1) |
|
|
predictions = torch.argmax(probs, dim=-1) |
|
|
|
|
|
return predictions.cpu().numpy() |
|
|
|
|
|
|
|
|
|
|
|
def capture_sentences(self, lines): |
|
|
combined_text = " ".join(lines) |
|
|
sentences = re.split(r"(?<=\.)\s+|(?<=\!)\s+|(?<=\?)\s+", combined_text) |
|
|
return [sentence.strip() for sentence in sentences if sentence.strip()] |
|
|
|
|
|
def extract_resume_sections(self, text): |
|
|
lines = text.splitlines() |
|
|
lines = [line for line in text.splitlines() if line.strip()] |
|
|
text = lines |
|
|
|
|
|
concatenated_text = " ".join(f"{self.Resume_tokenizer.cls_token} {sentence}" for sentence in text) |
|
|
|
|
|
predictions = self.predict_resume_sections(self.Resume_model, concatenated_text, self.Resume_tokenizer, self.device) |
|
|
return predictions, text |
|
|
|
|
|
def extract_resume_roles(self, text): |
|
|
lines = text.splitlines() |
|
|
lines = [line for line in text.splitlines() if line.strip()] |
|
|
text = lines |
|
|
|
|
|
concatenated_text = " ".join(f"{self.Resume_tokenizer.cls_token} {sentence}" for sentence in text) |
|
|
|
|
|
predictions = self.predict_resume_sections(self.Resume_model, concatenated_text, self.Resume_tokenizer, self.device) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
roles = [] |
|
|
|
|
|
i = -1 |
|
|
for item in predictions[:len(predictions) - 1]: |
|
|
|
|
|
i+=1 |
|
|
|
|
|
if len(roles) == 0 and self.Resume_labels[item]['value'] == "EJT": |
|
|
roles.append({"title": [lines[i]], "description": []}) |
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if self.Resume_labels[item]['value'] == "EJT": |
|
|
|
|
|
if len(roles[len(roles) - 1]["description"]) < 1: |
|
|
roles[len(roles) - 1]["title"].append(lines[i]) |
|
|
continue |
|
|
|
|
|
if len(roles[len(roles) - 1]["description"]) > 0: |
|
|
roles.append({"title": [lines[i]], "description": []}) |
|
|
continue |
|
|
|
|
|
|
|
|
if self.Resume_labels[item]['value'] == "EDC": |
|
|
|
|
|
if i - 1 > 0 and i + 1 < len(predictions) and self.Resume_labels[predictions[i - 1]]['value'] == "EJT" and self.Resume_labels[predictions[i + 1]]['value'] == "EJT": |
|
|
roles[len(roles) - 1]["title"].append(lines[i]) |
|
|
continue |
|
|
if roles: |
|
|
roles[-1]["description"].append(lines[i]) |
|
|
else: |
|
|
|
|
|
print("Warning: Description found but no role header exists. Skipping this description.") |
|
|
|
|
|
|
|
|
if self.Resume_labels[item]['value'] != "EDC" and self.Resume_labels[item]['value'] != "EJT": |
|
|
if i - 1 > 0 and i + 1 < len(predictions) and self.Resume_labels[predictions[i - 1]]['value'] == "EDC" and self.Resume_labels[predictions[i + 1]]['value'] == "EDC": |
|
|
roles[-1]["description"].append(lines[i]) |
|
|
|
|
|
|
|
|
for item in roles: |
|
|
sentences = self.capture_sentences(item['description']) |
|
|
item['description'] = sentences |
|
|
|
|
|
return roles |
|
|
|
|
|
def parse_date(self, date_str): |
|
|
"""Tries multiple formats to parse a date string into a datetime object. |
|
|
|
|
|
- Returns the current date if 'present' or 'current' is given. |
|
|
- Tries multiple formats and prompts if ambiguous. |
|
|
""" |
|
|
|
|
|
|
|
|
present_keywords = {"present", "current", "now", "today"} |
|
|
if date_str.strip().lower() in present_keywords: |
|
|
return datetime.today() |
|
|
|
|
|
date_formats = [ |
|
|
("%b %Y", "MMM YYYY"), |
|
|
("%B %Y", "MMMM YYYY"), |
|
|
("%Y-%m-%d", "YYYY-MM-DD"), |
|
|
("%Y/%m/%d", "YYYY/MM/DD"), |
|
|
("%Y.%m.%d", "YYYY.MM.DD"), |
|
|
("%d-%m-%Y", "DD-MM-YYYY"), |
|
|
("%d/%m/%Y", "DD/MM/YYYY"), |
|
|
("%d.%m.%Y", "DD.MM.YYYY"), |
|
|
("%m-%d-%Y", "MM-DD-YYYY"), |
|
|
("%m/%d/%Y", "MM/DD/YYYY"), |
|
|
("%m.%d.%Y", "MM.DD.YYYY"), |
|
|
("%d %b %Y", "DD MMM YYYY"), |
|
|
("%d %B %Y", "DD MMMM YYYY"), |
|
|
("%b-%d-%Y", "MMM-DD-YYYY"), |
|
|
("%b/%d/%Y", "MMM/DD/YYYY"), |
|
|
("%B-%d-%Y", "MMMM-DD-YYYY"), |
|
|
("%B/%d/%Y", "MMMM/DD/YYYY"), |
|
|
("%d-%b-%Y", "DD-MMM-YYYY"), |
|
|
("%d/%b/%Y", "DD/MMM/YYYY"), |
|
|
("%d-%B-%Y", "DD-MMMM-YYYY"), |
|
|
("%d/%B/%Y", "DD/MMMM/YYYY"), |
|
|
("%Y", "YYYY"), |
|
|
("%m/%Y", "MM/YYYY"), |
|
|
("%m-%Y", "MM-YYYY"), |
|
|
("%m.%Y", "MM.YYYY"), |
|
|
("%Y%m%d", "YYYYMMDD"), |
|
|
("%d%m%Y", "DDMMYYYY"), |
|
|
("%m%d%Y", "MMDDYYYY"), |
|
|
("%Y-%b-%d", "YYYY-MMM-DD"), |
|
|
("%Y/%b/%d", "YYYY/MMM/DD"), |
|
|
("%Y-%B-%d", "YYYY-MMMM-DD"), |
|
|
("%Y/%B/%d", "YYYY/MMMM/DD"), |
|
|
("%d-%b-%y", "DD-MMM-YY"), |
|
|
("%d/%b/%y", "DD/MMM/YY"), |
|
|
("%d-%B-%y", "DD-MMMM-YY"), |
|
|
("%d/%B/%y", "DD/MMMM/YY"), |
|
|
("%d-%m-%y", "DD-MM-YY"), |
|
|
("%d/%m/%y", "DD/MM/YY"), |
|
|
("%m-%d-%y", "MM-DD-YY"), |
|
|
("%m/%d/%y", "MM/DD/YY"), |
|
|
("%A, %d %B %Y", "Day, DD MMMM YYYY"), |
|
|
("%a, %d %b %Y", "Day Abbr, DD MMM YYYY"), |
|
|
] |
|
|
|
|
|
possible_dates = [] |
|
|
|
|
|
for fmt, fmt_name in date_formats: |
|
|
try: |
|
|
parsed_date = datetime.strptime(date_str, fmt) |
|
|
possible_dates.append((parsed_date, fmt_name)) |
|
|
except ValueError: |
|
|
continue |
|
|
|
|
|
|
|
|
if not possible_dates: |
|
|
|
|
|
return [] |
|
|
|
|
|
|
|
|
if len(possible_dates) == 1: |
|
|
return possible_dates[0][0] |
|
|
|
|
|
|
|
|
print(f"Ambiguous date: '{date_str}' could mean:") |
|
|
for idx, (date, fmt_name) in enumerate(possible_dates): |
|
|
print(f"{idx + 1}. {date.strftime('%Y-%m-%d')} ({fmt_name})") |
|
|
|
|
|
print("Defaulted to: ", possible_dates[0][1]) |
|
|
return possible_dates[0][0] |
|
|
|
|
|
def extract_dates_from_context(self, context): |
|
|
"""Extract dates from context using the date extraction endpoint.""" |
|
|
max_retries = 5 |
|
|
retry_delay = 5 |
|
|
startup_delay = 10 |
|
|
|
|
|
for attempt in range(max_retries): |
|
|
try: |
|
|
headers = { |
|
|
"Authorization": f"Bearer {self.hf_token}" |
|
|
} |
|
|
response = requests.post( |
|
|
"https://iprlg93qeghlgufi.us-east-1.aws.endpoints.huggingface.cloud", |
|
|
json={"inputs": context}, |
|
|
headers=headers, |
|
|
timeout=30 |
|
|
) |
|
|
|
|
|
if response.status_code == 200: |
|
|
return response.json() |
|
|
elif response.status_code == 503: |
|
|
if attempt < max_retries - 1: |
|
|
if attempt == 0: |
|
|
print(f"Service temporarily unavailable (503). Waiting 20 seconds... (Attempt {attempt + 1}/{max_retries})") |
|
|
time.sleep(20) |
|
|
else: |
|
|
print(f"Service temporarily unavailable (503). Waiting 2 seconds... (Attempt {attempt + 1}/{max_retries})") |
|
|
time.sleep(2) |
|
|
continue |
|
|
else: |
|
|
print("Service unavailable after maximum retries") |
|
|
return {"start_date": None, "end_date": None} |
|
|
elif response.status_code == 404: |
|
|
print("Endpoint not found. Please check if the endpoint URL is correct.") |
|
|
return {"start_date": None, "end_date": None} |
|
|
elif response.status_code == 401: |
|
|
print("Authentication failed. Please check your Hugging Face token.") |
|
|
return {"start_date": None, "end_date": None} |
|
|
else: |
|
|
print(f"Error calling date extraction endpoint: {response.status_code}") |
|
|
print(f"Response: {response.text}") |
|
|
return {"start_date": None, "end_date": None} |
|
|
|
|
|
except requests.exceptions.Timeout: |
|
|
print(f"Request timed out. Attempt {attempt + 1}/{max_retries}") |
|
|
if attempt < max_retries - 1: |
|
|
time.sleep(retry_delay) |
|
|
continue |
|
|
return {"start_date": None, "end_date": None} |
|
|
except Exception as e: |
|
|
print(f"Exception while calling date extraction endpoint: {str(e)}") |
|
|
if attempt < max_retries - 1: |
|
|
time.sleep(retry_delay) |
|
|
continue |
|
|
return {"start_date": None, "end_date": None} |
|
|
|
|
|
return {"start_date": None, "end_date": None} |
|
|
|
|
|
def extract_length(self, start_date, end_date): |
|
|
""" |
|
|
Args: |
|
|
start_date (datetime): The earlier date. |
|
|
end_date (datetime): The later date. |
|
|
|
|
|
Returns: |
|
|
int: Number of full months between the dates. |
|
|
""" |
|
|
try: |
|
|
if start_date > end_date: |
|
|
|
|
|
return 0 |
|
|
except: |
|
|
return 0 |
|
|
|
|
|
|
|
|
year_diff = end_date.year - start_date.year |
|
|
month_diff = end_date.month - start_date.month |
|
|
|
|
|
|
|
|
total_months = year_diff * 12 + month_diff |
|
|
return total_months |
|
|
|
|
|
def label_resume(self, text): |
|
|
results = self.extract_resume_roles(text) |
|
|
for item in results: |
|
|
|
|
|
context = (" ".join(item["title"])) |
|
|
dates = self.extract_dates_from_context(context) |
|
|
date_started = dates.get("start_date") |
|
|
date_ended = dates.get("end_date") |
|
|
|
|
|
|
|
|
try: |
|
|
date_started_formatted = self.parse_date(date_started) if date_started else None |
|
|
except ValueError: |
|
|
date_started_formatted = None |
|
|
|
|
|
try: |
|
|
date_ended_formatted = self.parse_date(date_ended) if date_ended else None |
|
|
except ValueError: |
|
|
date_ended_formatted = None |
|
|
|
|
|
try: |
|
|
role_length = self.extract_length(date_started_formatted, date_ended_formatted) |
|
|
except: |
|
|
role_length = 0 |
|
|
item["dates"] = {"date_started": date_started, "date_ended": date_ended} |
|
|
item["role_length"] = role_length |
|
|
|
|
|
|
|
|
item["skills"] = [] |
|
|
seen = set() |
|
|
annotations = self.skill_extractor.annotate(" ".join(item["description"])) |
|
|
if 'results' in annotations and 'full_matches' in annotations['results']: |
|
|
for result in annotations['results']['full_matches']: |
|
|
|
|
|
skill_info = SKILL_DB.get(result["skill_id"], {}) |
|
|
skill_name = skill_info.get('skill_name', 'Unknown Skill') |
|
|
if skill_name not in seen: |
|
|
seen.add(skill_name) |
|
|
item["skills"].append({'name': skill_name, 'skill_id': result["skill_id"]}) |
|
|
if 'results' in annotations and 'ngram_scored' in annotations['results']: |
|
|
for result in annotations['results']['ngram_scored']: |
|
|
if result['score'] >= 1: |
|
|
|
|
|
skill_info = SKILL_DB.get(result["skill_id"], {}) |
|
|
skill_name = skill_info.get('skill_name', 'Unknown Skill') |
|
|
if skill_name not in seen: |
|
|
seen.add(skill_name) |
|
|
item["skills"].append({'name': skill_name, 'skill_id': result["skill_id"]}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return results |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __call__(self, data: Dict[str, Any]) -> List[Dict[str, Any]]: |
|
|
""" |
|
|
data args: |
|
|
inputs (:obj: `str` | `PIL.Image` | `np.array`) |
|
|
kwargs |
|
|
Return: |
|
|
A :obj:`list` | `dict`: will be serialized and returned |
|
|
""" |
|
|
text = data['inputs'] |
|
|
|
|
|
|
|
|
label_resume = self.label_resume(text) |
|
|
return label_resume |
|
|
|
|
|
|
|
|
class LongformerSentenceClassifier(nn.Module): |
|
|
def __init__(self, model_name="allenai/longformer-base-4096", num_labels=Resume_num_labels): |
|
|
""" |
|
|
Custom Longformer model for sentence classification. |
|
|
|
|
|
Args: |
|
|
model_name (str): Hugging Face Longformer model. |
|
|
num_labels (int): Number of possible sentence labels. |
|
|
""" |
|
|
super(LongformerSentenceClassifier, self).__init__() |
|
|
self.longformer = LongformerModel.from_pretrained(model_name) |
|
|
self.classifier = nn.Linear(self.longformer.config.hidden_size, num_labels) |
|
|
|
|
|
def forward(self, input_ids, attention_mask, global_attention_mask, cls_positions): |
|
|
""" |
|
|
Forward pass for sentence classification. |
|
|
|
|
|
Args: |
|
|
input_ids (Tensor): Tokenized input IDs, shape (batch_size, max_length) |
|
|
attention_mask (Tensor): Attention mask, shape (batch_size, max_length) |
|
|
global_attention_mask (Tensor): Global attention mask, shape (batch_size, max_length) |
|
|
cls_positions (List[Tensor]): Indices of `[CLS]` tokens for each batch element. |
|
|
""" |
|
|
outputs = self.longformer( |
|
|
input_ids=input_ids, |
|
|
attention_mask=attention_mask, |
|
|
global_attention_mask=global_attention_mask |
|
|
) |
|
|
|
|
|
last_hidden_state = outputs.last_hidden_state |
|
|
cls_positions = cls_positions.view(input_ids.shape[0], -1) |
|
|
cls_embeddings = last_hidden_state.gather(1, cls_positions.unsqueeze(-1).expand(-1, -1, last_hidden_state.size(-1))) |
|
|
logits = self.classifier(cls_embeddings) |
|
|
|
|
|
return logits |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
my_handler = EndpointHandler(path=".") |
|
|
|
|
|
|
|
|
payload = {"inputs": """ |
|
|
CASHIER |
|
|
|
|
|
|
|
|
Professional Summary |
|
|
Results-oriented, strategic sales professional with two years in the Retail industry. Cashier who is highly energetic, outgoing and detail-oriented. Handles multiple responsibilities simultaneously while providing exceptional customer service. Reliable and friendly team member who quickly learns and masters new concepts and skills. Passionate about helping customers and creating a satisfying shopping experience. |
|
|
|
|
|
|
|
|
Core Qualifications |
|
|
• Excellent multi-tasker |
|
|
• Strong communication skills |
|
|
• Flexible schedule |
|
|
• Proficient in MS Office |
|
|
Cash handling accuracy |
|
|
Mathematical aptitude |
|
|
Organized |
|
|
Time management |
|
|
Detail-oriented |
|
|
|
|
|
|
|
|
Experience |
|
|
Cashier |
|
|
October 2014 to Current |
|
|
Company Name - City , State |
|
|
• Receive payment by cash, check, credit cards, vouchers, or automatic debits. |
|
|
• Issue receipts, refunds, credits, or change due to customers. |
|
|
• Assist customers by providing information and resolving their complaints. |
|
|
• Establish or identify prices of goods, services or admission, and tabulate bills using calculators, cash registers, or optical price scanners. |
|
|
• Greet customers entering establishments. |
|
|
• Answer customers' questions, and provide information on procedures or policies. |
|
|
• Process merchandise returns and exchanges. |
|
|
• Maintain clean and orderly checkout areas and complete other general cleaning duties, such as mopping floors and emptying trash cans. |
|
|
• Stock shelves, and mark prices on shelves and items. |
|
|
• Count money in cash drawers at the beginning of shifts to ensure that amounts are correct and that there is adequate change. |
|
|
• Calculate total payments received during a time period, and reconcile this with total sales. |
|
|
• Monitor checkout stations to ensure that they have adequate cash available and that they are staffed appropriately. |
|
|
• Assist with duties in other areas of the store, such as monitoring fitting rooms or bagging and carrying out customers' items. |
|
|
• Sort, count, and wrap currency and coins. |
|
|
• Compute and record totals of transactions. |
|
|
• Compile and maintain non-monetary reports and records. |
|
|
• Weigh items sold by weight to determine prices. |
|
|
• Cash checks for customers. |
|
|
|
|
|
Inbound/Return |
|
|
June 2014 to September 2014 |
|
|
Company Name - City , State |
|
|
Changed equipment over to new product.Maintained proper stock levels on a line.Helped achieve company goals by supporting production workers. |
|
|
|
|
|
Cashier |
|
|
February 2014 to June 2014 |
|
|
Company Name - City , State |
|
|
• Receive payment by cash, check, credit cards, vouchers, or automatic debits. |
|
|
• Issue receipts, refunds, credits, or change due to customers. |
|
|
• Assist customers by providing information and resolving their complaints. |
|
|
• Establish or identify prices of goods, services or admission, and tabulate bills using calculators, cash registers, or optical price scanners. |
|
|
• Greet customers entering establishments. |
|
|
• Answer customers' questions, and provide information on procedures or policies. |
|
|
• Process merchandise returns and exchanges. |
|
|
• Maintain clean and orderly checkout areas and complete other general cleaning duties, such as mopping floors and emptying trash cans. |
|
|
• Stock shelves, and mark prices on shelves and items. |
|
|
• Count money in cash drawers at the beginning of shifts to ensure that amounts are correct and that there is adequate change. |
|
|
• Calculate total payments received during a time period, and reconcile this with total sales. |
|
|
• Monitor checkout stations to ensure that they have adequate cash available and that they are staffed appropriately. |
|
|
• Assist with duties in other areas of the store, such as monitoring fitting rooms or bagging and carrying out customers' items. |
|
|
• Sort, count, and wrap currency and coins. |
|
|
• Compute and record totals of transactions. |
|
|
• Compile and maintain non-monetary reports and records. |
|
|
• Weigh items sold by weight to determine prices. |
|
|
• Cash checks for customers. |
|
|
|
|
|
Apparel Associate |
|
|
January 2014 to February 2014 |
|
|
Company Name - City , State |
|
|
• Greet customers and ascertain what each customer wants or needs. |
|
|
• Describe merchandise and explain use, operation, and care of merchandise to customers. |
|
|
• Recommend, select, and help locate or obtain merchandise based on customer needs and desires. |
|
|
• Compute sales prices, total purchases and receive and process cash or credit payment. |
|
|
• Answer questions regarding the store and its merchandise. |
|
|
• Maintain knowledge of current sales and promotions, policies regarding payment and exchanges, and security practices. |
|
|
• Maintain records related to sales. |
|
|
• Watch for and recognize security risks and thefts, and know how to prevent or handle these situations. |
|
|
• Inventory stock and requisition new stock. |
|
|
• Help customers try on or fit merchandise. |
|
|
• Clean shelves, counters, and tables. |
|
|
• Exchange merchandise for customers and accept returns. |
|
|
• Open and close cash registers, performing tasks such as counting money, separating charge slips, coupons, and vouchers, balancing cash drawers, and making deposits. |
|
|
|
|
|
Apparel Associate |
|
|
October 2013 to December 2013 |
|
|
Company Name - City , State |
|
|
• Greet customers and ascertain what each customer wants or needs. |
|
|
• Describe merchandise and explain use, operation, and care of merchandise to customers. |
|
|
• Recommend, select, and help locate or obtain merchandise based on customer needs and desires. |
|
|
• Compute sales prices, total purchases and receive and process cash or credit payment. |
|
|
• Answer questions regarding the store and its merchandise. |
|
|
• Maintain knowledge of current sales and promotions, policies regarding payment and exchanges, and security practices. |
|
|
• Maintain records related to sales. |
|
|
• Watch for and recognize security risks and thefts, and know how to prevent or handle these situations. |
|
|
• Inventory stock and requisition new stock. |
|
|
• Help customers try on or fit merchandise. |
|
|
• Clean shelves, counters, and tables. |
|
|
• Exchange merchandise for customers and accept returns. |
|
|
• Open and close cash registers, performing tasks such as counting money, separating charge slips, coupons, and vouchers, balancing cash drawers, and making deposits. |
|
|
|
|
|
Cashier |
|
|
August 2012 to August 2013 |
|
|
Company Name - City , State |
|
|
• Receive payment by cash, check, credit cards, vouchers, or automatic debits. |
|
|
• Issue receipts, refunds, credits, or change due to customers. |
|
|
• Assist customers by providing information and resolving their complaints. |
|
|
• Establish or identify prices of goods, services or admission, and tabulate bills using calculators, cash registers, or optical price scanners. |
|
|
• Greet customers entering establishments. |
|
|
• Answer customers' questions, and provide information on procedures or policies. |
|
|
• Process merchandise returns and exchanges. |
|
|
• Maintain clean and orderly checkout areas and complete other general cleaning duties, such as mopping floors and emptying trash cans. |
|
|
• Stock shelves, and mark prices on shelves and items. |
|
|
• Count money in cash drawers at the beginning of shifts to ensure that amounts are correct and that there is adequate change. |
|
|
• Calculate total payments received during a time period, and reconcile this with total sales. |
|
|
• Monitor checkout stations to ensure that they have adequate cash available and that they are staffed appropriately. |
|
|
• Assist with duties in other areas of the store, such as monitoring fitting rooms or bagging and carrying out customers' items. |
|
|
• Sort, count, and wrap currency and coins. |
|
|
• Compute and record totals of transactions. |
|
|
• Compile and maintain non-monetary reports and records. |
|
|
• Weigh items sold by weight to determine prices. |
|
|
• Cash checks for customers. |
|
|
|
|
|
|
|
|
Education |
|
|
5 2013 |
|
|
Member of FFA, FCA, Pep Club, and mentoring children from one of the public elementary schools |
|
|
|
|
|
|
|
|
Skills |
|
|
• Calculators |
|
|
• Cash registers |
|
|
• Credit, debit, checks and money |
|
|
• Inventory |
|
|
• Sales, scanners, tables |
|
|
"""} |
|
|
|
|
|
|
|
|
|
|
|
non_holiday_pred=my_handler(payload) |
|
|
|
|
|
|
|
|
|
|
|
print(non_holiday_pred) |
|
|
|