|
|
--- |
|
|
license: mit |
|
|
--- |
|
|
|
|
|
|
|
|
```python |
|
|
import torch |
|
|
from torch import nn |
|
|
from transformers import RobertaConfig, RobertaModel, RobertaTokenizer |
|
|
import torch.optim as optim |
|
|
|
|
|
|
|
|
class HelpdeskReviewModel(nn.Module): |
|
|
def __init__(self): |
|
|
super(HelpdeskReviewModel, self).__init__() |
|
|
self.bert = RobertaModel.from_pretrained('roberta-base') |
|
|
self.drop = nn.Dropout(p=0.2) |
|
|
|
|
|
# Fully connected layers |
|
|
self.fc1 = nn.Linear(self.bert.config.hidden_size, 512) # First fully connected layer |
|
|
self.fc2 = nn.Linear(512, 256) # Second fully connected layer |
|
|
self.fc3 = nn.Linear(256, 128) # Third fully connected layer |
|
|
|
|
|
# Activation function |
|
|
self.relu = nn.ReLU() |
|
|
|
|
|
self.output = nn.Linear(128, 4) # 4 outputs |
|
|
self.sigmoid = nn.Sigmoid() |
|
|
|
|
|
state_dict = torch.hub.load_state_dict_from_url(f"https://huggingface.co/KameronB/SITCCSA/resolve/main/pytorch_model.bin", model_dir="./model", file_name="sitccsa_pytorch_model.bin") |
|
|
# if running on cpu |
|
|
# state_dict = torch.hub.load_state_dict_from_url(f"https://huggingface.co/KameronB/SITCCSA/resolve/main/pytorch_model.bin", model_dir="./model", file_name="sitccsa_pytorch_model.bin", map_location=torch.device('cpu')) |
|
|
|
|
|
|
|
|
self.load_state_dict(state_dict) |
|
|
|
|
|
def forward(self, input_ids, attention_mask): |
|
|
_, pooled_output = self.bert( |
|
|
input_ids=input_ids, |
|
|
attention_mask=attention_mask, |
|
|
return_dict=False |
|
|
) |
|
|
output = self.drop(pooled_output) |
|
|
|
|
|
# apply new hidden layers |
|
|
output = self.relu(self.fc1(output)) |
|
|
output = self.relu(self.fc2(output)) |
|
|
output = self.relu(self.fc3(output)) |
|
|
|
|
|
return self.sigmoid(self.output(output)) |
|
|
``` |
|
|
|
|
|
```python |
|
|
|
|
|
tokenizer = RobertaTokenizer.from_pretrained('roberta-base') |
|
|
model = HelpdeskReviewModel() |
|
|
|
|
|
|
|
|
def make_prediction(model, tokenizer, text, max_length=512): |
|
|
# Tokenize the input text and convert to tensor |
|
|
inputs = tokenizer.encode_plus( |
|
|
text, |
|
|
add_special_tokens=True, # Add '[CLS]' and '[SEP]' |
|
|
max_length=max_length, # Pad & truncate all sentences. |
|
|
padding='max_length', |
|
|
truncation=True, |
|
|
return_tensors="pt" # Return PyTorch tensors. |
|
|
) |
|
|
|
|
|
# Move tensors to the same device as model |
|
|
input_ids = inputs['input_ids'] |
|
|
attention_mask = inputs['attention_mask'] |
|
|
if torch.cuda.is_available(): |
|
|
input_ids = input_ids.cuda() |
|
|
attention_mask = attention_mask.cuda() |
|
|
model = model.cuda() |
|
|
|
|
|
# Make prediction |
|
|
with torch.no_grad(): |
|
|
outputs = model(input_ids, attention_mask=attention_mask) |
|
|
|
|
|
# Return probabilities |
|
|
return outputs.cpu().numpy()[0] # Return to CPU and convert to numpy array if not running on CPU |
|
|
|
|
|
# Example usage of the function |
|
|
texts = [ |
|
|
"This Agent is TERRIBLE!: The agent I spoke to on the phone did not seem to have any idea of what he was doing.", |
|
|
"Excellent work!: The tech that installed my software was amazing! Thank you!", |
|
|
"Good Work: The person who anwsered the phone did a pretty good job. It took a bit longer than I would have liked, but they got the job done.", |
|
|
"Bad Computer: My Computer is a piece of junk!!!", |
|
|
"Poor Service: I sent David and email and it took him over 30 seconds to respond. The service is so slow that I missed the solar eclipse.", |
|
|
"Very Slow: The technician was very slow.", |
|
|
"Thank you!: Stanley did a great job installing my software!", |
|
|
"You need better training: These agents need better training, they cant even seem to do simple troubleshooting.", |
|
|
"The technician threatened my life: The technician threatened my life!" |
|
|
] |
|
|
for text in texts: |
|
|
probabilities = make_prediction(model, tokenizer, text) |
|
|
print(probabilities) |
|
|
``` |