背景
文心包含各种各样的Reader, 主要用于处理样本中各个域相互独立的场景,不同域有单独的数据类型(文本、数值、整型、浮点型)、单独的词表(vocabulary)等,可以根据不同域进行语义表示,如文本转id等操作,field_reader是实现这些操作的类,可以通过data_set_reader管理、整合不同的field_reader。
域配置
- 域(field):同一个样本中,多个相互独立的特征与标签都可以是单独的域。在textone中,不同域之间是相互独立的,每个域有单独的数据类型(文本、数值、整型、浮点型),单独的数据预处理过程,如tokenizer、词表等。
-
以文本分类任务为例,其数据如下所示:
- 在这个例子中,“房间 太 小 。 其他 的 都 一般”这段文本属于文本域,而“0”作为标签属于标签域。
- 域和域之间使用\t进行分隔。
Reader字段说明
字段 |
说明 |
|
DataSetReader(出现在匹配任务和自定义任务中) |
数据集读取器,将样本中的数据组装成一个py_reader, 向外提供一个统一的接口。其核心内容是读取明文文件后转换成id,并按照py_reader需要的tensor格式进行输入,最后通过调用run方法让整个循环运行起来包括BasicDataSetReader(通用数据集读取器,是大部分任务的默认选项)和ErnieClassificationDataSetReader(使用ernie的FC匹配任务专用数据集读取器)两种 |
|
name |
该域的名称,例如text_a、text_b和label等 |
|
reader_type |
分域数据处理器的类型,不同域对应不同的数据处理器,各任务常用处理器在下述章节详细阐述 |
|
data_type |
该域内数据的类型,例如string(字符串型)、int(基本整型,注意textone仅支持int64型)和float(浮点型)等 |
|
need_convert |
是否需要词表转id,string类型的数据(例如文本)需要通过词表转化为id,而int类型的数据(例如标签)则不需要 |
|
vocab_path |
在词表目录dict下的词表名称,例如文本域对应的词表vocab.txt,或者序列标注任务中标签域对应的label_map.txt |
|
max_seq_len |
域内数据样本的最长长度,以字符为单位,默认为512 |
|
truncation_type |
截断策略,分为常规截断策略(从头开始到最大长度截断,通用)、去尾截断策略(从头开始到max_len-1的位置截断,末尾补上最后一个id,常用于语言模型)和头尾保留截断策略(保留头和尾两个位置,然后按keep_head方式截断,常用于语言模型)三种。默认为常规截断策略。 |
|
padding id |
填充策略,用于处理不同长度的句子,默认为0,即将数据转换为id后在末尾填充0至设定的最大序列长度 |
|
tokenizer |
分词处理器,作用于文本域,根据设定按某个分隔符(如空格)将数据分成一个list |
|
num_labels |
多标签分类中的标签数量 |
|
- 其中,tokenizer部分的相关字段说明如下表所示:
字段 |
说明 |
type |
分词器的类型,分为CustomTokenizer(通用的tokenizer,将用户自己分好词的明文按某个分隔符分成一个list)、WSSPTokenizer和FullTokenizer三种,各任务常用分词器在下述章节详细描述 |
split_char |
词与词之间的分隔符,默认为空格 |
unk_token |
未知词的标记,即不在词表中的词,默认标记为[UNK] |
各任务常用的分域reader和tokenizer说明
分类任务
分域reader
- 文本分类任务常用的分域reader和其基本介绍如下所示:
名称 |
简介 |
备注 |
CustomTextFieldReader(非ernie文本域默认) |
通用非ernie文本(string)类型的分域reader |
文本类型的数据会自动添加padding和mask,并返回length |
ScalarFieldReader(标签域默认) |
单个标量的分域reader,直接返回数据本身(数据可以是单个数字,也可以是单个的明文字符,明文通过配置的vocab_path去进行转换) |
shape= [batch_size,1] |
ErnieTextFieldReader(ernie文本域默认) |
使用ernie的文本类型的分域reader,用户不需要自己分词 |
自动添加padding,mask,position,task,sentence,并返回length |
ScalarArrayFieldReader(可选) |
标量数组的分域reader,直接返回数据本身(数据可以是明文字符串,明文配置的vocab_path去进行转换)和数据长度,以空格分隔。 |
数据是经过padding处理的。 |
TextFieldReader(可选) |
最基本的文本(text)类型的分域reader |
不需要embedding,不需要mask,只返回原始src_id(添加了padding)和length |
MultiLabelFieldReader(多标签任务时标签域默认) |
多标签分类任务中标签域的专用reader |
无 |
CategoricalFieldReader(可选) |
通用文本(string)类型的field_reader, 不进行分词,直接通过词表将明文转成id。选择该field_reader时将不会配置tokenizer |
文本处理规则是,文本类型的数据会自动添加padding和mask,并返回length. 比较特殊的一点是,这个field_reader中的length全是1 |
MultiLabelFieldReader(可选) |
多标签分类的reader |
数值类型的标签数据 |
tokenizer
- 文本分类任务常用的tokenizer和其基本介绍如下所示:
名称 |
简介 |
CustomTokenizer |
通用的tokenizer,用户自己分好词的明文,该tokenizer只负责按某个分隔符(如空格)分成一个list |
FullTokenizer |
ERNIE除tiny外专用tokenizer,按照字粒度进行切分 |
WSSPTokenizer |
ERNIE Tiny专用tokenizer,使用SentencePiece切词 |
匹配任务
分域reader
- 文本匹配任务常用的分域reader和其基本介绍如下所示:
名称 |
简介 |
备注 |
CustomTextFieldReader(非ernie文本域默认) |
通用非ernie文本(string)类型的分域reader |
文本类型的数据会自动添加padding和mask,并返回length |
ErnieClassificationFieldReader(基于ernie的FC匹配模型默认) |
基于ernie的FC匹配模型专用分域reader,包含双文本域的拼接,用户不需要自己分词 |
自动添加padding,mask,position,task,sentence,并返回length |
ScalarFieldReader(标签域默认) |
单个标量的分域reader,直接返回数据本身(数据可以是单个数字,也可以是单个的明文字符,明文通过配置的vocab_path去进行转换) |
shape= [batch_size,1] |
ErnieTextFieldReader(除FC模型外,ernie文本域默认) |
使用ernie的文本类型的field_reader,用户不需要自己分词 |
自动添加padding,mask,position,task,sentence,并返回length |
ScalarArrayFieldReader(可选) |
标量数组的分域reader,直接返回数据本身(数据可以是明文字符串,明文配置的vocab_path去进行转换)和数据长度,以空格分隔。 |
数据是经过padding处理的。 |
TextFieldReader(可选) |
最基本的文本(text)类型的分域reader |
不需要embedding,不需要mask,只返回原始src_id(添加了padding)和length |
tokenizer
- 文本匹配任务常用的tokenizer和其基本介绍如下所示:
名称 |
简介 |
CustomTokenizer |
通用的tokenizer,用户自己分好词的明文,该tokenizer只负责按某个分隔符(如空格)分成一个list |
FullTokenizer |
ERNIE除tiny外专用tokenizer,按照字粒度进行切分 |
WSSPTokenizer |
ERNIE Tiny专用tokenizer,使用SentencePiece切词 |
序列标注
分域reader
- 序列标注任务常用的分域reader和其基本介绍如下所示:
名称 |
简介 |
备注 |
CustomTextFieldReader(非ernie文本域默认) |
通用非ernie文本(string)类型的分域reader |
文本类型的数据会自动添加padding和mask,并返回length |
ErnieSeqlabelLabelFieldReader(ernie文本域默认) |
基于ernie的序列标注专用分域reader,基本规则与CustomTextFieldReader相同,自动添加padding和mask,并返回length |
不同之处在于ErnieSeqlabelLabelFieldReader会在序列首尾分别添加UNK_ID来占位,以保证和ernie序列化过程中的[CLS]和[SEP]对应 |
ScalarFieldReader(可选) |
单个标量的分域reader,直接返回数据本身(数据可以是单个数字,也可以是单个的明文字符,明文通过配置的vocab_path去进行转换) |
shape= [batch_size,1] |
ScalarArrayFieldReader(可选) |
标量数组的分域reader,直接返回数据本身(数据可以是明文字符串,明文配置的vocab_path去进行转换)和数据长度,以空格分隔。 |
数据是经过padding处理的。 |
TextFieldReader(可选) |
最基本的文本(text)类型的分域reader |
不需要embedding,不需要mask,只返回原始src_id(添加了padding)和length |
ErnieTextFieldReader(可选) |
使用ernie的文本类型的field_reader,用户不需要自己分词 |
自动添加padding,mask,position,task,sentence,并返回length |
tokenizer
- 序列标注任务常用的tokenizer和其基本介绍如下所示:
名称 |
简介 |
CustomTokenizer |
通用的tokenizer,用户自己分好词的明文,该tokenizer只负责按某个分隔符(如空格)分成一个list |
FullTokenizer |
ERNIE除tiny外专用tokenizer,按照字粒度进行切分 |
WSSPTokenizer |
ERNIE Tiny专用tokenizer,使用SentencePiece切词 |
生成任务(Seq2Seq+Attention)
分域reader
- 生成任务(Seq2Seq+Attention)常用的分域reader和其基本介绍如下所示:
名称 |
简介 |
备注 |
CustomTextFieldReader(非ernie文本域默认) |
通用非ernie文本(string)类型的分域reader |
文本类型的数据会自动添加padding和mask,并返回length |
GenerateLabelFieldReader(生成任务seq2seq模型标签域默认) |
seq2seq模型的标签域的专用分域reader |
自动添加padding,mask,position,task,sentence,并返回length |
ScalarFieldReader(可选) |
单个标量的分域reader,直接返回数据本身(数据可以是单个数字,也可以是单个的明文字符,明文通过配置的vocab_path去进行转换) |
shape= [batch_size,1] |
ScalarArrayFieldReader(可选) |
标量数组的分域reader,直接返回数据本身(数据可以是明文字符串,明文配置的vocab_path去进行转换)和数据长度,以空格分隔。 |
数据是经过padding处理的。 |
TextFieldReader(可选) |
最基本的文本(text)类型的分域reader |
不需要embedding,不需要mask,只返回原始src_id(添加了padding)和length |
tokenizer
- 生成任务(Seq2Seq+Attention)常用的tokenizer和其基本介绍如下所示:
名称 |
简介 |
CustomTokenizer |
通用的tokenizer,用户自己分好词的明文,该tokenizer只负责按某个分隔符(如空格)分成一个list |
数据参数配置
字段说明
字段 |
说明 |
shuffle |
是否打乱训练数据,默认为是。打乱训练数据后,模型在训练时不易陷入局部最优,能够更容易达到收敛。 |
batchsize |
每批处理的样本的个数,非ernie默认为16,ernie默认为8注:只支持正整数,ERNIE任务建议不超过8,非Ernie任务酌情调整。 |
epoch |
所有训练数据的训练次数,默认为1注:只支持正整数,建议值不超过10 |
进阶使用
文心中提供了NLP领域比较通用的Reader,如果用户需要针对自己的业务场景进行自定义优化使用的话,请参考详细的接口设计与自定义DataSeteader 和 FieldReader