| |
| ```python |
| |
| """ |
| Training script for POSNEG dataset sentiment classification |
| """ |
|
|
| import torch |
| from torch.utils.data import DataLoader |
| from transformers import ( |
| AutoTokenizer, |
| AutoModelForSequenceClassification, |
| TrainingArguments, |
| Trainer, |
| ) |
| from datasets import load_dataset |
| import numpy as np |
| from sklearn.metrics import accuracy_score, precision_recall_fscore_support |
|
|
| class POSNEGDataset(torch.utils.data.Dataset): |
| def __init__(self, texts, labels, tokenizer, max_length=512): |
| self.texts = texts |
| self.labels = labels |
| self.tokenizer = tokenizer |
| self.max_length = max_length |
| |
| def __len__(self): |
| return len(self.texts) |
| |
| def __getitem__(self, idx): |
| text = str(self.texts[idx]) |
| label = self.labels[idx] |
| |
| encoding = self.tokenizer( |
| text, |
| truncation=True, |
| padding='max_length', |
| max_length=self.max_length, |
| return_tensors='pt' |
| ) |
| |
| return { |
| 'input_ids': encoding['input_ids'].flatten(), |
| 'attention_mask': encoding['attention_mask'].flatten(), |
| 'labels': torch.tensor(label, dtype=torch.long) |
| } |
|
|
| def compute_metrics(eval_pred): |
| predictions, labels = eval_pred |
| predictions = np.argmax(predictions, axis=1) |
| precision, recall, f1, _ = precision_recall_fscore_support(labels, predictions, average='weighted') |
| acc = accuracy_score(labels, predictions) |
| return { |
| 'accuracy': acc, |
| 'f1': f1, |
| 'precision': precision, |
| 'recall': recall |
| } |
|
|
| def main(): |
| |
| print("Loading POSNEG dataset...") |
| dataset = load_dataset("chaosbringerc/POSNEG") |
| |
| |
| model_name = "bert-base-uncased" |
| tokenizer = AutoTokenizer.from_pretrained(model_name) |
| model = AutoModelForSequenceClassification.from_pretrained( |
| model_name, |
| num_labels=2, |
| id2label={0: "NEGATIVE", 1: "POSITIVE"}, |
| label2id={"NEGATIVE": 0, "POSITIVE": 1} |
| ) |
| |
| |
| train_dataset = POSNEGDataset( |
| texts=dataset['train']['text'], |
| labels=dataset['train']['label'], |
| tokenizer=tokenizer |
| ) |
| |
| eval_dataset = POSNEGDataset( |
| texts=dataset['validation']['text'], |
| labels=dataset['validation']['label'], |
| tokenizer=tokenizer |
| ) |
| |
| |
| training_args = TrainingArguments( |
| output_dir='./results', |
| num_train_epochs=3, |
| per_device_train_batch_size=16, |
| per_device_eval_batch_size=16, |
| warmup_steps=500, |
| weight_decay=0.01, |
| logging_dir='./logs', |
| logging_steps=10, |
| evaluation_strategy="epoch", |
| save_strategy="epoch", |
| load_best_model_at_end=True, |
| ) |
| |
| |
| trainer = Trainer( |
| model=model, |
| args=training_args, |
| train_dataset=train_dataset, |
| eval_dataset=eval_dataset, |
| compute_metrics=compute_metrics, |
| ) |
| |
| |
| print("Starting training...") |
| trainer.train() |
| |
| |
| print("Saving model...") |
| trainer.save_model() |
| tokenizer.save_pretrained('./results') |
| |
| print("Training completed!") |
|
|
| if __name__ == "__main__": |
| main() |