import pandas as pd import torch from torch.utils.data import Dataset class Dataset(Dataset): """ Load dataset from file csv""" def __init__(self, vocab, csv_fpath=None, tokenized_fpath=None): """ @param vocab (Vocabulary) @param csv_fpath (str) @param tokenized_fpath (str) """ self.vocab = vocab self.pad_idx = vocab[""] df = pd.read_csv(csv_fpath) self.sentiments_list = list(df.sentiment) self.reviews_list = list(df.vi_review) sentiments_type = list(set(self.sentiments_list)) sentiments_type.sort() self.sentiment2id = {sentiment: i for i, sentiment in enumerate(sentiments_type)} if tokenized_fpath: self.tokenized_reviews = torch.load(tokenized_fpath) else: self.tokenized_reviews = self.vocab.tokenize_corpus(self.reviews_list) self.tensor_data = self.vocab.corpus_to_tensor(self.tokenized_reviews, is_tokenized=True) self.tensor_label = torch.tensor([self.sentiment2id[sentiment] for sentiment in self.sentiments_list], dtype=torch.float64) def __len__(self): return len(self.tensor_data) def __getitem__(self, idx): return self.tensor_data[idx], self.tensor_label[idx] def collate_fn(self, examples): examples = sorted(examples, key=lambda e: len(e[0]), reverse=True) reviews = [e[0] for e in examples] reviews = torch.nn.utils.rnn.pad_sequence(reviews, batch_first=False, padding_value=self.pad_idx) reviews_lengths = torch.tensor([len(e[0]) for e in examples]) sentiments = torch.tensor([e[1] for e in examples]) return {"reviews": (reviews, reviews_lengths), "sentiments": sentiments}