文本分类(TextRNN/TextCNN/TextRCNN/FastText/HAN)

[TOC]git

简介

一般,进行文本分类的主要方法有三种:github

  • 基于规则特征匹配的方法(如根据喜欢,讨厌等特殊词来评判情感,但准确率低,一般做为一种辅助判断的方法)
  • 基于传统机器学习的方法(特征工程 + 分类算法)
  • 给予深度学习的方法(词向量 + 神经网络)

自BERT提出以来,各大NLP比赛基本上已经被BERT霸榜了,但笔者认为掌握经典的文本分类模型原理仍是十分有必要的。这一节,将对一些经典模型进行介绍,并在个人github中给出部分模型的实现。算法

TextRNN

以前介绍过词向量以及三大特征提取器,这里就再也不赘述了,深度学习模型无非就是用特征抽取器拼接起来的不一样结构的神经网络模型,因此接下来的几个部分基本是对模型结构的简介。 首先咱们来看看用经典的LSTM/GRU实现文本分类模型的基本结构: 由上图可知,TextRNN仅仅是将Word Embedding输入到双向LSTM中,而后对最后一位的输出输入到全链接层中,在对其进行softmax分类便可。网络

TextCNN

对于TextCNN在上一篇文章中简单的提到过,这里再作一些简单的补充,其模型结构以下图所示: <img src="https://img2018.cnblogs.com/blog/1816627/201910/1816627-20191018162954176-1632955675.png" width = "80%" height = "80%">架构

上图很直观的展示了,与图像中的二维卷积不一样,TextCNN中采用的是一维卷积,每一个卷积核的大小为$h \times k$(h为卷积核的窗口大小,k为词向量的维度),文中采用了多种不一样尺寸的卷积核,用以提取不一样文本长度的特征(上图种能够看见,卷积核有h=2, 3, 4三种)机器学习

而后,做者对于卷积核的输出进行MaxPooling,目的是提取最重要的特征。将全部卷积核的输出经过MaxPooling以后拼接造成一个新向量,再将该向量输出到全链接层分类器(Dropout + Linear + Softmax)实现文本分类。函数

TextRCNN

这篇论文中描述稍微复杂了点,实际模型很是简单,该模型结构以下图所示: <img src="https://img2018.cnblogs.com/blog/1816627/201910/1816627-20191018163029701-1605267284.png" width = "80%" height = "80%">学习

该模型的主要思想以下:优化

  • 首先得到词向量表示$e(w_i)$
  • 其次将词向量经过双向RNN(实践中能够是LSTM或GRU)获得$c_l(w_i)$和$c_r(w_i)$
  • 将$c_l(w_i)$, $e(w_i)$以及$c_r(w_i)$拼接获得新的向量,将其输入到全链接网络对其进行整合,激活函数为tanh
  • 再将全链接网络的输出进行MaxPooling
  • 最后将其输入一个全链接分类器中实现分类

原文连接编码

FastText

FastText是Facebook于2016年发布的文本分类模型,其主要思想基于word2vec中的skip-gram模型(关于skip-gram模型参考我以前词向量的博客,这里也就再也不赘述),在训练文本分类模型的同时,也将训练出字符级n-gram词向量。

一般认为,形态相似的单词具备类似的语义特征。而对于Word2Vec模型,其构建的语料库中,把不一样的单词直接映射到独立的id信息,这样,使得不一样单词之间的形态学信息彻底丢失了,如英文中的“nation”和“national”,中文中的“上海市政府”和“上海市”。若是可以学习到形态学变换到单词特征的规则,咱们能够利用这个规则来获得许多训练集中不可见的单词表示。

为了解决这个问题,FastText用字符级别的n-gram来表示一个单词或句子,如

中华人民共和国 bigram:中华 华人 人民 民共 共和 和国 trigram:中华人 华人民 人民共 民共和 共和国

获得了词的n-gram表征以后,咱们能够用n-gram子词(subword)的词向量叠加来表示整个词语,词典则是全部词子词的并集。

其主要模型结构以下图所示,最后也采用了层次softmax的提速手段: <img src="https://img2018.cnblogs.com/blog/1816627/201910/1816627-20191018163049774-1611230602.png" width = "60%" height = "60%">

对比skip-gram模型,能够FastText的词典规模会更大,模型参数会更多。但每个词的词向量都是子词向量的和,使得一些生僻词或未出现的单词可以从形态相近的单词中获得较好的词向量表示,从而在必定程度上可以解决OOV问题

原文连接

HAN

HAN的全称为Hierarchical Attention Network(分级注意网络),从字面意思就能够理解其是一个分层架构模型。该模型主要用于文档分类(长文本分类),其主要结构以下所示: <img src="https://img2018.cnblogs.com/blog/1816627/201910/1816627-20191018163109691-1870864211.png" width = "60%" height = "60%">

HAN主要由两个层次的模型架构:词级别和句级别,每一个层次的模型都包括一个编码器和注意力模型两个部分,整个模型的细节以下:

  • 如上图所示,假设咱们的文档中有$L$个句子,对于第二个句子,单词长度为$T$
  • 首先将单词输入Embedding层获取词向量
  • 将获取的词向量输入词编码器,即一个双向GRU,将两个方向的GRU输出拼接在一块儿获得词级别的隐向量$h$
  • 将词级别的隐向量经过一个单层感知机(MLP,实际上就是全链接神经网络,激活函数选用tanh),输出的结果能够看做是更高层次的隐向量表示: $u_{it}=tanh(W_wu_{it}+b_w)$
  • 随机初始化一个上下文向量$u_w$(随着训练不断优化),将该上下文向量$u_w$与高层次的隐向量表示$u_{it}$输入softmax,获得每一个词与上下文向量的类似度表示: $\alpha_{it}=\frac{exp(u_{it}^Tu_w)}{\sum_texp(u_{it}^Tu_w)}$
  • 将上述类似度做为权重,对$h_{it}$加权求和获得句子级别的向量表示: $s_i=\sum_t\alpha_{it}h_{it}$
  • 对于句子级别的向量,咱们用相相似的方法,将其经过编码层,注意力层,最后将文档中全部句子的隐向量表示加权求和,获得整个文档的文档向量$v$,将该向量经过一个全链接分类器进行分类。

其实HAN中使用到的的Attention就是最经常使用的 Soft-Attention ,整个模型的结构就至关于TextRNN + Soft-Attention的叠加。,分别用来处理词级别和句子级别,对于短文本分类,咱们只需借鉴词级别的模型便可。

原文连接

Highway Networks

门限神经网络(Gated Networks),在以前一篇文章中也提到过,主要是利用$sigmoid$函数“门限”的性质,来实现对信息流的自动控制的一种方法,Highway Networks就是一种典型的门限网络结构,这里也简单的介绍一下。

根据原文的定义,假设原来网络的输出为: $$y = H(x, W_H)$$

其中$H(·)$表示非线性变换(能够设置为激活函数为relu的全链接层)。定义$T(x, W_T) = sigmoid(W_T^Tx + b_T)$文章的作法就是将其改进为: $$y = H(x, W_H) \cdot T(x, W_T) + x \cdot (1-T(x, W_T))$$

则对于输出y,有: $$y = \begin{cases} x, & if\ T(x, W_T) = 0 \ H(x, W_H), & if \ T(x, W_T) = 1 \end{cases}$$

原文连接

参考连接 http://www.javashuo.com/article/p-koacwuua-bo.html https://www.kesci.com/home/project/5be7e948954d6e0010632ef2 https://zhuanlan.zhihu.com/p/32091937 https://zhuanlan.zhihu.com/p/64603089 https://zhuanlan.zhihu.com/p/24780258 https://zhuanlan.zhihu.com/p/32965521 https://zhuanlan.zhihu.com/p/63111928 https://zhuanlan.zhihu.com/p/53342715 https://zhuanlan.zhihu.com/p/44776747

相关文章
相关标签/搜索