Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pytorch Torchtext 0.7显示字段已被弃用。替代方案是什么?_Pytorch_Torchtext - Fatal编程技术网

Pytorch Torchtext 0.7显示字段已被弃用。替代方案是什么?

Pytorch Torchtext 0.7显示字段已被弃用。替代方案是什么?,pytorch,torchtext,Pytorch,Torchtext,看起来以前声明字段、示例和使用BucketIterator的范例已被弃用,并将在0.8中迁移到遗留模式。然而,我似乎找不到一个不使用字段的自定义数据集的新范例(如中所示,不是包含在torch.dataset中的范例)。有人能给我举一个最新的例子吗 弃用参考: 我自己花了一点时间才找到解决办法。对于预构建的数据集,新的范例与此类似: from torchtext.experimental.datasets import AG_NEWS train, test = AG_NEWS(ngrams=3)

看起来以前声明字段、示例和使用BucketIterator的范例已被弃用,并将在0.8中迁移到遗留模式。然而,我似乎找不到一个不使用字段的自定义数据集的新范例(如中所示,不是包含在torch.dataset中的范例)。有人能给我举一个最新的例子吗

弃用参考:


我自己花了一点时间才找到解决办法。对于预构建的数据集,新的范例与此类似:

from torchtext.experimental.datasets import AG_NEWS
train, test = AG_NEWS(ngrams=3)
from torch.utils.data import DataLoader
def collate_fn(batch):
    texts, labels = [], []
    for label, txt in batch:
        texts.append(txt)
        labels.append(label)
    return texts, labels
dataloader = DataLoader(train, batch_size=8, collate_fn=collate_fn)
for idx, (texts, labels) in enumerate(dataloader):
    print(idx, texts, labels)
或类似于自定义构建数据集:

from torchtext.experimental.datasets import AG_NEWS
train, test = AG_NEWS(ngrams=3)
from torch.utils.data import DataLoader
def collate_fn(batch):
    texts, labels = [], []
    for label, txt in batch:
        texts.append(txt)
        labels.append(label)
    return texts, labels
dataloader = DataLoader(train, batch_size=8, collate_fn=collate_fn)
for idx, (texts, labels) in enumerate(dataloader):
    print(idx, texts, labels)

我复制了我无意中浏览到的torchtext中的示例,该示例未在文档中记录。自述文件链接了一个解释更改背后的基本原理的链接,以及一个

如果您只想让现有代码在
torchtext
0.9.0中运行,其中不推荐的类已移动到
legacy
模块,则必须调整导入:

# from torchtext.data import Field, TabularDataset
from torchtext.legacy.data import Field, TabularDataset
或者,您可以按照自述文件的建议,将整个
torchtext.legacy
模块导入为
torchtext

import torchtext.legacy as torchtext

有一篇关于这个的帖子。它使用
TextClassificationDataset
以及collator和其他预处理,而不是不推荐的
字段和
BucketIterator
类。它读取一个txt文件并构建一个数据集,然后是一个模型。在帖子里面,有一个链接指向一个完整的工作笔记本。该职位位于:。但是您需要PyTorch的“开发”(或夜间构建)才能正常工作

从上面的链接:

在标记化和构建词汇表之后,您可以按照如下方式构建数据集

def data_to_dataset(data, tokenizer, vocab):
    
    data = [(text, label) for (text, label) in data]
    
    text_transform = sequential_transforms(tokenizer.tokenize,
                                                  vocab_func(vocab),
                                                  totensor(dtype=torch.long)
                                          )
    label_transform = sequential_transforms(lambda x: 1 if x =='1' else (0 if x =='0' else x),
                                                  totensor(dtype=torch.long)
                                          )
    
    
    transforms = (text_transform, label_transform)
    
    dataset = TextClassificationDataset(data, vocab, transforms)
    
    return dataset
分类如下:

    def __init__(self, pad_idx):
        
        self.pad_idx = pad_idx
        
    def collate(self, batch):
        text, labels = zip(*batch)
        labels = torch.LongTensor(labels)
        text = nn.utils.rnn.pad_sequence(text, padding_value=self.pad_idx, batch_first=True)
        return text, labels

然后,您可以使用
collate\u fn
参数使用典型的
torch.utils.data.dataloader
构建数据加载器。

看起来管道可能是这样的:

import torchtext as TT
import torch
from collections import Counter
from torchtext.vocab import Vocab

# read the data

with open('text_data.txt','r') as f:
    data = f.readlines()
with open('labels.txt', 'r') as f:
    labels = f.readlines()


tokenizer = TT.data.utils.get_tokenizer('spacy', 'en') # can remove 'spacy' and use a simple built-in tokenizer
train_iter = zip(labels, data)
counter = Counter()

for (label, line) in train_iter:
    counter.update(tokenizer(line))
    
vocab = TT.vocab.Vocab(counter, min_freq=1)

text_pipeline = lambda x: [vocab[token] for token in tokenizer(x)]
# this is data-specific - adapt for your data
label_pipeline = lambda x: 1 if x == 'positive\n' else 0

class TextData(torch.utils.data.Dataset):
    '''
    very basic dataset for processing text data
    '''
    def __init__(self, labels, text):
        super(TextData, self).__init__()
        self.labels = labels
        self.text = text
        
    def __getitem__(self, index):
        return self.labels[index], self.text[index]
    
    def __len__(self):
        return len(self.labels)


def tokenize_batch(batch, max_len=200):
    '''
    tokenizer to use in DataLoader
    takes a text batch of text dataset and produces a tensor batch, converting text and labels though tokenizer, labeler
    tokenizer is a global function text_pipeline
    labeler is a global function label_pipeline
    max_len is a fixed len size, if text is less than max_len it is padded with ones (pad number)
    if text is larger that max_len it is truncated but from the end of the string
    '''
    labels_list, text_list = [], []
    for _label, _text in batch:
        labels_list.append(label_pipeline(_label))
        text_holder = torch.ones(max_len, dtype=torch.int32) # fixed size tensor of max_len
        processed_text = torch.tensor(text_pipeline(_text), dtype=torch.int32)
        pos = min(200, len(processed_text))
        text_holder[-pos:] = processed_text[-pos:]
        text_list.append(text_holder.unsqueeze(dim=0))
    return torch.FloatTensor(labels_list), torch.cat(text_list, dim=0)

train_dataset = TextData(labels, data)

train_loader = DataLoader(train_dataset, batch_size=2, shuffle=False, collate_fn=tokenize_batch)

lbl, txt = iter(train_loader).next()

嗨,史蒂文,谢谢你。不管怎样,你有没有发现关于我们如何构建vocab、标记化等的任何片段?@SatrioAdiPrabowo我建议你亲自使用。Huggingface目前是NLP目前几乎所有事物的实际标准,从构建词汇表到标记化,甚至是模型。或者,你可以创建自己的,这是更多的工作。哦,哇!谢谢你,史蒂文。这有点晚了,但我确实认为这回答了我的问题。似乎我所希望的有关Vocab/标记化的一些预处理功能并没有像我所希望的那样成熟。嘿,Paco,下次可能会更一般地询问,因为询问什么是不推荐使用的替代方案意味着您希望继续使用torchtext,并希望在torchtext中使用未推荐使用的替代方案。与更一般的问题相反,我应该使用什么来预处理和处理NLP。请注意,提出太宽泛的问题可能会使问题锁定在堆栈溢出上。嗨!请你详细描述一下方法,而不是描述笔记本上的内容好吗?这样,如果笔记本电脑不可用,人们仍然可以从你的答案中获益:)@Proko。我添加了重要的代码段。