torchtext的最新版本是0.8.1了,但我from torchtext.data import Field不知道为什么找不到Field,只好先退回0.6.0版本了
class Field 继承自(RawField)
Field定义了一个数据类型以及转换为Tensor的指令。
Field为常见的文本处理数据类,这些数据类型可以用张量表示。 它持有一个Vocab对象,该对象定义了字段元素的可能值集以及它们相应的数字表示。字段对象还持有与数据类型如何被数值化有关的其他参数,例如标记化方法和应该产生的张量的种类。
如果一个数据集中的两列之间共享一个字段(例如,QA数据集中的问题和答案),那么它们将有一个共享的词汇表。
构造函数参数
sequential: 数据类型是否代表连续的数据。如果是False,则不应用标记化。默认情况下。为真。
use_vocab: 是否使用Vocab对象。如果是False,这个字段的数据应该已经是数字了。默认情况下为真。
init_token: 一个将被预加到每个使用此字段的例子中的标记,或者没有初始标记的无。默认值无。
eos_token: 将附加到每个使用此字段的例子上的标记,如果没有句末标记则为无。默认值无。
fix_length:一个固定的长度,所有使用这个字段的例子都将被填充到这个长度,或者无,用于灵活的序列长度。默认值无。 dtype。表示这类数据的一批例子的torch.dtype类。默认值:torch.long。
preprocessing: 在标记化之后、数值化之前,将应用于使用该字段的例子的管道。许多数据集用一个自定义的预处理程序来替换这个属性。默认情况下无。
postprocessing:一个管道,它将在数值化之后但在数字变成张量之前应用于使用此字段的例子。该管道函数接收作为列表的批处理,以及该字段的Vocab。默认情况下无。
lower: 是否将该字段中的文本小写。默认情况下。False.
tokenize: 用于将使用此字段的字符串标记为连续的例子的函数。如果是 “spacy”,则使用SpaCy tokenizer。如果一个不可序列化的函数作为参数被传递,该字段将不能被序列化。默认:string.split。
tokenizer_language:要构建的标记器的语言。目前仅在SpaCy中支持各种语言。
include_lengths: 是否返回一个有填充物的迷你批的元组和一个包含每个例子长度的列表?一个包含每个例子的长度的列表,还是只返回一个填充的 minibatch。默认情况下False。
batch_first: 是否先生成批量维度的张量。默认情况下False。
pad_token: 用作填充的字符串令牌。默认:"<pad>"。
unk_token: 用来表示OOV(out-of-vocabulary)字样的字符串标记。默认:"<unk>"。
pad_first: 在开始时做序列的填充。默认值False(假)。
truncate_first: 在开始时对序列进行截断。默认值假
stop_words: 在预处理步骤中要丢弃的标记。默认值无
is_target: 这个字段是否是一个目标变量。影响到批次的迭代。默认值假
类方法
def preprocess(self, x)
使用这个字段加载一个单一的例子,必要时进行标记化。如果输入的是Python 2 str,它将首先被转换为Unicode。如果sequential=True
,它将被标记化。然后,输入将被选择性地降级,并传递给用户提供的preprocessing
管道。
类方法
def process(self, batch, device=None)
处理一个例子的列表,创建一个Torch.Tensor。对一个批次进行填充、数值化和后处理,并创建一个张量。
参数: batch (list(object))。来自一批例子的对象列表。
返回:torch.autograd.Variable。给定输入和自定义后处理管道的处理对象
类方法
def pad(self, minibatch):
使用这个字段对一批例子进行填充。如果提供了固定长度,则填充到self.fix_length,否则填充到该批中最长的例子的长度。如果self.init_token和eos_token的属性不是无的话,将它们加在前面。如果self.include_lengths
是True
和self.sequential
是True
,则返回填充的列表和包含每个例子长度的列表的一个元组,否则只返回填充的列表。如果 self.sequential
是False
,则不应用填充
类方法
def build_vocab(self, *args, **kwargs):
为这个字段从一个或多个数据集构建Vocab对象。
参数。Positional参数:数据集对象或其他可迭代的数据源,从中构建代表该字段可能值集的Vocab对象。如果提供了数据集对象,就会使用与该字段对应的所有列;也可以直接提供个别列。
其余的key参数。传递给Vocab的构造函数。
类方法
def numericalize(self, arr, device=None):
将一批使用此字段的examples变成一个变量。如果该字段的include_lengths=True,返回值中会包含一个长度张量。
参数:arr(List[List[str]],或(List[List[str]],List[int])的元组)。符号化和填充的例子的列表,或者如果self.include_lengths为True,则为符号化和填充的例子的列表和每个例子的长度的列表的元组。
device:一个字符串或torch.device
的实例,指定变量将在哪个设备上创建。如果保持默认,张量将在cpu上创建。默认值无。
eg:
import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.datasets import Multi30k
from torchtext.data import Field, BucketIterator
import spacy
import random
from torch.utils.tensorboard import SummaryWriter # to print to tensorboard
from utils import translate_sentence, bleu, save_checkpoint, load_checkpoint
"""
To install spacy languages do:
python -m spacy download en
python -m spacy download de
"""
spacy_ger = spacy.load("de")
spacy_eng = spacy.load("en")
def tokenize_ger(text):
return [tok.text for tok in spacy_ger.tokenizer(text)]
def tokenize_eng(text):
return [tok.text for tok in spacy_eng.tokenizer(text)]
german = Field(tokenize=tokenize_ger, lower=True, init_token="<sos>", eos_token="<eos>")
english = Field(
tokenize=tokenize_eng, lower=True, init_token="<sos>", eos_token="<eos>"
)
train_data, valid_data, test_data = Multi30k.splits(
exts=(".de", ".en"), fields=(german, english)
)
german.build_vocab(train_data, max_size=10000, min_freq=2)
english.build_vocab(train_data, max_size=10000, min_freq=2)
train_data
german.build_vocab后,german的vocab变量