文本情感分类

  • 文本分类是自然语言处理的一个常见任务,它把一段不定长的文本序列变换为文本的类别。
  • 本节关注它的一个子问题:使用文本情感分类来分析文本作者的情绪。这个问题也叫情感分析,并有着广泛的应用。
  • 同搜索近义词和类比词一样,文本分类也属于词嵌入的下游应用。

    使用循环神经网络

    双向循环神经网络

    “双向循环神经网络”一节中,我们介绍了其模型与前向计算的公式,这里简单回顾一下:
    文本分类 - 图1
    文本分类 - 图2

  • 给定输入序列 {X1,X2,…,XT},其中 Xt∈Rn×d 为时间步(批量大小为 n,输入维度为 d)。

  • 在双向循环神经网络的架构中,设时间步 t 上的正向隐藏状态为 H→t∈Rn×h (正向隐藏状态维度为 h),反向隐藏状态为 H←t∈Rn×h (反向隐藏状态维度为 h)。我们可以分别计算正向隐藏状态和反向隐藏状态:

文本分类 - 图3

  • 其中权重 Wxh(f)∈Rd×h,Whh(f)∈Rh×h,Wxh(b)∈Rd×h,Whh(b)∈Rh×h 和偏差 bh(f)∈R1×h,bh(b)∈R1×h 均为模型参数,ϕ 为隐藏层激活函数。
    • 然后我们连结两个方向的隐藏状态 H→t 和 H←t 来得到隐藏状态 Ht∈Rn×2h,并将其输入到输出层。输出层计算输出 Ot∈Rn×q(输出维度为 q):

文本分类 - 图4

  • 其中权重 Whq∈R2h×q 和偏差 bq∈R1×q 为输出层的模型参数。不同方向上的隐藏单元维度也可以不同。

    加载预训练的词向量

    由于预训练词向量的词典及词语索引与我们使用的数据集并不相同,所以需要根据目前的词典及索引的顺序来加载预训练词向量。

    使用卷积神经网络

    一维卷积层

  • 与二维卷积层一样,一维卷积层使用一维的互相关运算。
  • 在一维互相关运算中,卷积窗口从输入数组的最左方开始,按从左往右的顺序,依次在输入数组上滑动。
  • 当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。

文本分类 - 图5

  • 多输入通道的一维互相关运算也与多输入通道的二维互相关运算类似
  • 在每个通道上,将核与相应的输入做一维互相关运算,并将通道之间的结果相加得到输出结果。

文本分类 - 图6

时序最大池化层

  • TextCNN 中使用的时序最大池化(max-over-time pooling)层实际上对应一维全局最大池化层
  • 假设输入包含多个通道,各通道由不同时间步上的数值组成,各通道的输出即该通道所有时间步中最大的数值。因此,时序最大池化层的输入在各个通道上的时间步数可以不同。

文本分类 - 图7
注:自然语言中还有一些其他的池化操作,可参考这篇博文

  • 为提升计算性能,我们常常将不同长度的时序样本组成一个小批量,并通过在较短序列后附加特殊字符(如0)令批量中各时序样本长度相同。
  • 这些人为添加的特殊字符当然是无意义的。由于时序最大池化的主要目的是抓取时序中最重要的特征,它通常能使模型不受人为添加字符的影响。

    TextCNN 模型

  • TextCNN 模型主要使用了一维卷积层和时序最大池化层。

  • 假设输入的文本序列由 n 个词组成,每个词用 d 维的词向量表示。那么输入样本的宽为 n,输入通道数为 d。TextCNN 的计算主要分为以下几步。
  1. 定义多个一维卷积核,并使用这些卷积核对输入分别做卷积计算。宽度不同的卷积核可能会捕捉到不同个数的相邻词的相关性。
  2. 对输出的所有通道分别做时序最大池化,再将这些通道的池化输出值连结为向量。
  3. 通过全连接层将连结后的向量变换为有关各类别的输出。这一步可以使用丢弃层应对过拟合。

文本分类 - 图8