首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用torchtext添加功能?

如何使用torchtext添加功能?
EN

Stack Overflow用户
提问于 2019-01-19 22:07:00
回答 1查看 480关注 0票数 3

torchtext能够读取包含一些列的文件,每列对应一个字段。如果我想创建一个新的列(我将使用它作为一个特性),该怎么办?例如,假设文件有两列,文本和目标,我想从文本中提取一些信息并生成一个新的特征(例如,如果它包含某些单词),我可以直接用torchtext来做这件事吗,或者我需要在之前在文件中做吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-07-15 00:13:10

这是可以做到的。

代码语言:javascript
复制
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")

下面的步骤是必需的,以便只处理我们想要处理的那些列,并且列顺序很重要

代码语言:javascript
复制
temp_data.loc[:,["text","label"]].to_csv("temp.csv",index=False)

创建Text、Feature和Target字段。在这里,我将一个句子标记化为字符。

代码语言:javascript
复制
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列顺序相匹配的正确字段顺序。

代码语言:javascript
复制
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 

构建迭代器

代码语言:javascript
复制
   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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54267919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档