优秀的编程知识分享平台

网站首页 > 技术文章 正文

研表究明,汉字序顺并不会响影阅读

nanyue 2024-08-13 08:02:07 技术文章 9 ℃

前言

用机器视觉(CNN)来完成NLP任务,已经被证明是可行且有效的方法。在学习集智的关于《用机器视觉解放长文本》的课程中,授课老师对使用机器视觉来处理中文提出了一些非常令人值得学习的经验和观点。

首先,中文与西方的字母语言存在一个很大的差别,就是理论中文的语义并不需要很依赖文字的顺序。可是对西方语言来说,文字顺序则非常重要。以英文来说,英文是根据顺序来判断语义的,字母本身没有任何含义。但是中文的每个字都是有特定含义的,文字的顺序相对而言,并不是那么重要。授课老师还举了下图的例子。

从这个角度来说,就可以理解,为什么RNN这种架构,在西方语言模型中使用非常频繁,效果很好。这是因为RNN天生就是为了理解文字的先后顺序而发明的。因此,对汉语这种并不是那么在乎语序的语言,是否可以更加多的考虑一些其他结构?这就引出了使用CNN的某些原因。

其次,在处理中文文本的过程中,最常见的做法就是首先对中文进行分词,这一点已经形成共识。但是,授课老师同样提出了疑问,他提出,处理中文首先需要分词,是在机器学习能力尚不足够的情况下采取的方法。而且,分词本身可能存在错误,这就可能引入了新的误差。现在的机器学习已经越来越成熟,不分词,直接使用单字也是可行的方法。老师还专门就单字训练出来了字向量。

此外,老师还对使用CNN及字向量搭建网络架构进行了宏观讲解。下面结合下图,笔者尝试对入门的同学做一个简单的解释。

就通常的文档分类任务而言,每篇文档就是为一条训练数据。假设一篇文档的文字数量为N,字向量的维度是M,则将每个单字进行字向量转化之后,就得到了(N*M)矩阵,这就是模型的输入数据。卷积使用一维卷积,形状就如上图左部分红色方框。设定卷积核大小之后,按照文本书序的方向滑动卷积窗口,各自得到特征图。卷积层之后一般会跟随池化层,由于处理的是文本数量,同样的采取一维池化操作,方式采取最大池化。选择卷积核的过程中,可选择使用多种尺寸的卷积核。卷积核越大,语义涵盖范围越大,但是语义也会越散。多种尺度的卷积核可在多个维度下捕捉文本潜在特征。同时要注意,由于这里处理的字向量,因此每个向量相对词向量来说,涵盖的语义范围更小,那么在选择卷积核的过程中,要尽量选择较大的卷积核。

授课老师还提供了模型架构的代码,但是由于代码使用的pytorch,笔者比较熟悉Keras和tensorflow,下面笔者尝试借鉴老师的模型结构,使用比较熟悉Keras搭建模型,通过代码加深对理论的理解。

from keras.layers import *
from keras.models import Model
from keras.layers.embeddings import Embedding
# seq_length 指定文本的长度
input_x = Input(shape=(seq_length,)) 
# vocab_size 指定字表长度; embedding_dim 指定向量长度
x = Embedding(vocab_size, embedding_dim)(input_x) 
# 第一个卷积层,卷积核大小为3,最大池化窗口为11
c1 = Conv1D(128, 3, activation='relu')(x)
c1 = BatchNormalization()(c1)
c1 = MaxPooling1D(11)(c1)
# 第二个卷积层,卷积核大小为5,最大池化窗口为9
c2 = Conv1D(128, 5, activation='relu')(x)
c2 = BatchNormalization()(c2)
c2 = MaxPooling1D(9)(c2)
# 第三个卷积层,卷积核大小为7,最大池化窗口为7
c3 = Conv1D(128, 7, activation='relu')(x)
c3 = BatchNormalization()(c3)
c3 = MaxPooling1D(7)(c3)
# 第四个卷积层,卷积核大小为9,最大池化窗口为5
c4 = Conv1D(128, 9, activation='relu')(x)
c4 = BatchNormalization()(c4)
c4 = MaxPooling1D(5)(c4)
# 第五个卷积层,卷积核大小为11,最大池化窗口为3
c5 = Conv1D(128, 11, activation='relu')(x)
c5 = BatchNormalization()(c5)
c5 = MaxPooling1D(3)(c5)
# 将前面5个卷积层的输出进行叠加
x = Concatenate(axis=1)([c1, c2, c3, c4, c5])
# 将数据从二维reshape成一维
target_shape = (int(x.get_shape()[1])*int(x.get_shape()[2]),)
x = Reshape(target_shape=target_shape)(x)
# 添加Dropout层和BatchNormalization层防止过拟合
x = Dropout(0.5)(x)
x = BatchNormalization()(x)
output_x = Dense(46, activation='softmax')(x)
model = Model(input_x, output_x)
model.compile(
 loss='sparse_categorical_crossentropy',
 optimizer='adam',
 metrics=['accuracy']
)
model.summary()


打印出的模型结构如下图所示。

授课老师还就使用机器处理文本推荐了几篇较为经典的论文,这里也记录如下:

1.Convolution Neural Networks for Sentence Classification2.ABCNN Attention-Based Convolutional Neural Network for Modeling Sentence Pairs3.Rationale-Augmented Convolutional Neural Networks for Text Classification4.VeryDeepConvolutionalNetworksforTextClassification5.Convolutional Sequence to Sequence Learning


作者:yao编辑:Yiri
最近发表
标签列表