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