scamdetect-backend / backend /dataset /scripts /data_loader_ml.py
ScamDetect Bot
Auto-sync backend from GitHub
69b17de
Raw
History Blame Contribute Delete
3.61 kB
"""
ML Pipeline Data Loader for ScamDetect AI
Handles the 50,000+ research-level text, URL, image, and video datasets.
Provides PyTorch Dataset and DataLoader abstractions.
"""
import os
import pandas as pd
try:
import torch
from torch.utils.data import Dataset, DataLoader
from transformers import AutoTokenizer
TORCH_AVAILABLE = True
except ImportError:
TORCH_AVAILABLE = False
print("Warning: PyTorch not installed. ML DataLoader will operate in pandas-only mode.")
DATA_DIR = os.path.join(os.path.dirname(__file__), "data")
class TextScamDataset(Dataset if TORCH_AVAILABLE else object):
def __init__(self, csv_file=None, tokenizer_name="bert-base-multilingual-cased", max_length=128):
self.csv_file = csv_file or os.path.join(DATA_DIR, "text_dataset.csv")
self.data = pd.read_csv(self.csv_file)
# Mapping labels
self.label_map = {"safe": 0, "scam": 1}
self.max_length = max_length
if TORCH_AVAILABLE:
self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_name)
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
row = self.data.iloc[idx]
text = str(row['text'])
label = self.label_map.get(row['label'], 1)
if not TORCH_AVAILABLE:
return {"text": text, "label": label, "category": row['category']}
encoding = self.tokenizer(
text,
add_special_tokens=True,
max_length=self.max_length,
return_token_type_ids=False,
padding='max_length',
truncation=True,
return_attention_mask=True,
return_tensors='pt',
)
return {
'text': text,
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'targets': torch.tensor(label, dtype=torch.long),
'category': row['category']
}
class UrlPhishingDataset(Dataset if TORCH_AVAILABLE else object):
def __init__(self, csv_file=None):
self.csv_file = csv_file or os.path.join(DATA_DIR, "url_dataset.csv")
self.data = pd.read_csv(self.csv_file)
self.label_map = {"safe": 0, "scam": 1}
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
row = self.data.iloc[idx]
url = str(row['url'])
label = self.label_map.get(row['label'], 1)
item = {"url": url, "label": label}
if TORCH_AVAILABLE:
item["targets"] = torch.tensor(label, dtype=torch.long)
return item
def get_data_loaders(batch_size=32):
"""Returns PyTorch DataLoaders for train/test splits."""
if not TORCH_AVAILABLE:
raise ImportError("PyTorch required for DataLoader generation")
text_ds = TextScamDataset()
url_ds = UrlPhishingDataset()
# In a real scenario, split train/test here using torch.utils.data.random_split
text_loader = DataLoader(text_ds, batch_size=batch_size, shuffle=True)
url_loader = DataLoader(url_ds, batch_size=batch_size, shuffle=True)
return {"text": text_loader, "url": url_loader}
if __name__ == "__main__":
print("Loading datasets...")
text_ds = TextScamDataset()
url_ds = UrlPhishingDataset()
print(f"Loaded Text Dataset: {len(text_ds)} samples")
print(f"Loaded URL Dataset: {len(url_ds)} samples")
if len(text_ds) > 0:
print("\nSample Text Record:")
print(text_ds[0])