如何使用torchtext添加功能?

时间:2019-01-19 14:07:00

标签: nlp pytorch pipeline torchtext

torchtext能够读取包含一些列的文件,每个列对应一个字段。如果我想创建一个新列(将用作功能)怎么办?例如,假设文件有两列,文本和目标,并且我想从文本中提取一些信息并生成新功能(例如,如果其中包含某些单词),我可以直接使用torchtext还是我需要在文件中做过吗?

谢谢!

1 个答案:

答案 0 :(得分: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 = 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