Update README.md
Browse files
README.md
CHANGED
@@ -67,14 +67,58 @@ For simplicity, you can run this here:
|
|
67 |
Alternatively, embed the following code in your application:
|
68 |
|
69 |
```python
|
70 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
|
72 |
-
model_name = "gsar78/HellenicSentimentAI_v2"
|
73 |
|
74 |
-
# Load the configuration, tokenizer, and model
|
75 |
-
config = AutoConfig.from_pretrained(model_name)
|
76 |
-
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
77 |
-
model = AutoModelForSequenceClassification.from_pretrained(model_name)
|
78 |
|
79 |
# Function to predict sentiment and emotion
|
80 |
def predict(texts):
|
@@ -131,6 +175,8 @@ def predict(texts):
|
|
131 |
sample_texts = ["Απολαύσαμε μια υπέροχη βραδιά σε αυτό το εστιατόριο. "
|
132 |
"Το μενού ήταν πολύ καλά σχεδιασμένο και κάθε πιάτο ήταν μια γευστική έκπληξη. "
|
133 |
"Η εξυπηρέτηση ήταν άψογη και η ατμόσφαιρα ευχάριστη. Σίγουρα θα επιστρέψουμε για άλλη μια φορά."]
|
|
|
|
|
134 |
print("Text: ", sample_texts[0])
|
135 |
emotion_results, sentiment_results = predict(sample_texts)
|
136 |
|
@@ -147,10 +193,16 @@ for label, prob in emotion_results.items():
|
|
147 |
# Change the text and predict again
|
148 |
# Print the results
|
149 |
print("\n======")
|
|
|
|
|
150 |
print("\nNew prediction:")
|
151 |
sample_texts = ["Η τελευταία μας εμπειρία στο εστιατόριο αυτό δεν ήταν ιδιαίτερα θετική. "
|
152 |
"Αν και ο χώρος είχε μια ενδιαφέρουσα ατμόσφαιρα, το φαγητό ήταν μέτριο και η εξυπηρέτηση ήταν αργή. "
|
153 |
"Οι τιμές ήταν επίσης απογοητευτικές για την ποιότητα που προσφέρθηκε."]
|
|
|
|
|
|
|
|
|
154 |
print("Text: ", sample_texts[0])
|
155 |
emotion_results, sentiment_results = predict(sample_texts)
|
156 |
|
@@ -160,6 +212,7 @@ for label, prob in sentiment_results.items():
|
|
160 |
print("\nEmotion probabilities (%):")
|
161 |
for label, prob in emotion_results.items():
|
162 |
print(f" {label}: {prob:.2f}%")
|
|
|
163 |
```
|
164 |
|
165 |
Expected output:
|
|
|
67 |
Alternatively, embed the following code in your application:
|
68 |
|
69 |
```python
|
70 |
+
import torch
|
71 |
+
|
72 |
+
from transformers import AutoTokenizer, AutoConfig,XLMRobertaForSequenceClassification, PreTrainedModel
|
73 |
+
from torch import nn
|
74 |
+
from torch.nn import Dropout
|
75 |
+
|
76 |
+
|
77 |
+
# Define the CustomModel class which is predicting Both SENTIMENT POLARITY & EMOTIONS
|
78 |
+
class CustomModel(XLMRobertaForSequenceClassification):
|
79 |
+
def __init__(self, config, num_emotion_labels):
|
80 |
+
super(CustomModel, self).__init__(config)
|
81 |
+
self.num_emotion_labels = num_emotion_labels
|
82 |
+
self.dropout_emotion = nn.Dropout(config.hidden_dropout_prob)
|
83 |
+
self.emotion_classifier = nn.Sequential(
|
84 |
+
nn.Linear(config.hidden_size, 512),
|
85 |
+
nn.Mish(),
|
86 |
+
nn.Dropout(0.3),
|
87 |
+
nn.Linear(512, num_emotion_labels)
|
88 |
+
)
|
89 |
+
self._init_weights(self.emotion_classifier[0])
|
90 |
+
self._init_weights(self.emotion_classifier[3])
|
91 |
+
def _init_weights(self, module):
|
92 |
+
if isinstance(module, nn.Linear):
|
93 |
+
module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
|
94 |
+
if module.bias is not None:
|
95 |
+
module.bias.data.zero_()
|
96 |
+
def forward(self, input_ids=None, attention_mask=None, sentiment=None, labels=None):
|
97 |
+
outputs = self.roberta(input_ids=input_ids, attention_mask=attention_mask)
|
98 |
+
sequence_output = outputs[0]
|
99 |
+
if len(sequence_output.shape) != 3:
|
100 |
+
raise ValueError(f"Expected sequence_output to have 3 dimensions, got {sequence_output.shape}")
|
101 |
+
cls_hidden_states = sequence_output[:, 0, :]
|
102 |
+
cls_hidden_states = self.dropout_emotion(cls_hidden_states)
|
103 |
+
emotion_logits = self.emotion_classifier(cls_hidden_states)
|
104 |
+
with torch.no_grad():
|
105 |
+
cls_token_state = sequence_output[:, 0, :].unsqueeze(1)
|
106 |
+
sentiment_logits = self.classifier(cls_token_state).squeeze(1)
|
107 |
+
if labels is not None:
|
108 |
+
class_weights = torch.tensor([1.0] * self.num_emotion_labels).to(labels.device)
|
109 |
+
loss_fct = nn.BCEWithLogitsLoss(pos_weight=class_weights)
|
110 |
+
loss = loss_fct(emotion_logits, labels)
|
111 |
+
return {"loss": loss, "emotion_logits": emotion_logits, "sentiment_logits": sentiment_logits}
|
112 |
+
return {"emotion_logits": emotion_logits, "sentiment_logits": sentiment_logits}
|
113 |
+
|
114 |
+
|
115 |
+
# Load the tokenizer and model from the local directory
|
116 |
+
model_dir = "gsar78/HellenicSentimentAI_v2"
|
117 |
+
tokenizer = AutoTokenizer.from_pretrained(model_dir)
|
118 |
+
config = AutoConfig.from_pretrained(model_dir)
|
119 |
+
model = CustomModel.from_pretrained(model_dir, config=config, num_emotion_labels=18)
|
120 |
|
|
|
121 |
|
|
|
|
|
|
|
|
|
122 |
|
123 |
# Function to predict sentiment and emotion
|
124 |
def predict(texts):
|
|
|
175 |
sample_texts = ["Απολαύσαμε μια υπέροχη βραδιά σε αυτό το εστιατόριο. "
|
176 |
"Το μενού ήταν πολύ καλά σχεδιασμένο και κάθε πιάτο ήταν μια γευστική έκπληξη. "
|
177 |
"Η εξυπηρέτηση ήταν άψογη και η ατμόσφαιρα ευχάριστη. Σίγουρα θα επιστρέψουμε για άλλη μια φορά."]
|
178 |
+
|
179 |
+
|
180 |
print("Text: ", sample_texts[0])
|
181 |
emotion_results, sentiment_results = predict(sample_texts)
|
182 |
|
|
|
193 |
# Change the text and predict again
|
194 |
# Print the results
|
195 |
print("\n======")
|
196 |
+
|
197 |
+
|
198 |
print("\nNew prediction:")
|
199 |
sample_texts = ["Η τελευταία μας εμπειρία στο εστιατόριο αυτό δεν ήταν ιδιαίτερα θετική. "
|
200 |
"Αν και ο χώρος είχε μια ενδιαφέρουσα ατμόσφαιρα, το φαγητό ήταν μέτριο και η εξυπηρέτηση ήταν αργή. "
|
201 |
"Οι τιμές ήταν επίσης απογοητευτικές για την ποιότητα που προσφέρθηκε."]
|
202 |
+
|
203 |
+
|
204 |
+
|
205 |
+
|
206 |
print("Text: ", sample_texts[0])
|
207 |
emotion_results, sentiment_results = predict(sample_texts)
|
208 |
|
|
|
212 |
print("\nEmotion probabilities (%):")
|
213 |
for label, prob in emotion_results.items():
|
214 |
print(f" {label}: {prob:.2f}%")
|
215 |
+
|
216 |
```
|
217 |
|
218 |
Expected output:
|