文章目录
1. Abstract
本文对使用字符级卷积网络(ConvNet)进行文本分类进行了实证探索。 我们构建了几个大型数据集,以表明字符级卷积网络可以实现最先进的或有竞争力的结果。 与传统模型(如词袋、n-gram 及其 TFIDF 变体)以及深度学习模型(如基于单词的 ConvNet 和递归神经网络)进行比较。
2. Introduction
文本分类是自然语言处理的一个经典主题,其中需要为自由文本文档分配预定义的类别。 文本分类研究的范围从设计最佳特征到选择最佳的机器学习分类器。 迄今为止,几乎所有的文本分类技术都是基于单词的,其中一些有序单词组合(例如n-gram)的简单统计通常表现最好。
另一方面,许多研究人员发现卷积网络(ConvNets)对于从原始信号中提取信息非常有用,范围从计算机视觉应用到语音识别等。 特别是,深度学习研究早期使用的时滞网络本质上是对顺序数据进行建模的卷积网络。
在本文中,我们探索将文本视为字符级别的一种原始信号,并将时间(一维)ConvNet 应用于其中。 在本文中,我们仅使用分类任务来举例说明 ConvNet 理解文本的能力。 从历史上看,我们知道卷积网络通常需要大规模数据集才能工作,因此我们也构建了其中的几个数据集。 与传统模型和其他深度学习模型进行了广泛的比较。
本文的贡献之一,构建了多个文本分类数据集,极大地推动了文本分类的研究工作。
文献中探索了将卷积网络应用于文本分类或自然语言处理。 事实证明,ConvNet 可以直接应用于分布式或离散单词嵌入,而无需了解语言的句法或语义结构。 这些方法已被证明比传统模型具有竞争力。
还有使用字符级特征进行语言处理的相关作品。 其中包括使用带有线性分类器的字符级 n-gram,以及将字符级特征合并到 ConvNets 中。 特别是,这些 ConvNet 方法使用单词作为基础,其中在单词或单词 n-gram级别提取的字符级特征形成分布式表示。 观察到词性标记和信息检索的改进。
本文是第一篇仅将 ConvNet 应用于字符的文章。 我们表明,当在大规模数据集上进行训练时,深度卷积网络不需要单词知识,此外,先前研究的结论是卷积网络不需要有关语言的句法或语义结构的知识。 这种工程简化对于可以适用于不同语言的单个系统至关重要,因为无论是否可以分割成单词,字符始终构成必要的构造。 仅处理字符还有一个优点,可以自然地学习异常字符组合,例如拼写错误和表情符号。
本文的历史意义之二,提出的ChatTextCNN方法因为只使用字符信息,所以可以用于多种语言中。
3. 传统经典算法模型
3.1 Bag of words
算法:
1.构建一个50000个词的词表
2.对于一篇文档d,统计词表中每个词在d中出现的次数
3.根据词表中每个词在d中出现的次数,构建一个词表大小的向量。
对于 TFIDF,我们使用计数作为术语频率。 逆文档频率是样本总数与训练子集中包含该单词的样本数除以对数。 通过除以最大特征值来对特征进行归一化。
3.2 基于词向量的k-means
算法:
1.首先将每个词映射成一个词向量(使用训练好的词向量)
2.在所有的词上使用k-means进行聚类,类别数为5000
3.对于每个词,都划分其属于哪个k-means类
4.对于一篇文档d中的每个词,查看它属于哪个类别,然后一篇文档就可以表示成一个5000维的向量,每个位置代表这篇文档中有多少属于这个类别的词。
5.后面接多分类的logistic回归。
3.3 基于词的卷积网络模型
可以看我前面的两篇blogTextCNN论文阅读笔记和DCNN论文阅读笔记。
3.4 长短时记忆模型
算法:
1.将训练好的word2vec词向量输入到LSTM
2.LSTM每个时间步的输出取平均作为文档的表示
3.后面接一个多分类的logisitc回归
4.Character-level Convolutional Networks
4.1 一维卷积
这里的卷积操作和TextCNN论文里所做的卷积操作是一样的。
4.2 字符量化
实际上就是把字符映射为数字,这里没用字符嵌入的表示,而是直接使用独热编码来表示。不在字符表中的字符用全零向量表示。
4.3 model design
网络由6个卷积层,3个全连接层组成。第1、2、6个卷积后有最大池化层。输入的特征数等于70,输入特征长度为1014。作者认为1014个字符已经可以捕获大部分感兴趣的文本。还在3个全连接层之间插入2个dropout 模块来正则化。dropout为0.5。
4.3.1 卷积层设置
网络提供了两种卷积尺寸,大的采用1024个卷积核,小的采用256个卷积核。使用高斯分布对权重进行初始化,large model采用的均值和标准差分别为(0, 0.02)。small model采用的均值和标准差分别为(0,0.05)。
feature相当于2d卷积中的通道数(每层的卷积核数量),kernel相当于2d卷积中的卷积核尺寸。池化操作采用非重叠的最大池化,即池化尺寸等于步长3。
4.3.2 全连接层设置
4.3.3 模型优缺点
缺点:
- 字符级别的文本长度特别长,不利于处理长文本的分类
- 只使用字符级别信息,所以模型学习到的语义方面的信息较少
- 在小语料上效果较差
优点:
4. 模型结构简单,并且在大语料上效果很好
5. 可以用于各种语言,不需要做分词处理
6. 在噪音比较多的文本上表现较好,因为基本上不存在OOV问题、
4.3.4 用PyTorch搭建Model
import torch
import torch.nn as nn
import torch.nn.functional as F
class CharTextCNN(nn.Module):
def __init__(self,config):
super(CharTextCNN,self).__init__()
in_features = [config.char_num] + config.features[0:-1]
# layer1的输入通道数为字符个数(70);
# layer2~输入通道数(论文中的 small/large Feature)依次从list读入,注意没有 list最后一个元素,因为list的第一个元素为layer2的输入通道(即第一层的输出通道数),依次...
out_features = config.features # 读入输出通道数
kernel_sizes = config.kernel_sizes # 读取卷积核尺寸(论文中的kernel)
self.convs = []
self.conv1 = nn.Sequential(
nn.Conv1d(in_features[0], out_features[0], kernel_size=kernel_sizes[0], stride=1),
nn.BatchNorm1d(out_features[0]),
nn.ReLU(),
nn.MaxPool1d(kernel_size=3, stride=3)
)
self.conv2 = nn.Sequential(
nn.Conv1d(in_features[1], out_features[1], kernel_size=kernel_sizes[1], stride=1),
nn.BatchNorm1d(out_features[1]),
nn.ReLU(),
nn.MaxPool1d(kernel_size=3, stride=3)
)
self.conv3 = nn.Sequential(
nn.Conv1d(in_features