|
import os |
|
|
|
from pyarabic.araby import tokenize, strip_tashkeel |
|
|
|
import numpy as np |
|
import torch as T |
|
from torch.utils.data import Dataset |
|
|
|
from data_utils import DatasetUtils |
|
import diac_utils as du |
|
|
|
class DataRetriever(Dataset): |
|
def __init__(self, data_utils : DatasetUtils, lines: list): |
|
super(DataRetriever).__init__() |
|
|
|
self.data_utils = data_utils |
|
self.lines = lines |
|
|
|
def preprocess(self, data, dtype=T.long): |
|
return [T.tensor(np.array(x), dtype=dtype) for x in data] |
|
|
|
def __len__(self): |
|
return len(self.lines) |
|
|
|
def __getitem__(self, idx): |
|
word_x, char_x, diac_x, diac_y = self.create_sentence(idx) |
|
return self.preprocess((word_x, char_x, diac_x)), T.tensor(diac_y, dtype=T.long) |
|
|
|
def create_sentence(self, idx): |
|
line = self.lines[idx] |
|
tokens = tokenize(line.strip()) |
|
|
|
word_x = [] |
|
char_x = [] |
|
diac_x = [] |
|
diac_y = [] |
|
diac_y_tmp = [] |
|
|
|
for word in tokens: |
|
word = du.strip_unknown_tashkeel(word) |
|
word_chars = du.split_word_on_characters_with_diacritics(word) |
|
cx, cy, cy_3head = du.create_label_for_word(word_chars) |
|
|
|
word_strip = strip_tashkeel(word) |
|
word_x += [self.data_utils.w2idx[word_strip] if word_strip in self.data_utils.w2idx else self.data_utils.w2idx["<pad>"]] |
|
|
|
char_x += [self.data_utils.pad_and_truncate_sequence(cx, self.data_utils.max_word_len)] |
|
|
|
diac_y += [self.data_utils.pad_and_truncate_sequence(cy, self.data_utils.max_word_len, pad=self.data_utils.pad_target_val)] |
|
diac_y_tmp += [self.data_utils.pad_and_truncate_sequence(cy_3head, self.data_utils.max_word_len, pad=[self.data_utils.pad_target_val]*3)] |
|
|
|
diac_x = self.data_utils.create_decoder_input(diac_y_tmp) |
|
|
|
max_slen = self.data_utils.max_sent_len |
|
max_wlen = self.data_utils.max_word_len |
|
p_val = self.data_utils.pad_val |
|
pt_val = self.data_utils.pad_target_val |
|
|
|
word_x = self.data_utils.pad_and_truncate_sequence(word_x, max_slen) |
|
char_x = self.data_utils.pad_and_truncate_sequence(char_x, max_slen, pad=[p_val]*max_wlen) |
|
diac_x = self.data_utils.pad_and_truncate_sequence(diac_x, max_slen, pad=[[p_val]*8]*max_wlen) |
|
diac_y = self.data_utils.pad_and_truncate_sequence(diac_y, max_slen, pad=[pt_val]*max_wlen) |
|
|
|
return word_x, char_x, diac_x, diac_y |