viclickbait_gnn / src /datasets.py
minhy112's picture
Upload viclickbait_gnn project
877049d verified
Raw
History Blame Contribute Delete
2.11 kB
from dataclasses import dataclass
from pathlib import Path
import pandas as pd
import torch
from torch.utils.data import Dataset
@dataclass
class SplitBundle:
all_data: pd.DataFrame
train: pd.DataFrame
val: pd.DataFrame
test: pd.DataFrame
def load_split_bundle(processed_dir: str | Path) -> SplitBundle:
processed_dir = Path(processed_dir)
return SplitBundle(
all_data=pd.read_csv(processed_dir / "all.csv"),
train=pd.read_csv(processed_dir / "train.csv"),
val=pd.read_csv(processed_dir / "val.csv"),
test=pd.read_csv(processed_dir / "test.csv"),
)
def build_mask(node_ids: pd.Series, size: int) -> torch.Tensor:
mask = torch.zeros(size, dtype=torch.bool)
mask[node_ids.to_numpy()] = True
return mask
class TitleDataset(Dataset):
def __init__(self, dataframe: pd.DataFrame, tokenizer, max_length: int):
self.dataframe = dataframe.reset_index(drop=True)
self.tokenizer = tokenizer
self.max_length = max_length
def __len__(self) -> int:
return len(self.dataframe)
def __getitem__(self, index: int) -> dict:
row = self.dataframe.iloc[index]
encoded = self.tokenizer(
row["title"],
truncation=True,
padding="max_length",
max_length=self.max_length,
return_tensors="pt",
)
item = {key: value.squeeze(0) for key, value in encoded.items()}
item["labels"] = torch.tensor(int(row["label_id"]), dtype=torch.long)
item["node_id"] = torch.tensor(int(row["node_id"]), dtype=torch.long)
return item
def tokenize_dataframe(dataframe: pd.DataFrame, tokenizer, max_length: int) -> dict[str, torch.Tensor]:
encoded = tokenizer(
dataframe["title"].tolist(),
truncation=True,
padding=True,
max_length=max_length,
return_tensors="pt",
)
encoded["labels"] = torch.tensor(dataframe["label_id"].to_numpy(), dtype=torch.long)
encoded["node_id"] = torch.tensor(dataframe["node_id"].to_numpy(), dtype=torch.long)
return encoded