【2016】C-RNN: Compositional Recurrent Neural Networks for Chinese Short Text Classification


本篇文章是HANs的基础,区别在于本篇文章只是利用LSTM/BiLSTM分别提取字符级和单词级的嵌入并将它们连接起来最后作为分类器的输入。而HANs在此基础上加入了CNN的表示和注意力机制。

HANs

摘要

分词是中文自然语言处理的第一步,分词产生的错误可以传递到整个系统。为了减少分词对中文短文本分类系统的影响,提高中文短文本分类系统的整体性能,提出了一种基于递归神经网络(RNN)和长短时记忆网络(LSTM)的字符级和单词级特征混合模型。通过将字级特征与词级特征相结合,可以构造出因分词错误而缺失的语义信息,同时减少错误的语义相关性。最终的特征表现是在保持句子大部分语义特征的情况下抑制了分词错误。最后利用有监督的中文短文本分类任务对整个模型进行端到端的训练。结果表明,本文提出的模型能够有效地表示中文短文本,32类和5类的分类性能优于一些显著的分类方法。

1 引言

随着信息技术的发展和社交媒体的爆炸式增长,各种中文短信不断涌现,如新闻标题、短信服务、微博、即时消息、在线评论等。短文本的主要特点是稀疏性,而中文短文本只有几到几十个单词,比如手机短信的长度限制为140个字符。此外,不像英语和其他西方语言,汉语单词是挨着写的,它们之间没有分隔符。因此,在任何其他处理之前,中文分词(CWS)应该做。但汉语文本句往往有多种分词方式,这就导致了分词歧义问题。此外,out - of - v vocabulary (OOV,又称new word detection)问题对CWS[1]的准确性有明显影响。造成这些问题的原因是汉语中有大量的汉字和短语。CWS产生的错误会传播到后续的处理中,显著影响文本分类的性能。
目前,文本分类的主要研究工作集中在文本表示和分类模型上,文本表示的主要方法是采用向量空间模型(VSM)或基于向量空间模型的变体。在VSM中,每个文本都被表示为一个向量,向量中的元素就是所谓的特征。这些传统方法通常可以实现文档分类的理想性能。但在处理短文本时,由于特征稀疏,其分类精度较差。为了解决这一问题,研究者通常利用外部知识库(如领域知识和百度Baike1)或内部语义来提取关联规则来扩展短文本特征。对于不同的场景,不同的方法都有各自的优点。然而,上述特性扩展方法非常耗时,而且不足以捕获短文本的完整语义。近年来,神经网络模型越来越多地应用于许多自然语言处理任务中,并被证明能够最大限度地降低特征工程[2]-[5]的难度。基于神经网络的SENNA系统已开发成[4],在多个NLP基准任务中接近或超过了目前的水平。采用深度信念网络[6]表示句子对微博情感进行分类,结果优于Bagof-Word (BoW)、主成分分析(PCA)和潜在Dirichlet分配(LDA)。Lai等人[7]在Fudan set2上提出了递归卷积神经网络(RCNN)对文本分类任务进行建模,其性能优于卷积神经网络(CNN)。Ling等人[8]引入了一种基于双向LSTMs的组合字符到单词(C2W)模型,在语言建模和词性标注方面产生了最先进的结果。提出了字符级卷积网络(ConvNets)对中文新闻语料库[9]进行分类,取得了较好的分类效果。本文认为,与普通文献的同类研究相比,中文短文本分类研究进展不明显。
这促使我们根据中文字符的特点,将中文字符作为附加特征应用于汉语短文本分类。假设分词将错误传递给任务,句子语义的缺失可以通过字符特征来补偿。本文提出了一种基于递归神经网络的中文短文本分类方法,即C-LSTMs/BLSTMs,它整合了字符特征和词特征。首先,C-LSTMs/BLSTMs基于两个单向或双向LSTM模型(LSTMs/BLSTMs),将预先训练好的词嵌入和字符嵌入分别组合成一个句子向量。LSTM体系结构可以很好地构建远程依赖关系,避免了上下文窗口大小的限制。通过双向LSTM,可以从两个方向有效地捕获句子中的语义依赖关系。其次,我们进一步将两个句子向量组合成一个新的句子嵌入,即输入的句子表示。因此,我们提出了一种将字级特征和字级特征结合起来的有效方法,用于中文短文本的表示。此外,我们还结合CNN、LSTM-RNN和BLSTM-RNN等几种组合,探讨了词嵌入和字符嵌入对中文短文本分类的效果。在32类和5类数据集上的实验结果表明,我们的方法比传统算法(如SVM)、单层CNN和RNN有更好的性能。
本文的其余部分组织如下。第二部分简要介绍了相关工作。第三节介绍了提出的CLSTMs/BLSTMs模型。实验结果和讨论报告在第四节。结论在第五节给出。

2 相关工作

3 CLSTMs/BLSTMs模型

在这里插入图片描述
图1描述了C-LSTMs/BLSTMs的架构,该架构将变长中文短文本表示为连续句子向量。然后将这些句子表征作为分类任务的特征。该模型由三个部分组成:(1)嵌入层将每个输入句子的每个单词和每个字符分别映射为一个低维词向量和字符向量。(2)递归层将输入的词向量序列和字符向量序列分别建模为词级和字符级表示,左LSTM/BLSTM从词序列生成词级表示,右LSTM/BLSTM从字符序列生成字符级表示。(3)句子表示层将两个LSTM/BLSTM组件的输出连接起来,生成句子级表示最终用于分类。下面几节将详细描述这些组件。

词嵌入

词嵌入在语义学习中得到了广泛的研究,它将离散的词符号映射为低维密集的词向量。它是C-LSTMs/BLSTMs模型中嵌入层的第一个组成部分。该组件将输入序列中的每个单词投射到一个N维实值向量中。这里N是超参数。给定限定词字典D,除非另有说明,否则从训练语料库中提取D,未知单词被转换为其他地方没有使用的特殊符号。每个单词 w i ∈ D w_i∈D wiD用嵌入矩阵M嵌入特征空间 N ∗ ∣ D ∣ N*|D| ND,因此 E w i E_wi Ewi

字符嵌入

由于中文短文本通常由多个字符组成,通过表示学习,我们将句子中的每个字符映射为一个n维实值字符向量。

LSTM-RNN

传统的RNN存在梯度消失或爆炸的问题,即梯度可以随长序列呈指数增长或衰减。因此,很难对序列中的长期依赖性进行建模。针对这一问题,提出了LSTM。LSTM网络如图2所示。
在这里插入图片描述

分类

该方法不需要复杂的特征工程,而是利用句子表示作为中文短文本的特征向量进行分类。具体说来,具体来说,给定类别数目C,我们首先用一个线性层将句子向量转换成一个长度为C的实值向量,然后加上一个softmax层将每个实值映射到条件概率,由式(9)计算。
在这里插入图片描述
在这里插入图片描述

4 实验

我们通过实验对我们的方法进行了评价,并与一些值得注意的方法进行了比较。在本节中,我们将描述实验设置并报告实证结果。

实验设置

数据集

为了便于与基准方法进行比较,我们分别在两个带有黄金标准分类标签的数据集上进行实验,这两个数据集是中文新闻标题和豆瓣影评。中文新闻标题数据集包含可供训练的32类(即新闻主题)标题47,952个,可供测试的新闻标题15,986个。在删除这些包含不能被处理的特殊字符的标题之后,我们保留了47,850个训练标题和15,950个测试标题(即#DataSet1)。此外,我们通过交换中文新闻标题训练和测试数据建立另一个数据集(即#DataSet2)。我们用黄金标准的分类标签为90,781条中国豆瓣电影评论(即#DataSet3)标记,即为评论分配1到5星,并选择60,793条评论进行培训,29,988条评论进行测试。同时,我们从每个数据集中随机选择10%的训练集进行验证。表I显示了关于每个数据集的详细信息。
在这里插入图片描述

设置

表现

在这里插入图片描述

5 结论

本文提出了一种新的C-LSTMs/BLSTMs神经网络模型来提高中文短文本的分类性能。该模型分别通过两个lstm和两个blstm对句子语义进行编码,然后将两个输出向量连接起来作为句子表示,并使用有监督的中文短文本分类任务进行端到端训练。此外,该方法还得出了词嵌入和字符嵌入在中文短文本表示中可以相互补充的结论。因此,该方法可以有效地减少由于分词错误而导致的语义信息缺失。实验结果表明,与传统的分类方法以及SVM、sing层CNN和LSTM等神经网络模型相比,我们的方法取得了更好的性能。
未来的工作可能包括单词和字符的联合学习,以进一步提高字符嵌入的表示能力。结果表明,基于词和字符嵌入的LSTM-RNN是一种有效的中文短文本表示方法,值得进一步研究。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Deep Recurrent Neural Networks(深度循环神经网络)是一种适用于序列数据处理的深度神经网络模型,常用于语音识别、自然语言处理等任务。如果你想使用Deep Recurrent Neural Networks模型,可以使用深度学习框架来实现,比如TensorFlow、PyTorch等。 以下是使用TensorFlow实现Deep Recurrent Neural Networks模型的示例代码,供你参考: ```python import tensorflow as tf # 定义模型参数 input_dim = 10 # 输入维度 hidden_dim = 64 # 隐层维度 output_dim = 2 # 输出维度 num_layers = 3 # RNN层数 # 定义输入张量 inputs = tf.placeholder(tf.float32, shape=[None, None, input_dim]) # 定义RNN单元 cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_dim) # 堆叠多层RNN stacked_rnn = tf.nn.rnn_cell.MultiRNNCell([cell] * num_layers) # 初始化RNN状态 initial_state = stacked_rnn.zero_state(tf.shape(inputs)[0], tf.float32) # 计算RNN输出 output, state = tf.nn.dynamic_rnn(stacked_rnn, inputs, initial_state=initial_state) # 定义输出层 weights = tf.Variable(tf.random_normal([hidden_dim, output_dim])) bias = tf.Variable(tf.random_normal([output_dim])) logits = tf.matmul(output[:, -1, :], weights) + bias # 定义损失函数和优化器 labels = tf.placeholder(tf.int32, shape=[None]) loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)) optimizer = tf.train.AdamOptimizer().minimize(loss) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(num_epochs): # 获取批次数据 batch_inputs, batch_labels = get_batch_data(batch_size) # 训练模型 _, loss_val = sess.run([optimizer, loss], feed_dict={inputs: batch_inputs, labels: batch_labels}) print('Epoch %d, loss: %f' % (i, loss_val)) ``` 在这个示例代码中,我们使用了TensorFlow来实现一个三层的LSTM模型用于序列分类任务。具体来说,我们定义了模型的输入张量、RNN单元、RNN层数、输出层、损失函数和优化器,并在训练过程中动态输入数据进行模型的训练。 注意,这只是一个示例代码,实际的Deep Recurrent Neural Networks模型实现可能会更加复杂和庞大,需要根据具体的任务和数据进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值