| """TF-IDF + MLP baseline classifier.""" |
|
|
| import numpy as np |
| import torch |
| from scipy.sparse import spmatrix |
| from torch import nn |
| from torch.utils.data import Dataset |
|
|
|
|
| class TfidfDataset(Dataset): |
| """Wraps a sparse TF-IDF matrix + integer labels as dense float32 tensors.""" |
|
|
| def __init__(self, features: spmatrix, labels: np.ndarray): |
| self.features = features |
| self.labels = torch.as_tensor(labels, dtype=torch.long) |
|
|
| def __len__(self) -> int: |
| return self.features.shape[0] |
|
|
| def __getitem__(self, idx: int) -> tuple[torch.Tensor, torch.Tensor]: |
| row = self.features[idx].toarray().astype(np.float32).squeeze(0) |
| return torch.from_numpy(row), self.labels[idx] |
|
|
|
|
| class SimpleMLP(nn.Module): |
| """Input(TF-IDF) -> hidden -> hidden -> num_classes.""" |
|
|
| def __init__(self, input_size: int, hidden_size: int, num_classes: int, dropout: float = 0.3): |
| super().__init__() |
| self.net = nn.Sequential( |
| nn.Linear(input_size, hidden_size), |
| nn.ReLU(), |
| nn.Dropout(dropout), |
| nn.Linear(hidden_size, hidden_size), |
| nn.ReLU(), |
| nn.Dropout(dropout), |
| nn.Linear(hidden_size, num_classes), |
| ) |
|
|
| def forward(self, x: torch.Tensor) -> torch.Tensor: |
| return self.net(x) |
|
|