NLP常见的数据预处理工作如下:
- Load File:数据文件加载;
- Tokenization:分词;
- Create Vocabulary:创建字典;
- Indexify:将词与索引进行映射;
- Word Vectors:创建或加载词向量;
- Padding or Fix Length:按长度对文本进行补齐或截取;
- Dataset Splits:划分数据集(如将数据集划分问训练集、验证集、测试集);
- Batching and Iterators:将数据集按固定大小划分成Batch;
使用torchtext完成以上工作:
- 使用torchtext.data.Field定义样本各个字段的处理流程(分词、数据预处理等);
- 使用torchtext.data.Example将torchtext.data.Field处理成一条样本;
- 使用torchtext.data.Dataset将torchtext.data.Example处理成数据集,也可对数据集进行划分等工作;
- 使用torchtext.data.Iterators将torchtext.data.Dataset按照batch_size组装成Batch供模型训练使用;
- 使用torchtext.data.vocab和torchtext.data.Vectors创建词典、词和索引的一一对应、下载或使用预训练的词向量等;
一句话概括:主要是用来建立词汇表创建词典、词和索引的一一对应、下载或使用预训练的词向量等;
常见的词嵌入模型:word2vec Glove
Pretrained Word Embeddings
CLASS torchtext.vocab.GloVe(name='840B', dim=300, **kwargs)
CLASS torchtext.vocab.FastText(language='en', **kwargs)
CLASS torchtext.vocab.ChaarNGram(**kwargs)
返回的实例主要有以下三个属性:
stoi
: 词到索引的字典:itos
: 一个列表,索引到词的映射;vectors
: 词向量。
通过上面的模块,实现由词到向量之间的转换!!!
vocab.Vocab 是一个词汇表对象(由 下面的vocab 生成 Vocab 对象),使用counter创建词汇表
从 collections.Counter 构建词汇表
class collections.
Counter
([iterable-or-mapping])
一个 Counter
是一个 dict
的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括0和负数。 Counter
类有点像其他语言中的 bags或multisets。Counter
实际上也是dict
的一个子类,之不多可以统计不同的值出现的次数。
CLASS torchtext.vocab.Vocab(counter, max_size=None, min_freq=1,
specials=('<unk>', '<pad>'), vectors=None, unk_init=None, vectors_cache=None,
specials_first=True)
定义词汇表。属性:Vocab.freqs, Vocab.stoi, Vocab.itos
__init__(counter,...)
从 collections.Counter 构建词汇表
load_vectors(vectors, **kwargs)
vectors - GloVe, CharNGram, Vectors 实例,或者可用的预训练向量。
set_vectors(stoi, vectors, dim, unk_init=...)
从一个张量集合中设置词汇表实例的向量。
stoi - 字符串 到 `vectors` 相应向量的索引 的字典
vectors - 该参数支持索引 __getitem__。输入一个索引值,返回索引对应词条的向量(FloatTensor)。
例如:vector[stoi["string"]] 应该返回 “string" 的词向量。
dim - 词向量的维度
torchtext.vocab.vocab
使用dict创建词汇表对象
torchtext.vocab.vocab
( ordered_dict: Dict , min_freq: int = 1 ) → torchtext. vocab
.Vocab[来源]
用于创建将标记映射到索引的vocab对象的工厂方法。
请注意,在构建vocab时,将遵守在ordered_dict中插入键值对的顺序。因此,如果按标记频率排序对用户很重要,则应以反映这一点的方式创建ordered_dict。
参数
- ordered_dict – 有序字典将标记映射到它们相应的出现频率。
- min_freq – 在词汇表中包含一个标记所需的最小频率。
Returns
A Vocab objectReturn type
根据分好词的训练数据集来创建词典,过滤掉了出现次数少于5的词。
#实例
def get_vocab_imdb(data):
tokenized_data = get_tokenized_imdb(data)
counter = collections.Counter([tk for st in tokenized_data for tk in st])
return Vocab.vocab(counter, min_freq=5)
vocab = get_vocab_imdb(train_data)
'# words in vocab:', len(vocab)
输出:('# words in vocab:', 46151)
SubwordVocab: 构建子词汇表
CLASS torchtext.vocab.SubwordVocab(counter, max_size=None, specials='<pad>'
vectors=None, unk_init=...)
__init__(counter, ...)
从 collections.Counter 构建子词词汇表,
specials - padding or eos 等
Vectors:返回词向量
Look up embedding vectors of tokens
CLASS torchtext.vocab.Vectors(name, cache=None, url=None, unk_init=None,
max_vectors=None)
__init__(name, cache=None, url=None, unk_init=None, max_vectors=None)
name - 包含向量的文件名
cache - 缓存向量文件的目录
url - 如果缓存中没有找到向量文件,则从该链接下载
max_vectors - 用于限制加载的预训练此向量的数量。大部分预训练的向量集都是按照词频降序排列
在整个集合不适合内存或者不需要全部加载的情况下,可以加此限制。
get_vecs_by_tokens(tokens, lower_case_backup=False)
用于查找词条的嵌入向量。
tokens - 一个词条或词条列表。如果一个词条,返回 self.dim 形状的一维张量;如果列表,返回
(len(tokens), self.dim)形状的二维张量。
lower_case_backup - 是否查找小写的词条。如果为True,先按原格式在 `stoi` 查找,
没找到的话,再查小写格式
examples = ['chip', 'baby', 'Beautiful']
vec = text.vocab.GloVe(name='6B', dim=50)
ret = vec.get_vecs_by_tokens(tokens, lower_case_backup=True)
build_vocab_from_iterator :从迭代器创建vocab
torchtext.vocab.build_vocab_from_iterator(iterator, num_lines=None)
从 迭代器 建立词汇表
iterator - 必须产生词条的列表或迭代器
num_lines - 迭代器返回元素的预期数量。
torchtext.vocab.build_vocab_from_iterator(iterator: Iterable, min_freq: int = 1, specials: Optional[List[str]] = None, special_first: bool = True) → torchtext.vocab.vocab.Vocab[SOURCE]
Build a Vocab from an iterator.
Parameters
iterator – Iterator used to build Vocab. Must yield list or iterator of tokens.
min_freq – The minimum frequency needed to include a token in the vocabulary.
specials – Special symbols to add. The order of supplied tokens will be preserved.
special_first – Indicates whether to insert symbols at the beginning or at the end.