本篇对AllenNLP中关于数据中的 Datasets,vocabulary,DataLoader,sampler做简单的介绍。

Datasets

数据集被表示为AllennlpDataset对象,是instance集合的一个简单封装,并且与PyTorchDataset基本上相同,不同之处在于它还支持某些额外的功能,例如词汇索引。 AllenNLPDatasetReader在完成读取数据集后返回AllennlpDataset()或者AllennlpLazyDataset()

Vocabulary

Vocabulary,词汇表,是AllenNLP中的重要组件,它常常被其他抽象类与组件使用。 简而言之,Vocabulary管理从字符串到整数ID的映射。 Vocabulary的输入是Instances,用于将文本数据(例如token和标签)转换为整数ID(并最终转换为张量)。

词汇表使用namespace的概念管理不同的映射。 每个namespace都是从字符串到整数的独特映射,因此不同namespace中的字符串将被分别处理。 这样,使用者就可以为单词“a”和字符“ a”或英语中的“ chat”和法语中的“ chat”(英语中的“ cat”)分别设置索引。 如下图所示:

namespace之间有一个重要的区别:paddednon-paddednamespace默认是padded的,为填充和词汇表外(OOV)的token保留映射索引。这对于为文本创建索引时十分有用,因为出现词表外的token十分常见,而且填充也是必须的。

另一方面,non-padded namespace不保留特殊token的映射索引,这更适用于类别标签之类的情况,以“tags”或“labels”结尾的namespace默认为non-padded,但是可以通过在创建vocabulary时提供non_padded_namespaces参数来修改此行为。

Vocabulary实例化的方法有以下三种:

  • 默认方法,from_instances,从Instance集合实例化Vocabulary

  • from_files 的类方法可以从序列化的词汇表进行加载。序列化的词汇表通常是由allennlp之前训练产生的,对应配置文件的type为“from_files”;

  • from_files_and_instances,使用instance集合扩展已经生成的词汇表,对应配置文件的type为“extend”。

其中默认的from_instances方法是指将Instance的集合传递给Vocabulary.from_instances()方法。这将对Instance中需要映射为整数的所有字符串进行频数统计,然后根据统计结果来决定词汇表中应包含哪些字符串。get_token_index()方法通过token查找索引,get_token_from_index()是逆运算(通过索引查找token)。示例代码如下:

from allennlp.data.instance import Instance
from allennlp.data.fields import TextField, LabelField
from allennlp.data.token_indexers import SingleIdTokenIndexer
from allennlp.data.tokenizers import Token
from allennlp.data.vocabulary import Vocabulary# 创建fields,并标明namespace
token_indexers = {'tokens': SingleIdTokenIndexer(namespace='tokens')}
text_field_pos = TextField([Token('The'), Token('best'), Token('movie'), Token('ever'), Token('!')],token_indexers=token_indexers)
text_field_neg = TextField([Token('Such'), Token('an'), Token('awful'), Token('movie'), Token('.')],token_indexers=token_indexers)label_field_pos = LabelField('pos', label_namespace='labels')
label_field_neg = LabelField('neg', label_namespace='labels')# 创建正例与负例两个instance
instance_pos = Instance({'tokens': text_field_pos, 'label': label_field_pos})
instance_neg = Instance({'tokens': text_field_neg, 'label': label_field_neg})# 创建Vocabulary
vocab = Vocabulary.from_instances([instance_pos, instance_neg])
print('Created a Vocabulary:', vocab)# 根据单词查找索引,默认情况下namespace为'tokens'。vocab按频率从大到小添加词汇项,因此出现两次的“movie”将获得除了@@PADDING@@和@@UNKNOWN@@之外最小的索引
print('index for token "movie":', vocab.get_token_index('movie'))
print('index for token "!":', vocab.get_token_index('!'))# 'tokens'的namespace为padded,因此oov与padding也有对应的索引
print('index for token "unknown":', vocab.get_token_index('unknown'))
# index for token "unknown": 1
print('index for token "padding":', vocab.get_token_index('@@PADDING@@'))
# index for token "padding": 0print('index for label "pos":', vocab.get_token_index('pos', namespace='labels'))
print('index for label "neg":', vocab.get_token_index('neg', namespace='labels'))# 'labels' 是 non-padded namespace; 因此在查找词表外的单词时会抛出异常
try:vocab.get_token_index('unknown', namespace='labels')
except KeyError:print('index for label "unknown": caught KeyError')# 根据索引查看token
print('token for index=0:', vocab.get_token_from_index(0))
print('token for index=1:', vocab.get_token_from_index(1))
print('token for index=2:', vocab.get_token_from_index(2))print('label for index=0:', vocab.get_token_from_index(0, namespace='labels'))
print('label for index=1:', vocab.get_token_from_index(1, namespace='labels'))try:vocab.get_token_from_index(2, namespace='labels')
except KeyError:print('label for index=2: caught KeyError')

当词汇表量级非常大时,可以通过使用min_count 参数设置一个阈值并只保留出现频率高于该阈值的单词来对其进行删减,样例如下:

vocab = Vocabulary.from_instances([instance_pos, instance_neg], min_count={'tokens': 2})

DataLoader

DataLoader的输入是数据集,一个Dataset对象,并在该数据集上生成一个iterable。默认情况下,它按原始顺序生成单个instance,但可以为DatasetLoader提供各种选项,从而自定义它如何迭代、采样(和/或)批处理instance。例如,如果设置batch_size参数,它将生成指定大小的批次。还可以通过提供shuffle=True来打乱数据集。

AllenNLPDataLoaderPyTorchDataLoader的一个非常简单的子类,主要区别在于一个定制的collate函数,这个函数在PyTorch是定义如何获取instance并将它们进行批处理。在allennlp中,collate函数中创建一批instance并将其转换为张量字典,并应用适当的填充:

def allennlp_collate(instances: List[Instance]) -> TensorDict:batch = Batch(instances)return batch.as_tensor_dict(batch.get_padding_lengths())

sampler

即采样器,指定如何迭代给定数据集中的实例,用户可以为DatasetLoader的批处理参数提供一个sampler,以便进一步自定义其行为。常用的sampler如下:

  • SequentialSampler按原始顺序顺序对实例进行采样
  • RandomSampler随机采样实例,重要参数为replacement,默认为False,代表是否重复采样。
  • BatchSampler 包装另一个采样器,并生成由底层采样器生成的小批量实例。

示例代码如下:

from allennlp.data import DataLoader, PyTorchDataLoader
from allennlp.data import Instance, Token
from allennlp.data.token_indexers import SingleIdTokenIndexer
from allennlp.data.dataset_readers.dataset_reader import AllennlpDataset
from allennlp.data.fields import LabelField, TextField
from allennlp.data.samplers import SequentialSampler, RandomSampler
from allennlp.data.samplers import BasicBatchSampler
from allennlp.data.vocabulary import Vocabulary# 创建迷你dataset
token_indexers = {'tokens': SingleIdTokenIndexer()}
instances = [Instance({'label': LabelField(str(label)),'text': TextField([Token(label)], token_indexers = token_indexers)}) for label in 'abcdefghij']
dataset = AllennlpDataset(instances)
vocab = Vocabulary.from_instances(dataset)
dataset.index_with(vocab)# 批处理默认情况
print("Default:")
data_loader = PyTorchDataLoader(dataset, batch_size=3)
for batch in data_loader:print(batch)# drop_last=True,如果最后一个批次小于批次大小,则丢弃
sampler = SequentialSampler(data_source=dataset)
batch_sampler = BasicBatchSampler(sampler, batch_size=3, drop_last=True)print("\nDropping last:")
data_loader = PyTorchDataLoader(dataset, batch_sampler=batch_sampler)
for batch in data_loader:print(batch)# 使用随机采样
sampler = RandomSampler(data_source=dataset)
batch_sampler = BasicBatchSampler(sampler, batch_size=3, drop_last=False)print("\nWith RandomSampler:")data_loader = PyTorchDataLoader(dataset, batch_sampler=batch_sampler)
for batch in data_loader:print(batch)

参考资料

  • allennlp官方文档1.2.2
  • allennlp指南

AllenNLP框架学习笔记(数据篇之二)相关推荐

  1. Linux学习笔记—驱动篇(二) 刷机和点灯

    进行裸机编程的前提条件 1)U-boot启动 ,但是没有自动启动linux (在3秒倒计时中 ,打断自动启 动) 2)U-boot 提供自己的命令行 Hit any key to stop autob ...

  2. OpenLayers学习笔记高级篇(二、地图控件)

    在OpenLayers 3中,地图控件指的是下图标注的这些,包括缩放按钮,标尺,版权说明,指北针等等. 他们不会随着地图的移动而移动,一直处于一个固定的位置. 在实现上,并不是在画布上绘制的,而是使用 ...

  3. Spring Boot 框架学习笔记(二)(配置文件与数据注入 yaml基本语法 JSR303数据验证 多环境切换 )

    Spring Boot 框架学习笔记(二) 六.appliaction.properties配置与数据注入 6.1 `@Value`注解 测试注入数据 读取输入流 6.2 读取配置文件数据注入 单文件 ...

  4. ET6.0服务器框架学习笔记(二、一条登录协议)

    ET6.0服务器框架学习笔记(二.一条登录协议) 上一篇主要记录ET6.0的服务器启动功能,本篇主要记录ET6.0完整的一条协议,从配置到生成协议数据,到从客户端发送给服务端,再发送回客户端的流程 文 ...

  5. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  6. Vue学习笔记入门篇——数据及DOM

    本文为转载,原文:Vue学习笔记入门篇--数据及DOM 数据 data 类型 Object | Function 详细 Vue 实例的数据对象.Vue 将会递归将 data 的属性转换为 getter ...

  7. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  8. ET服务器框架学习笔记(十)

    ET服务器框架学习笔记(十) 文章目录 ET服务器框架学习笔记(十) 前言 一.ET之Service 1.Service主要数据 2.Service主要逻辑 3.Service其他逻辑 二.ET之Ne ...

  9. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  10. php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里,推荐php版本>=5.4) 环境不支持伪静态网址时的配置 第一步: 在app\con ...

最新文章

  1. 【随笔】工程师都是性情中人
  2. Swift之深入解析“属性”的底层原理
  3. html(2)标签(1)
  4. 字节内部前端开发手册(完整版)开放下载!
  5. php左连接,如何在php中对左联接查询返回的数组数据进...
  6. spring心得6--自动装配知识点讲解及案例分析
  7. 李宏毅机器学习(五)Transformer
  8. html5svg在线编辑器,SVG to Canvas在线转换工具
  9. pip安装包报错Could not find a version that satisfies the requirement pymysql (from versions: none)
  10. [jquery]高级篇--获取div子元素
  11. Qt入门使用Qt编写程序详细全过程
  12. pycharm连接SqlServer数据库
  13. 会计学(第一课)笔记
  14. 【设计】工业设计公司设计师的原则
  15. 近义句子转换软件 - 同义词转换器软件
  16. 持续迭代、永久更新的WIN NFT HORSE,具有无穷无尽的生命力
  17. 计算机上海专业排名,2019上海软科世界一流学科排名计算机科学与工程专业排名斯坦福大学排名第2...
  18. 利用python爬虫可视化分析当当网的图书数据
  19. 列表3:修改删除函数实操
  20. 多项式计算大模拟:csp202112-3登机牌条码

热门文章

  1. 2016考研数学四轮进阶复习规划
  2. IDEA如何安装使用阿里代码规范插件
  3. 微信UnionId 部分开放
  4. Linux自学之旅-安装篇(一)
  5. 操作 神通数据库_神通数据库安装及操作笔记
  6. 实景三维的基石-osgb
  7. mysql数据库巡检方案_美团 MySQL 数据库巡检系统的设计与应用
  8. 从零开始封装windows10 1803 超详细图文分享 第二篇:母盘的定制与安装
  9. 关于过程改进和能力提升
  10. 计算机专业小米笔记本推荐,小米笔记本哪款好