Spaces:
Sleeping
Sleeping
| import json | |
| import torch | |
| import random | |
| import numpy as np | |
| from sklearn.model_selection import train_test_split | |
| from transformers import ( | |
| AutoTokenizer, | |
| AutoModelForSequenceClassification, | |
| TrainingArguments, | |
| Trainer | |
| ) | |
| from collections import Counter | |
| random.seed(42) | |
| np.random.seed(42) | |
| torch.manual_seed(42) | |
| torch.cuda.manual_seed_all(42) | |
| with open("intents_augmented.json", encoding="utf-8") as f: | |
| data = json.load(f) | |
| sentences = [] | |
| labels = [] | |
| label2id = {} | |
| id2label = {} | |
| for i, intent in enumerate(data["intents"]): | |
| tag = intent["tag"] | |
| label2id[tag] = i | |
| id2label[i] = tag | |
| for pattern in intent["patterns"]: | |
| sentences.append(pattern) | |
| labels.append(i) | |
| counts = Counter(labels) | |
| max_count = min(max(counts.values()), 300) | |
| balanced_sentences = [] | |
| balanced_labels = [] | |
| for label in set(labels): | |
| label_sentences = [s for s, l in zip(sentences, labels) if l == label] | |
| if len(label_sentences) > max_count: | |
| sampled = random.sample(label_sentences, max_count) | |
| else: | |
| sampled = label_sentences * (max_count // len(label_sentences)) + \ | |
| random.sample(label_sentences, max_count % len(label_sentences)) | |
| balanced_sentences.extend(sampled) | |
| balanced_labels.extend([label] * max_count) | |
| sentences, labels = balanced_sentences, balanced_labels | |
| train_texts, val_texts, train_labels, val_labels = train_test_split( | |
| sentences, labels, test_size=0.2, random_state=42 | |
| ) | |
| MODEL_NAME = "aubmindlab/bert-base-arabertv02" | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) | |
| train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=128) | |
| val_encodings = tokenizer(val_texts, truncation=True, padding=True, max_length=128) | |
| class IntentDataset(torch.utils.data.Dataset): | |
| def __init__(self, encodings, labels): | |
| self.encodings = encodings | |
| self.labels = labels | |
| def __len__(self): | |
| return len(self.labels) | |
| def __getitem__(self, idx): | |
| item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()} | |
| item["labels"] = torch.tensor(self.labels[idx]) | |
| return item | |
| train_dataset = IntentDataset(train_encodings, train_labels) | |
| val_dataset = IntentDataset(val_encodings, val_labels) | |
| model = AutoModelForSequenceClassification.from_pretrained( | |
| MODEL_NAME, | |
| num_labels=len(label2id), | |
| id2label=id2label, | |
| label2id=label2id | |
| ) | |
| training_args = TrainingArguments( | |
| output_dir="./results", | |
| learning_rate=5e-5, | |
| per_device_train_batch_size=16, | |
| per_device_eval_batch_size=16, | |
| num_train_epochs=4, | |
| weight_decay=0.01, | |
| save_strategy="epoch", | |
| logging_dir="./logs", | |
| save_total_limit=2, | |
| ) | |
| trainer = Trainer( | |
| model=model, | |
| args=training_args, | |
| train_dataset=train_dataset, | |
| eval_dataset=val_dataset, | |
| tokenizer=tokenizer | |
| ) | |
| trainer.train() | |
| model.save_pretrained("./intent_model") | |
| tokenizer.save_pretrained("./intent_model") | |
| print(" تم حفظ النموذج في مجلد intent_model") | |