TODO: split __init__'s doc and classes' doctags/v0.4.10
@@ -32,7 +32,6 @@ Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... | |||
我们在[这里](./source/user/example.rst)列举了fastNLP文档经常用到的reStructuredText语法(网页查看请结合Raw模式), | |||
您可以通过阅读它进行快速上手。FastNLP大部分的文档都是写在代码中通过Sphinx工具进行抽取生成的, | |||
您还可以参考这篇[未完成的文章](./source/user/docs_in_code.rst)了解代码内文档编写的规范。 | |||
## 文档维护人员 | |||
@@ -2,9 +2,9 @@ | |||
DataSet | |||
============================== | |||
:class:`~fastNLP.DataSet` 是fastNLP用于承载数据的类,一般训练集、验证集和测试集会被加载为三个单独的:class:`~fastNLP.DataSet`对象。 | |||
:class:`~fastNLP.DataSet` 是fastNLP用于承载数据的类,一般训练集、验证集和测试集会被加载为三个单独的 :class:`~fastNLP.DataSet` 对象。 | |||
:class:`~fastNLP.DataSet`中的数据组织形式类似一个表格,比如下面 :class:`~fastNLP.DataSet` 一共有3列,列在fastNLP中被称为field。 | |||
:class:`~fastNLP.DataSet` 中的数据组织形式类似一个表格,比如下面 :class:`~fastNLP.DataSet` 一共有3列,列在fastNLP中被称为field。 | |||
.. csv-table:: | |||
:header: "raw_chars", "chars", "seq_len" | |||
@@ -134,7 +134,7 @@ FastNLP 同样提供了多种删除数据的方法 :func:`~fastNLP.DataSet.drop` | |||
dataset.apply(get_words, new_field_name='words') | |||
除了手动处理数据集之外,你还可以使用 fastNLP 提供的各种 :class:`~fastNLP.io.Loader`和:class:`~fastNLP.io.Pipe` 来进行数据处理。 | |||
详细请参考这篇教程 :doc:`使用Loader和Pipe处理数据 </tutorials/tutorial_2_load_dataset>` 。 | |||
详细请参考这篇教程 :doc:`使用Loader和Pipe处理数据 </tutorials/tutorial_4_load_dataset>` 。 | |||
----------------------------- | |||
fastNLP中field的命名习惯 | |||
@@ -142,24 +142,22 @@ fastNLP中field的命名习惯 | |||
在英文任务中,fastNLP常用的field名称有: | |||
- raw_words: 表示的是原始的str。例如"This is a demo sentence ."。存在多个raw_words的情况,例如matching任务,它们会被定义为 | |||
raw_words0, raw_words1。但在conll格式下,raw_words列也可能为["This", "is", "a", "demo", "sentence", "."]的形式。 | |||
- words: 表示的是已经tokenize后的词语。例如["This", "is", "a", "demo", "sentence"], 但由于str并不能直接被神经网络所使用, | |||
所以words中的内容往往被转换为int,如[3, 10, 4, 2, 7, ...]等。多列words的情况,会被命名为words0, words1 | |||
- raw_words: 表示的是原始的str。例如"This is a demo sentence ."。存在多个raw_words的情况,例如matching任务,它们会被定义为raw_words0, raw_words1。但在conll格式下,raw_words列也可能为["This", "is", "a", "demo", "sentence", "."]的形式。 | |||
- words: 表示的是已经tokenize后的词语。例如["This", "is", "a", "demo", "sentence"], 但由于str并不能直接被神经网络所使用,所以words中的内容往往被转换为int,如[3, 10, 4, 2, 7, ...]等。多列words的情况,会被命名为words0, words1 | |||
- target: 表示目标值。分类场景下,只有一个值;序列标注场景下是一个序列。 | |||
- seq_len: 一般用于表示words列的长度 | |||
在中文任务中,fastNLP常用的field名称有: | |||
- raw_chars: 表示的是原始的连续汉字序列。例如"这是一个示例。" | |||
- chars: 表示已经切分为单独的汉字的序列。例如["这", "是", "一", "个", "示", "例", "。"]。但由于神经网络不能识别汉字,所以一般 | |||
该列会被转为int形式,如[3, 4, 5, 6, ...]。 | |||
- chars: 表示已经切分为单独的汉字的序列。例如["这", "是", "一", "个", "示", "例", "。"]。但由于神经网络不能识别汉字,所以一般该列会被转为int形式,如[3, 4, 5, 6, ...]。 | |||
- raw_words: 如果原始汉字序列中已经包含了词语的边界,则该列称为raw_words。如"上海 浦东 开发 与 法制 建设 同步"。 | |||
- words: 表示单独的汉字词语序列。例如["上海", "", "浦东", "开发", "与", "法制", "建设", ...]或[2, 3, 4, ...] | |||
- target: 表示目标值。分类场景下,只有一个值;序列标注场景下是一个序列。 | |||
- seq_len: 表示输入序列的长度 | |||
# TODO 这一段移动到datasetiter那里 | |||
.. todo:: | |||
这一段移动到datasetiter那里 | |||
----------------------------- | |||
DataSet与pad | |||
@@ -1,9 +1,8 @@ | |||
============================== | |||
Vocabulary | |||
============================== | |||
:class:`~fastNLP.Vocabulary`是包含字或词与index关系的类,用于将文本转换为index。 | |||
:class:`~fastNLP.Vocabulary` 是包含字或词与index关系的类,用于将文本转换为index。 | |||
----------------------------- | |||
构建Vocabulary | |||
@@ -87,8 +86,8 @@ Vocabulary | |||
vocab.from_dataset(tr_data, field_name='chars', no_create_entry_dataset=[dev_data]) | |||
:class:`~fastNLP.Vocabulary` 中的`no_create_entry`, 建议在添加来自于测试集和验证集的词的时候将该参数置为True, 或将验证集和测试集 | |||
传入`no_create_entry_dataset`参数。它们的意义是在接下来的模型会使用pretrain的embedding(包括glove, word2vec, elmo与bert)且会finetune的 | |||
:class:`~fastNLP.Vocabulary` 中的 `no_create_entry` , 建议在添加来自于测试集和验证集的词的时候将该参数置为True, 或将验证集和测试集 | |||
传入 `no_create_entry_dataset` 参数。它们的意义是在接下来的模型会使用pretrain的embedding(包括glove, word2vec, elmo与bert)且会finetune的 | |||
情况下,如果仅使用来自于train的数据建立vocabulary,会导致只出现在test与dev中的词语无法充分利用到来自于预训练embedding的信息(因为他们 | |||
会被认为是unk),所以在建立词表的时候将test与dev考虑进来会使得最终的结果更好。通过与fastNLP中的各种Embedding配合使用,会有如下的效果, | |||
如果一个词出现在了train中,但是没在预训练模型中,embedding会为随机初始化,且它单独的一个vector,如果finetune embedding的话, | |||
@@ -96,8 +95,8 @@ Vocabulary | |||
值(当unk的值更新时,这个词也使用的是更新之后的vector)。所以被认为是no_create_entry的token,将首先从预训练的词表中寻找它的表示,如 | |||
果找到了,就使用该表示; 如果没有找到,则认为该词的表示应该为unk的表示。 | |||
下面我们结合部分:code:`~fastNLP.embeddings.StaticEmbedding`的例子来说明下该值造成的影响,如果您对 | |||
:code:`~fastNLP.embeddings.StaticEmbedding`不太了解,您可以先参考\{Embedding教程的引用}部分再来阅读该部分 | |||
下面我们结合部分 :class:`~fastNLP.embeddings.StaticEmbedding` 的例子来说明下该值造成的影响,如果您对 | |||
:class:`~fastNLP.embeddings.StaticEmbedding` 不太了解,您可以先参考 :doc:`tutorial_3_embedding` 部分再来阅读该部分 | |||
.. code-block:: python | |||
@@ -26,17 +26,16 @@ elmo以及bert。 | |||
但使用这些词嵌入方式的时候都需要做一些加载上的处理,比如预训练的word2vec, fasttext以及glove都有着超过几十万个词语的表示,但一般任务大概 | |||
只会用到其中几万个词,如果直接加载所有的词汇,会导致内存占用变大以及运行速度变慢,需要从预训练文件中抽取本次实验的用到的词汇;而对于英文的 | |||
elmo和character embedding, 需要将word拆分成character才能使用;Bert的使用更是涉及到了Byte pair encoding(BPE)相关的内容。为了方便 | |||
大家的使用,fastNLP通过:class:`~fastNLP.Vocabulary`统一了不同embedding的使用。下面我们将讲述一些例子来说明一下 | |||
大家的使用,fastNLP通过 :class:`~fastNLP.Vocabulary` 统一了不同embedding的使用。下面我们将讲述一些例子来说明一下 | |||
--------------------------------------- | |||
Part II: 使用预训练的静态embedding | |||
--------------------------------------- | |||
在fastNLP中,加载预训练的word2vec, glove以及fasttext都使用的是 :class:`~fastNLP.embeddings.StaticEmbedding`。另外,为了方便大家的 | |||
在fastNLP中,加载预训练的word2vec, glove以及fasttext都使用的是 :class:`~fastNLP.embeddings.StaticEmbedding` 。另外,为了方便大家的 | |||
使用,fastNLP提供了多种静态词向量的自动下载并缓存(默认缓存到~/.fastNLP/embeddings文件夹下)的功能,支持自动下载的预训练向量可以在 | |||
`<https://docs.qq.com/sheet/DVnpkTnF6VW9UeXdh?c=A1A0A0>`_ | |||
查看。 | |||
`此处 <https://docs.qq.com/sheet/DVnpkTnF6VW9UeXdh?c=A1A0A0>`_ 查看。 | |||
.. code-block:: python | |||
@@ -56,17 +55,17 @@ Part II: 使用预训练的静态embedding | |||
torch.Size([1, 5, 50]) | |||
fastNLP的StaticEmbedding在初始化之后,就和pytorch中的Embedding是类似的了。:class:`~fastNLP.embeddings.StaticEmbedding`的初始化 | |||
主要是从model_dir_or_name提供的词向量中抽取出:class:`~fastNLP.Vocabulary`中词语的vector。 | |||
fastNLP的StaticEmbedding在初始化之后,就和pytorch中的Embedding是类似的了。 :class:`~fastNLP.embeddings.StaticEmbedding` 的初始化 | |||
主要是从model_dir_or_name提供的词向量中抽取出 :class:`~fastNLP.Vocabulary` 中词语的vector。 | |||
除了可以通过使用预先提供的Embedding,:class:`~fastNLP.embeddings.StaticEmbedding`也支持加载本地的预训练词向量,glove, word2vec以及 | |||
除了可以通过使用预先提供的Embedding, :class:`~fastNLP.embeddings.StaticEmbedding` 也支持加载本地的预训练词向量,glove, word2vec以及 | |||
fasttext格式的。通过将model_dir_or_name修改为本地的embedding文件路径,即可使用本地的embedding。 | |||
--------------------------------------- | |||
Part III: 使用随机初始化的embedding | |||
--------------------------------------- | |||
有时候需要使用随机初始化的Embedding,也可以通过使用 :class:`~fastNLP.embeddings.StaticEmbedding`获得。只需要将model_dir_or_name | |||
有时候需要使用随机初始化的Embedding,也可以通过使用 :class:`~fastNLP.embeddings.StaticEmbedding` 获得。只需要将model_dir_or_name | |||
置为None,且传入embedding_dim,如下例所示 | |||
.. code-block:: python | |||
@@ -93,7 +92,7 @@ Part IV: ELMo Embedding | |||
在fastNLP中,我们提供了ELMo和BERT的embedding: :class:`~fastNLP.embeddings.ElmoEmbedding` | |||
和 :class:`~fastNLP.embeddings.BertEmbedding` 。可自动下载的ElmoEmbedding可以 | |||
从`<https://docs.qq.com/sheet/DVnpkTnF6VW9UeXdh?c=A1A0A0>`_找到。 | |||
从 `此处 <https://docs.qq.com/sheet/DVnpkTnF6VW9UeXdh?c=A1A0A0>`_ 找到。 | |||
与静态embedding类似,ELMo的使用方法如下: | |||
@@ -124,7 +123,7 @@ Part IV: ELMo Embedding | |||
torch.Size([1, 5, 512]) | |||
另外,根据`<https://arxiv.org/abs/1802.05365>`_,不同层之间使用可学习的权重可以使得ELMo的效果更好,在fastNLP中可以通过以下的初始化 | |||
另外,根据 `这篇文章 <https://arxiv.org/abs/1802.05365>`_ ,不同层之间使用可学习的权重可以使得ELMo的效果更好,在fastNLP中可以通过以下的初始化 | |||
实现3层输出的结果通过可学习的权重进行加法融合。 | |||
.. code-block:: python | |||
@@ -142,7 +141,7 @@ Part V: Bert Embedding | |||
----------------------------------------------------------- | |||
虽然Bert并不算严格意义上的Embedding,但通过将Bert封装成Embedding的形式将极大减轻使用的复杂程度。可自动下载的Bert Embedding可以 | |||
从`<https://docs.qq.com/sheet/DVnpkTnF6VW9UeXdh?c=A1A0A0>`_找到。我们将使用下面的例子讲述一下 | |||
从 `此处 <https://docs.qq.com/sheet/DVnpkTnF6VW9UeXdh?c=A1A0A0>`_ 找到。我们将使用下面的例子讲述一下 | |||
BertEmbedding的使用 | |||
.. code-block:: python | |||
@@ -187,8 +186,8 @@ BertEmbedding的使用 | |||
torch.Size([1, 7, 768]) | |||
在英文Bert模型中,一个英文单词可能会被切分为多个subword,例如"fairness"会被拆分为["fair", "##ness"],这样一个word对应的将有两个输出, | |||
:class:`~fastNLP.embeddings.BertEmbedding`会使用pooling方法将一个word的subword的表示合并成一个vector,通过pool_method可以控制 | |||
在英文Bert模型中,一个英文单词可能会被切分为多个subword,例如"fairness"会被拆分为 ``["fair", "##ness"]`` ,这样一个word对应的将有两个输出, | |||
:class:`~fastNLP.embeddings.BertEmbedding` 会使用pooling方法将一个word的subword的表示合并成一个vector,通过pool_method可以控制 | |||
该pooling方法,支持的有"first"(即使用fair的表示作为fairness的表示), "last"(使用##ness的表示作为fairness的表示), "max"(对fair和 | |||
##ness在每一维上做max),"avg"(对fair和##ness每一维做average)。 | |||
@@ -201,7 +200,7 @@ BertEmbedding的使用 | |||
torch.Size([1, 5, 768]) | |||
另外,根据`<https://arxiv.org/abs/1810.04805>`_ ,Bert的还存在一种用法,句子之间通过[SEP]拼接起来,前一句话的token embedding为0, | |||
另外,根据 `文章 <https://arxiv.org/abs/1810.04805>`_ ,Bert的还存在一种用法,句子之间通过[SEP]拼接起来,前一句话的token embedding为0, | |||
后一句话的token embedding为1。BertEmbedding能够自动识别句子中间的[SEP]来正确设置对应的token_type_id的。 | |||
.. code-block:: python | |||
@@ -220,7 +219,10 @@ BertEmbedding的使用 | |||
在多个[SEP]的情况下,将会使token_type_id不断0,1循环。比如"first sentence [SEP] second sentence [SEP] third sentence", 它们的 | |||
token_type_id将是[0, 0, 0, 1, 1, 1, 0, 0]。但请注意[SEP]一定要大写的,不能是[sep],否则无法识别。 | |||
更多:class:`~fastNLP.embedding.BertEmbedding`的使用,请参考\ref{找人写一篇BertEmbedding的使用教程} | |||
更多 :class:`~fastNLP.embedding.BertEmbedding` 的使用,请参考BertEmbedding的使用教程 | |||
.. todo:: | |||
找人写一篇BertEmbedding的使用教程 | |||
----------------------------------------------------- | |||
Part VI: 使用character-level的embedding | |||
@@ -228,8 +230,8 @@ Part VI: 使用character-level的embedding | |||
除了预训练的embedding以外,fastNLP还提供了两种Character Embedding: :class:`~fastNLP.embeddings.CNNCharEmbedding` 和 | |||
:class:`~fastNLP.embeddings.LSTMCharEmbedding` 。一般在使用character embedding时,需要在预处理的时候将word拆分成character,这 | |||
会使得预处理过程变得非常繁琐。在fastNLP中,使用character embedding也只需要传入:class:`~fastNLP.Vocabulary`即可,而且该 | |||
Vocabulary与其它Embedding使用的Vocabulary是一致的,如下面的例子所示 | |||
会使得预处理过程变得非常繁琐。在fastNLP中,使用character embedding也只需要传入 :class:`~fastNLP.Vocabulary` 即可,而且该 | |||
Vocabulary与其它Embedding使用的Vocabulary是一致的,下面我们看两个例子。 | |||
CNNCharEmbedding的使用例子如下: | |||
@@ -273,7 +275,7 @@ CNNCharEmbedding的使用例子如下: | |||
Part VII: 叠加使用多个embedding | |||
----------------------------------------------------- | |||
单独使用Character Embedding往往效果并不是很好,需要同时结合word embedding。在fastNLP中可以通过:class:`~fastNLP.embeddings.StackEmbedding` | |||
单独使用Character Embedding往往效果并不是很好,需要同时结合word embedding。在fastNLP中可以通过 :class:`~fastNLP.embeddings.StackEmbedding` | |||
来叠加embedding,具体的例子如下所示 | |||
.. code-block:: python | |||
@@ -295,10 +297,10 @@ Part VII: 叠加使用多个embedding | |||
torch.Size([1, 5, 114]) | |||
:class:`~fastNLP.embeddings.StaticEmbedding`, :class:`~fastNLP.embeddings.ElmoEmbedding`, | |||
:class:`~fastNLP.embeddings.CNNCharEmbedding`, :class:`~fastNLP.embeddings.BertEmbedding`等都可以互相拼接。 | |||
:class:`~fastNLP.embeddings.StackEmbedding`的使用也是和其它Embedding是一致的,即输出index返回对应的表示。但能够拼接起来的Embedding | |||
必须使用同样的:class:`~fastNLP.Vocabulary`,因为只有使用同样的:class:`~fastNLP.Vocabulary`才能保证同一个index指向的是同一个词或字 | |||
:class:`~fastNLP.embeddings.StaticEmbedding` , :class:`~fastNLP.embeddings.ElmoEmbedding` , | |||
:class:`~fastNLP.embeddings.CNNCharEmbedding` , :class:`~fastNLP.embeddings.BertEmbedding` 等都可以互相拼接。 | |||
:class:`~fastNLP.embeddings.StackEmbedding` 的使用也是和其它Embedding是一致的,即输出index返回对应的表示。但能够拼接起来的Embedding | |||
必须使用同样的 :class:`~fastNLP.Vocabulary` ,因为只有使用同样的 :class:`~fastNLP.Vocabulary` 才能保证同一个index指向的是同一个词或字 | |||
----------------------------------------------------------- | |||
Part VIII: Embedding的其它说明 | |||
@@ -345,24 +347,24 @@ Part VIII: Embedding的其它说明 | |||
fastNLP中所有的Embedding都支持传入word_dropout和dropout参数,word_dropout指示的是以多大概率将输入的word置为unk的index,这样既可以 | |||
是的unk得到训练,也可以有一定的regularize效果; dropout参数是在获取到word的表示之后,以多大概率将一些维度的表示置为0。 | |||
如果使用:class:`~fastNLP.embeddings.StackEmbedding`且需要用到word_dropout,建议将word_dropout设置在:class:`~fastNLP.embeddings.StackEmbedding`。 | |||
如果使用 :class:`~fastNLP.embeddings.StackEmbedding` 且需要用到word_dropout,建议将word_dropout设置在 :class:`~fastNLP.embeddings.StackEmbedding` 。 | |||
----------------------------------------------------------- | |||
Part IX: StaticEmbedding的使用建议 | |||
----------------------------------------------------------- | |||
在英文的命名实体识别(NER)任务中,由`<http://xxx.itp.ac.cn/pdf/1511.08308.pdf>`_ 指出,同时使用cnn character embedding和word embedding | |||
会使得NER的效果有比较大的提升。正如你在\ref{引用第七节}看到的那样,fastNLP支持将:class:`~fastNLP.embeddings.CNNCharacterEmbedding` | |||
与:class:`~fastNLP.embeddings.StaticEmbedding`拼成一个:class:`~fastNLP.embeddings.StackEmbedding`。如果通过这种方式使用,需要 | |||
在英文的命名实体识别(NER)任务中,由 `论文 <http://xxx.itp.ac.cn/pdf/1511.08308.pdf>`_ 指出,同时使用cnn character embedding和word embedding | |||
会使得NER的效果有比较大的提升。正如你在上节中看到的那样,fastNLP支持将 :class:`~fastNLP.embeddings.CNNCharEmbedding` | |||
与 :class:`~fastNLP.embeddings.StaticEmbedding` 拼成一个 :class:`~fastNLP.embeddings.StackEmbedding` 。如果通过这种方式使用,需要 | |||
在预处理文本时,不要将词汇小写化(因为Character Embedding需要利用词语中的大小写信息)且不要将出现频次低于某个阈值的word设置为unk(因为 | |||
Character embedding需要利用字形信息);但:class:`~fastNLP.embeddings.StaticEmbedding`使用的某些预训练词嵌入的词汇表中只有小写的词 | |||
Character embedding需要利用字形信息);但 :class:`~fastNLP.embeddings.StaticEmbedding` 使用的某些预训练词嵌入的词汇表中只有小写的词 | |||
语, 且某些低频词并未在预训练中出现需要被剔除。即(1) character embedding需要保留大小写,而某些static embedding不需要保留大小写。(2) | |||
character embedding需要保留所有的字形, 而static embedding需要设置一个最低阈值以学到更好的表示。 | |||
(1) fastNLP如何解决关于大小写的问题 | |||
fastNLP通过在:class:`~fastNLP.embeddings.StaticEmbedding`增加了一个lower参数解决该问题。如下面的例子所示 | |||
fastNLP通过在 :class:`~fastNLP.embeddings.StaticEmbedding` 增加了一个lower参数解决该问题。如下面的例子所示 | |||
.. code-block:: python | |||
@@ -380,7 +382,7 @@ fastNLP通过在:class:`~fastNLP.embeddings.StaticEmbedding`增加了一个lower | |||
tensor([[-0.4685, 0.4572, 0.5159, -0.2618, -0.6871]], grad_fn=<EmbeddingBackward>) | |||
tensor([[ 0.2615, 0.1490, -0.2491, 0.4009, -0.3842]], grad_fn=<EmbeddingBackward>) | |||
可以看到"The"与"the"的vector是不一致的。但如果我们在初始化:class:`~fastNLP.embeddings.StaticEmbedding`将lower设置为True,效果将 | |||
可以看到"The"与"the"的vector是不一致的。但如果我们在初始化 :class:`~fastNLP.embeddings.StaticEmbedding` 将lower设置为True,效果将 | |||
如下所示 | |||
.. code-block:: python | |||
@@ -399,12 +401,12 @@ fastNLP通过在:class:`~fastNLP.embeddings.StaticEmbedding`增加了一个lower | |||
tensor([[-0.2237, 0.6825, -0.3459, -0.1795, 0.7516]], grad_fn=<EmbeddingBackward>) | |||
tensor([[-0.2237, 0.6825, -0.3459, -0.1795, 0.7516]], grad_fn=<EmbeddingBackward>) | |||
可以看到"The"与"the"的vector是一致的。他们实际上也是引用的同一个vector。通过将lower设置为True,可以在:class:`~fastNLP.embeddings.StaticEmbedding` | |||
可以看到"The"与"the"的vector是一致的。他们实际上也是引用的同一个vector。通过将lower设置为True,可以在 :class:`~fastNLP.embeddings.StaticEmbedding` | |||
实现类似具备相同小写结果的词语引用同一个vector。 | |||
(2) fastNLP如何解决min_freq的问题 | |||
fastNLP通过在:class:`~fastNLP.embeddings.StaticEmbedding`增加了一个min_freq参数解决该问题。如下面的例子所示 | |||
fastNLP通过在 :class:`~fastNLP.embeddings.StaticEmbedding` 增加了一个min_freq参数解决该问题。如下面的例子所示 | |||
.. code-block:: python | |||
@@ -18,11 +18,11 @@ Part I: 数据集容器DataBundle | |||
------------------------------------ | |||
而由于对于同一个任务,训练集,验证集和测试集会共用同一个词表以及具有相同的目标值,所以在fastNLP中我们使用了 :class:`~fastNLP.io.DataBundle` | |||
来承载同一个任务的多个数据集 :class:`~fastNLP.DataSet` 以及它们的词表 :class:`~fastNLP.Vocabulary`。下面会有例子介绍:class:`~fastNLP.io.DataBundle` | |||
来承载同一个任务的多个数据集 :class:`~fastNLP.DataSet` 以及它们的词表 :class:`~fastNLP.Vocabulary`。下面会有例子介绍 :class:`~fastNLP.io.DataBundle` | |||
的相关使用。 | |||
:class: `~fastNLP.io.DataBundle` 在fastNLP中主要在各个 :class: `~fastNLP.io.Loader` 和 :class: `~fastNLP.io.Pipe` 中被使用。 | |||
下面我们将先介绍一下 :class: `~fastNLP.io.Loader` 和 :class: `~fastNLP.io.Pipe`, 之后我们将给出相应的例子。 | |||
:class:`~fastNLP.io.DataBundle` 在fastNLP中主要在各个 :class:`~fastNLP.io.Loader` 和 :class:`~fastNLP.io.Pipe` 中被使用。 | |||
下面我们将先介绍一下 :class:`~fastNLP.io.Loader` 和 :class:`~fastNLP.io.Pipe` , 之后我们将给出相应的例子。 | |||
------------------------------------- | |||
Part II: 加载的各种数据集的Loader | |||
@@ -31,13 +31,12 @@ Part II: 加载的各种数据集的Loader | |||
在fastNLP中,所有的数据Loader都可以通过其文档判断其支持读取的数据格式,以及读取之后返回的 :class:`~fastNLP.DataSet` 的格式。例如 | |||
\ref 加个引用。 | |||
- download 函数:自动将该数据集下载到缓存地址,默认缓存地址为~/.fastNLP/datasets/。由于版权等原因,不是所有的Loader都实现了该方法。 | |||
该方法会返回下载后文件所处的缓存地址。可以查看对应Loader的download的方法的文档来判断该Loader加载的数据。 | |||
- _load 函数:从一个数据文件中读取数据,返回一个 :class:`~fastNLP.DataSet`。返回的DataSet的格式可从Loader文档判断。 | |||
- download 函数:自动将该数据集下载到缓存地址,默认缓存地址为~/.fastNLP/datasets/。由于版权等原因,不是所有的Loader都实现了该方法。该方法会返回下载后文件所处的缓存地址。可以查看对应Loader的download的方法的文档来判断该Loader加载的数据。 | |||
- _load 函数:从一个数据文件中读取数据,返回一个 :class:`~fastNLP.DataSet` 。返回的DataSet的格式可从Loader文档判断。 | |||
- load 函数:从文件或者文件夹中读取数据并组装成 :class:`~fastNLP.io.DataBundle`。支持接受的参数类型有以下的几种 | |||
- None, 将尝试读取自动缓存的数据,仅支持提供了自动下载数据的Loader | |||
- 文件夹路径, 默认将尝试在该路径下匹配文件名中含有`train`, `test`, `dev`的文件,如果有多个文件含有这相同的关键字,将无法通过 | |||
该方式读取 | |||
- 文件夹路径, 默认将尝试在该路径下匹配文件名中含有 `train` , `test` , `dev` 的python文件,如果有多个文件含有这相同的关键字,将无法通过该方式读取 | |||
- dict, 例如{'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"} | |||
.. code-block:: python | |||
@@ -66,7 +65,7 @@ Part II: 加载的各种数据集的Loader | |||
tr_data = data_bundle.get_dataset('train') | |||
print(tr_data[:2]) | |||
输出为:: | |||
输出为:: | |||
+--------------------------------------------------------------------------------------+ | |||
| raw_words | | |||
@@ -81,18 +80,16 @@ Part III: 使用Pipe对数据集进行预处理 | |||
通过:class:`~fastNLP.io.Loader` 可以将文本数据读入,但并不能直接被神经网络使用,还需要进行一定的预处理。 | |||
在fastNLP中,我们使用 :class:`~fastNLP.io.Pipe`的子类作为数据预处理的类,Pipe和Loader一般具备一一对应的关系,该关系可以从其名称判断, | |||
例如:class:`~fastNLP.io.CWSLoader`与:class:`~fastNLP.io.CWSPipe`是一一对应的。一般情况下Pipe处理包含以下的几个过程,(1)将raw_words或 | |||
raw_chars进行tokenize以切分成不同的词或字; (2) 再建立词或字的 :class:`~fastNLP.Vocabulary`, 并将词或字转换为index; (3)将target | |||
例如 :class:`~fastNLP.io.CWSLoader` 与 :class:`~fastNLP.io.CWSPipe` 是一一对应的。一般情况下Pipe处理包含以下的几个过程,(1)将raw_words或 | |||
raw_chars进行tokenize以切分成不同的词或字; (2) 再建立词或字的 :class:`~fastNLP.Vocabulary` , 并将词或字转换为index; (3)将target | |||
列建立词表并将target列转为index; | |||
所有的Pipe都可通过其文档查看通过该Pipe之后DataSet中的field的情况; 如 \ref{TODO 添加对例子的引用} | |||
各种数据集的Pipe当中,都包含了以下的两个函数: | |||
- process 函数:对输入的 :class:`~fastNLP.io.DataBundle` 进行处理, 然后返回处理之后的 :class:`~fastNLP.io.DataBundle`。 | |||
process函数的文档中包含了该Pipe支持处理的DataSet的格式。 | |||
- process_from_file 函数:输入数据集所在文件夹,使用对应的Loader读取数据(所以该函数支持的参数类型是由于其对应的Loader的load函数 | |||
决定的),然后调用相对应的process函数对数据进行预处理。相当于是把Load和process放在一个函数中执行。 | |||
- process 函数:对输入的 :class:`~fastNLP.io.DataBundle` 进行处理, 然后返回处理之后的 :class:`~fastNLP.io.DataBundle` 。process函数的文档中包含了该Pipe支持处理的DataSet的格式。 | |||
- process_from_file 函数:输入数据集所在文件夹,使用对应的Loader读取数据(所以该函数支持的参数类型是由于其对应的Loader的load函数决定的),然后调用相对应的process函数对数据进行预处理。相当于是把Load和process放在一个函数中执行。 | |||
接着上面CWSLoader的例子,我们展示一下CWSPipe的功能: | |||
@@ -116,8 +113,7 @@ raw_chars进行tokenize以切分成不同的词或字; (2) 再建立词或字的 | |||
表示一共有3个数据集和2个词表。其中: | |||
- 3个数据集分别为train、dev、test数据集,分别有17223、1831、1944个instance | |||
- 2个词表分别为chars词表与target词表。其中chars词表为句子文本所构建的词表,一共有4777个字; | |||
target词表为目标标签所构建的词表,一共有4种标签。 | |||
- 2个词表分别为chars词表与target词表。其中chars词表为句子文本所构建的词表,一共有4777个字;target词表为目标标签所构建的词表,一共有4种标签。 | |||
相较于之前CWSLoader读取的DataBundle,新增了两个Vocabulary。 我们可以打印一下处理之后的DataSet | |||
@@ -161,8 +157,7 @@ Part V: 不同格式类型的基础Loader | |||
除了上面提到的针对具体任务的Loader,我们还提供了CSV格式和JSON格式的Loader | |||
:class:`~fastNLP.io.loader.CSVLoader` | |||
读取CSV类型的数据集文件。例子如下: | |||
:class:`~fastNLP.io.loader.CSVLoader` 读取CSV类型的数据集文件。例子如下: | |||
.. code-block:: python | |||
@@ -190,8 +185,7 @@ Part V: 不同格式类型的基础Loader | |||
"You could hate it for the same reason .", "1" | |||
"The performances are an absolute joy .", "4" | |||
:class:`~fastNLP.io.loader.JsonLoader` | |||
读取Json类型的数据集文件,数据必须按行存储,每行是一个包含各类属性的Json对象。例子如下: | |||
:class:`~fastNLP.io.JsonLoader` 读取Json类型的数据集文件,数据必须按行存储,每行是一个包含各类属性的Json对象。例子如下: | |||
.. code-block:: python | |||
@@ -4,7 +4,7 @@ | |||
我们使用和 :doc:`/user/quickstart` 中一样的任务来进行详细的介绍。给出一段评价性文字,预测其情感倾向是积极(label=1)、 | |||
消极(label=0)还是中性(label=2),使用 :class:`~fastNLP.DataSetIter` 类来编写自己的训练过程。 | |||
自己编写训练过程之前的内容与 :doc:`/tutorials/tutorial_4_loss_optimizer` 中的完全一样,如已经阅读过可以跳过。 | |||
自己编写训练过程之前的内容与 :doc:`/tutorials/tutorial_6_loss_optimizer` 中的完全一样,如已经阅读过可以跳过。 | |||
-------------- | |||
数据处理 | |||
@@ -805,7 +805,7 @@ class TensorboardCallback(Callback): | |||
.. warning:: | |||
fastNLP 已停止对此功能的维护,请等待 fastNLP 兼容 PyTorch1.1 的下一个版本。 | |||
或者使用和 fastNLP 高度配合的 fitlog(参见 :doc:`/tutorials/tutorial_10_fitlog` )。 | |||
或者使用和 fastNLP 高度配合的 fitlog(参见 :doc:`/tutorials/tutorial_11_fitlog` )。 | |||
""" | |||
@@ -86,7 +86,7 @@ | |||
dataset.append(Instance(sentence=sent, label=label)) | |||
.. note:: | |||
直接读取特定数据集的数据请参考 :doc:`/tutorials/tutorial_2_load_dataset` | |||
直接读取特定数据集的数据请参考 :doc:`/tutorials/tutorial_4_load_dataset` | |||
2.2 对DataSet中的内容处理 | |||
-------------------------------------- | |||