import kagglehub from kagglehub import KaggleDatasetAdapter import pandas as pd import json import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments from sklearn.metrics import f1_score import numpy as np from datasets import Dataset # Set random seed for reproducibility torch.manual_seed(42) np.random.seed(42) # 1. Load Datasets train_file_path = "train.jsonl" # Update if different (e.g., for Subtask A) test_file_path = "test.jsonl" # Update if different label_map_file = "label_to_id.json" # Update if different # Load training and test data train_df = kagglehub.load_dataset( KaggleDatasetAdapter.PANDAS, "daniilor/semeval-2026-task13", train_file_path ) test_df = kagglehub.load_dataset( KaggleDatasetAdapter.PANDAS, "daniilor/semeval-2026-task13", test_file_path ) # Load label mappings label_to_id_path = kagglehub.dataset_download("daniilor/semeval-2026-task13", label_map_file) with open(label_to_id_path, 'r', encoding='utf-8') as f: label_to_id = json.load(f) id_to_label = {v: k for k, v in label_to_id.items()} # Verify data print("Training Data (first 5 records):") print(train_df.head()) print("\nTest Data (first 5 records):") print(test_df.head()) print("\nLabel Mappings:", label_to_id) # 2. Preprocess Data # Initialize GraphCodeBERT tokenizer tokenizer = AutoTokenizer.from_pretrained("microsoft/graphcodebert-base") def tokenize_function(examples): return tokenizer(examples['code'], padding="max_length", truncation=True, max_length=512) # Convert to Hugging Face Dataset train_dataset = Dataset.from_pandas(train_df[['code', 'label']]) test_dataset = Dataset.from_pandas(test_df[['id', 'code']]) # Tokenize datasets train_dataset = train_dataset.map(tokenize_function, batched=True) test_dataset = test_dataset.map(tokenize_function, batched=True) # Set format for PyTorch train_dataset.set_format('torch', columns=['input_ids', 'attention_mask', 'label']) test_dataset.set_format('torch', columns=['input_ids', 'attention_mask', 'id']) # Split training data for validation train_dataset, val_dataset = train_dataset.train_test_split(test_size=0.1, seed=42).values() # 3. Define Model model = AutoModelForSequenceClassification.from_pretrained( "microsoft/graphcodebert-base", num_labels=2 # Binary classification for Subtask A ) # 4. Define Metrics def compute_metrics(pred): labels = pred.label_ids preds = pred.predictions.argmax(-1) macro_f1 = f1_score(labels, preds, average='macro') return {"macro_f1": macro_f1} # 5. Set Training Arguments training_args = TrainingArguments( output_dir="./graphcodebert_finetuned", evaluation_strategy="epoch", learning_rate=2e-5, per_device_train_batch_size=16, per_device_eval_batch_size=16, num_train_epochs=3, weight_decay=0.01, save_strategy="epoch", load_best_model_at_end=True, metric_for_best_model="macro_f1", seed=42 ) # 6. Initialize Trainer trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=val_dataset, compute_metrics=compute_metrics ) # 7. Train Model trainer.train() # 8. Generate Predictions predictions = trainer.predict(test_dataset) pred_labels = np.argmax(predictions.predictions, axis=1) # 9. Prepare Submission File submission_df = pd.DataFrame({ 'id': test_dataset['id'], 'label': pred_labels }) submission_df.to_csv('submission_graphcodebert.csv', index=False) print("Submission file saved as 'submission_graphcodebert.csv'")