From 9c955cc0aa83cba7dfa1a9611d064a22d48e6d24 Mon Sep 17 00:00:00 2001 From: peterzhang2029 Date: Fri, 13 Oct 2017 12:14:49 +0800 Subject: [PATCH] refine introduction in doc --- nested_sequence/text_classification/README.md | 23 +- .../text_classification/index.html | 237 ------------------ 2 files changed, 14 insertions(+), 246 deletions(-) delete mode 100644 nested_sequence/text_classification/index.html diff --git a/nested_sequence/text_classification/README.md b/nested_sequence/text_classification/README.md index 0950564b..aee0bf71 100644 --- a/nested_sequence/text_classification/README.md +++ b/nested_sequence/text_classification/README.md @@ -1,29 +1,34 @@ -# 双层序列文本分类 +# 基于双层序列的文本分类 ## 简介 -序列数据是自然语言处理任务面对的一种主要输入数据类型:一句话是由词语构成的序列,多句话进一步构成了段落。因此,段落可以看作是一个嵌套的双层的序列,这个序列的每个元素又是一个序列。 +序列是自然语言处理任务面对的一种主要输入数据类型:句子由词语构成,而多个句子进一步构成了段落。因此,段落可以看作是一个嵌套的序列(或者叫作:双层序列),这个序列的每个元素又是一个序列。 -双层序列是`PaddlePaddle`支持的一种非常灵活的数据组织方式,帮助我们更好地描述段落、多轮对话等更为复杂的语言数据。基于双层序列输入,我们可以设计一个层次化的网络,分别从词语和句子级别编码输入数据,更好地完成一些复杂的语言理解任务。 +双层序列是 PaddlePaddle 支持的一种非常灵活的数据组织方式,能够帮助我们更好地描述段落、多轮对话等更为复杂的语言数据。以双层序列作为输入,我们可以设计一个层次化的网络,分别从词语和句子级别编码输入数据,从而更好地完成一些复杂的语言理解任务。 -本示例将演示如何使用`PaddlePaddle`来组织双层序列文本数据,完成文本分类任务。 +本例将演示如何在 PaddlePaddle 中将长文本输入(通常能达到段落或者篇章基本)组织为双层序列,完成对长文本的分类任务。 ## 模型介绍 -对于文本分类,我们将一段文本看成句子的数组,每个句子又是单词的数组,这便是一种双层序列的输入数据。而将这个段落的每一句话用卷积神经网络编码为一个向量,再将每句话的表示向量经过池化层编码成一个段落的向量, 即可得到段落的表示向量。对于分类任务,将段落表示向量作为分类器的输入可以得到分类结果。 +我们将一段文本看成句子的序列,而每个句子又是词语的序列。 + +我们首先用卷积神经网络编码段落中的每一句话;然后,将每句话的表示向量经过池化层得到段落的编码向量;最后将段落的编码向量作为分类器(以softmax层的全连接层)输入,得到最终的分类结果。 **模型结构如下图所示**


-图1. 本例中的文本分类模型 +图1. 基于双层序列的文本分类模型

PaddlePaddle 实现该网络结构的代码见 `network_conf.py`。 -对于双层序列的处理,需要先将双层时间序列数据先变换成单层时间序列数据,再对每一个单层时间序列进行处理。 PaddlePaddle提供了 `recurrent_group` 接口进行转换,在本例中,我们将文本数据的每一段,通过 recurrent_group 进行拆解,拆解成的每一句话再通过一个 CNN网络学习对应的向量表示。 +对双层时间序列的处理,需要先将双层时间序列数据变换成单层时间序列数据,再对每一个单层时间序列进行处理。 在 PaddlePaddle 中 ,`recurrent_group` 是帮助我们构建处理双层序列的层次化模型的主要工具。这里,我们使用两个嵌套的 `recurrent_group` 。外层的 `recurrent_group` 将段落拆解为句子,`step` 函数中拿到的输入是句子序列;内层的 `recurrent_group` 将句子拆解为词语,`step` 函数中拿到的输入是非序列的词语。 + +在词语级别,我们通过 CNN 网络以词向量为输入输出学习到的句子表示;在段落级别,将每个句子的表示通过池化作用得到段落表示。 + ``` python nest_group = paddle.layer.recurrent_group(input=[paddle.layer.SubsequenceInput(emb), hidden_size], step=cnn_cov_group) ``` -使用`recurrent_group`接口进行变换时,需要将输入序列传入 `input` 属性。 由于本例要实现的变换是`双层时间序列 => 单层时间序列`,所以我们需要将输入数据标记成 `SubsequenceInput`。 + 拆解后的单层序列数据经过一个CNN网络学习对应的向量表示,CNN的网络结构包含以下部分: @@ -77,7 +82,7 @@ python infer.py ### 训练 1.数据组织 -假设有如下格式的训练数据:每一行为一条样本,以 `\t` 分隔,第一列是类别标签,第二列是输入文本的内容。以下是两条示例数据: +输入数据格式如下:每一行为一条样本,以 `\t` 分隔,第一列是类别标签,第二列是输入文本的内容。以下是两条示例数据: ``` 1 This movie is very good. The actor is so handsome. diff --git a/nested_sequence/text_classification/index.html b/nested_sequence/text_classification/index.html deleted file mode 100644 index a3fa50b3..00000000 --- a/nested_sequence/text_classification/index.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - -
-
- - - - - - - -- GitLab