Как я могу добавить функцию, используя torchtext?

torchtext может прочитать файл с несколькими столбцами, каждый из которых соответствует полю. Что делать, если я хочу создать новый столбец (который я буду использовать в качестве функции)? Например, представьте, что файл содержит два столбца, текст и цель, и я хочу извлечь некоторую информацию из текста и сгенерировать новую функцию (например, если она содержит определенные слова), могу ли я сделать это напрямую с torchtext или мне нужно сделать это в файле раньше?

Спасибо!

0 ответов

Это может быть сделано.

def postprocessing(arr,vocab,pad_token):
    # required to pad the sequence
    max_len = max([len(a) for a in arr])
    l = []
    for a in arr:
        res = max_len - len(a)
        if res > 0:
            a.extend([[pad_token]*len(a[0])]*res)
        l.append(a)
    return l

def featurization(text_list):
    # creates character level features
    # text_list is a list of characters.
    features = []
    for ch in text_list:
        l = []
        l.append(1 if ch.isupper() else 0)
        l.append(1 if ch in string.digits else 0)
        l.append(1 if ch in string.punctuation else 0)
        features.append(l)
    return features

temp_data = pd.read_csv("../data/processed/data.csv")

Следующий шаг необходим, чтобы взять только те столбцы, которые мы хотим обработать, и порядок столбцов имеет значение.

temp_data.loc[:,["text","label"]].to_csv("temp.csv",index=False)

Создайте поля Text, Feature и Target. Здесь я делю предложение на символы.

TEXT = torchtext.data.Field(sequential=True, use_vocab=True,
                               tokenize=lambda x: list(x), include_lengths=True,
                               batch_first=True)
    

LABEL_PAD_TOKEN=-1
FEAT = torchtext.data.LabelField(use_vocab=False,batch_first=True,preprocessing=featurization,
                                    pad_token=None,postprocessing=lambda x, _:postprocessing(x,_,LABEL_PAD_TOKEN))

LABELS = torchtext.data.Field(use_vocab=False,pad_token=LABEL_PAD_TOKEN,unk_token=None,
                                  batch_first=True,dtype=torch.int64,tokenize=lambda x: list(x),
                                 preprocessing=lambda x:[eval(i) for i in x])
    

В TabularDataset должен быть указан правильный порядок полей, соответствующий порядку столбцов temp.csv.

train_data = torchtext.data.TabularDataset(path="temp.csv",format="csv",skip_header=True,
                                               fields=[(("text","feat"),(TEXT,FEAT)),
                                                       ("labels",LABELS)])
TEXT.build_vocab(train_data)
    
train_data,valid_data = train_data.split() # create train val 

Создайте итератор

   train_iter,valid_iter=torchtext.data.BucketIterator.splits((train_data,valid_data,),batch_size=2,device=device                                                                  ,sort_within_batch=True,sort_key=lambda x:len(x.text))
            
a = next(iter(train_iter))
a.feat.shape, a.text[0].shape   # printing the shape 

(torch.Size([2, 36, 3]), torch.Size([2, 36]))

Затем вы можете передать текст на слой внедрения, чей input является [batch_size, seq_len]который будет output [batch_size, seq_len, emb_dim]

Черты имеют форму [batch_size, seq_len,3] потому что у нас есть 3 функции

Соедините оба этих аспекта в последнем измерении, давая [batch_size, seq_len, emb_dim+3] и передать его либо LSTM, либо CNN

Другие вопросы по тегам