百度分词算法和技术应该是世界上最难的算法了。今天5dseo.com说下神经网络分词算法
单词,是能够独立存在且承载语义的最小语言单元。相对于单字来说,单词能够表达的语义更加丰富。以英语为代表的一些语言,单词之间以空格作为自然分隔符,而汉语等大部分东亚语言文字,则以单字作为基本的语言单位,词语之间没有明显的分隔标记。因此,在中文信息处理中,分词是一个十分关键且困难的基本任务。很多中文自然语言处理(Natural Language Processing, NLP)的任务都需要先进行分词,再根据分好的单词继续完成任务。
分词的方法,大多采用有监督的机器学习方法。基于字标注学习的方法,首次将分词任务形式化为对字位的序列标注学习任务。这种方法使用一个字在单词中的四种相对位置的标签,即BMES(开始,中间,结束,单字)(如表1所示)等字位,来表示该字所携带的单词切分标注信息。
表 1 字位标注示例
中 | 华 | / | 文 | 化 | / | 源 | 远 | 流 | 长 | / | , |
B | E | B | E | B | M | M | E | S | |||
B:开始,M:中间,E:结束,S:单字词 |
之后,使用最大熵(Maximum Entropy, ME)Markov模型第一次将序列标注学习方法应用到分词任务中,表2显示不同的序列标注集。文献[3]和文献[4]又将标准的序列标注学习方法——条件随机场(Conditional Random Field, CRF)引入到分词学习任务当中。自此以后,CRF的各种变种方法便成为主流的非深度学习分词模型,这些模型构成了传统的分词方法。然而,传统的分词方法的表现十分依赖于人工处理的特征。
表 2 各类字位标注集
词中字位 | 4-标签集标签 | 2-标签集标签 |
开始(begin) | B | B |
中间(middle) | M | E |
结束(end) | E | E |
单字(single) | S | B |
尽管现在大多数现有的工作在准确性方面取得了较好的成绩,但它们也有模型过于复杂、过于依赖人工处理的特征、对新词表现不佳等的缺点。在本文中,我们提出一种基于卷积神经网络(Convolutional Neural Networks, CNN)的分词模型——PCNN(Pure CNN)模型,该模型使用字向量结合上下文字向量的方式来对字进行标签分类。该模型结构简单,不依赖人工处理的特征,在性能方面具有很高的准确率。并且,根据不同的字向量模型,对不同领域的文本分词任务也有很好的表现。
2.相关工作
在做自然语言处理任务时,需要把字或词用数字化的形式表示,传统的方法如One-hot编码表示,是建立一个词库并对词库内每一个词编号。采用这种方法编码,每个词就是一个很长的向量,向量的维度与词库大小相同,向量中,只有该词的对应位置上的数字为1,其他位置均为0。这种方法有两个主要缺点,一是词向量十分稀疏,二是词与词之间没有任何关联,比如它并不能表现出近义词之间的相似性。
为了解决One-hot编码所出现的问题,文献[11]首次提出分布式表示(Distributed Representation)方法来表示词,它的基本思想是使用统计学方法通过训练把句子中的每个词映射成K维的实数向量,通过词与词的实数向量之间的距离(如欧氏距离、余弦距离等)来描述词之间的语义相似性,即相似文本拥有相似的向量。之后,文献[12]提出了神经网络语言模型,该模型首次使用了词向量这一方法。自此,众多学者参与到词向量研究当中,并且使用词向量方法在很多NLP任务中获得很大效果提升。后来,谷歌公司的学者在文献[13]提出Word2vec,这是一种使用神经网络的词向量的训练工具,它使得词向量的训练变得更容易,继而被广泛应用于自然语言处理中。和以词为句子基本单位的英文不同,中文句子中对词并无明显的划分,因而在中文NLP任务中,尤其是分词领域,需要用字代替词来训练字向量表示句子。
卷积神经网络(CNN)现在被广泛应用于计算机视觉中。随着词向量和深度学习技术的发展,现在很多学者开始在自然语言处理任务中使用CNN。文献[14]提出了一种改进的单层卷积网络对句子进行分类,并获得不错的结果。文献[15]使用单层的CNN对社交网络文本做情感分析。文献[16]提出基于卷积神经网络的动态卷积神经网络(Dynamic Convolutional Neural Network, DCNN),结合英文词向量对句子建模。使用词或字向量的神经网络模型,因词或字向量的特殊表示方法,使得模型并不依赖于特定语言和特定句法,因此具有很好的扩展性和适用性。
在使用CNN做NLP任务时,众多模型沿袭了CNN在图形图像领域的使用方式,采用卷积层加池化层的模式设计模型结构。由于图像像素和字向量元素特征的本质不同,池化过程会造成卷积层提取到的文字之间关联信息的部分特征缺失,进而影响模型的性能表现。本文在文献[16]提出的模型基础上,通过移除模型池化层,改进卷积方式,并结合滑动窗口,提出使用字向量上下文窗口对字进行标签分类的分词方法。并与近年其他分词模型的表现进行了对比,实验结果表明,本文提出模型的性能表现达到了甚至优于主流模型的水准,且具有良好的稳定性。另外,在池化与无池化的对比实验中,也验证了无池化层模型要远远好于有池化层的模型。
3.卷积网络分词模型PCNN
3.1 一维卷积
卷积操作是CNN的重要特征之一。与传统的数学上的卷积不同,CNN中的卷积,是狭义的卷积操作。卷积层以特征映射为组织方式,其中的每一个单位与前一层的局部感受野相连接,利用共享的卷积核(或称过滤器)与局部感受野做卷积运算,再经过激活函数(如ReLU、tanh)做非线性运算,得到特征值。通常,在神经网络中,卷积运算以二维形式出现,给定一个矩阵
X∈RM×N,和卷积核
F∈Rm×n,一般
m≪M,n≪N,其卷积如式1所示:
convij=∑u=1m∑v=1nfuv·xi-u+1:j-v+1.1
特别的,由于NLP任务的特殊性,卷积在NLP任务中以一维卷积的形式出现,即对文本序列
s∈Rn,一维卷积核
f∈Rm,其中
n≥m,我们可得式2,卷积结果为
conv∈Rn-m+1:
convt=ft·st:t+m,0≤t≤n-m+1.(2)
为了均衡文本边缘(开始和结束处)与文本中间位置特征提取的频繁程度,使用文本边缘填充padding的方式进行卷积运算,这种方法也称为宽卷积。宽卷积不要求式2中
n与
m的大小关系,同时可以保证卷积结果
convt不为空向量。
3.2 PCNN模型
PCNN是以字向量作为输入,结合滑动窗口,使用卷积神经网络来进行字标签分类任务的神经网络模型。该模型的结构如图1所示。
定义
ci∈Rd为
d维的字向量,
k为上下文单字的数量,上下文字窗口大小为
2k+1,上下文字向量矩阵
x∈Rd×2k+1为模型的输入矩阵,
x由文本序列的第
i个字及其前后各
k个字的字向量组成。式3给出上下文字向量矩阵
x的定义。
x=⋮⋮⋮c1…c2k+1⋮⋮⋮3
我们用该矩阵做字
i的标签分类任务。之后,窗口滑动向后一个字,即做分类字
i+1的标签任务。
模型第一层是一维卷积层,卷积核大小为
h×1(图示中为2
×1),padding核为
(pd,0)。该层主要提取相邻
h个字之间在字向量中第
m维上的特征。例如,第
l层第
m维第
i+pd个特征
zm,i+pdl可由第
l-1层的
xm,i:m,i+hl-1子矩阵提取。具体的,如式4所示:
zm,i+pdl=f∑q=0h-1wql⋅xm,(i+q)l-1+bql4
这里,
l表示第
l层,
wl为第
l层的卷积核,
bl为第
l层的偏置单位,
f为激活函数,本层的卷积采用宽卷积,对边缘补零向量。
模型第二层同样是卷积层,卷积核大小为
1×d,即卷积核维数与字向量维数相同。第二层卷积之后是两层全连接层,第一层的全连接的输入特征向量
A1是由前一层
p个通道的卷积结果的激活向量
ai组合而成,
A1可以表示为:
A1=a1⊕a2⊕…⊕ap5
其中,
⊕表示向量连接运算。全连接的计算方式由式6给出:
Z=fWA+b’6
式中,
W为该全连接层的参数矩阵(向量),
A为上一层网络输出结果经激活函数进行非线性计算后的输入矩阵(向量),
b’是该层的偏置向量。
模型的最后输出向量连接到SoftMax函数,由SoftMax函数输出该字在不同标签上的概率分布。
一般的卷积神经网络在处理图像问题中,卷积操作之后都会有一个池化的过程,即采用类似卷积操作中卷积核运行的方式,对局部感受野中的特征进行取最大值或取均值的筛选过程。传统的观点认为(文献[17]、文献[18]),池化层能在模型应对图像的细微平移和变形的问题时起到稳定性的作用,但这个假设并未被验证[19]。而最近的研究证明,由池化层提供的归纳偏差并不是良好性能的必要条件。]在其图像处理模型中减少了网络的池化层,并依然实现了强大的性能。DeepMind公司发表的文献[19]指出,池化对于卷积神经网络模型应对图像微小平移和变形的稳定性没有作用,卷积核的平滑度才是关键。也就是说,池化的主要作用只有精简出前一层的特征并减少下一层网络的计算量。并且我们认为,字向量中的特征与图像像素的特征性质并不等价,字向量的训练本身就是一个特征生成和筛选的过程,字向量不同的维度也是对特征做了不同程度的精简,不再需要池化层做进一步的特征筛选。所以我们在模型中,移除了神经网络模型中的池化层,只做一维卷积操作。并且,我们在分词实验中,单独设置了一个有池化与无池化的对比实验,该实验也证实了移除池化层之后的准确率等模型评估值更高。
算法描述
基于以上信息,下面给出PCNN模型的分词算法抽象描述:
算法:PCNN模型分词算法
初始化:随机设置两层卷积的参数,包括卷积核
w1,w2、偏置单位 b1,b2,并分别指定两层卷积的通道数C1、C2。随机设置两层全连接的参数,包括参数矩阵 W1,W2、偏置单位 b1′,b2′;根据运行环境设置批数据量batch-size大小; |
输入:字向量上下文矩阵 ; |
输出:各层网络的所有参数(,,,,,,,); |
步骤1.设置迭代次数epochs和学习率; |
步骤2.计算网络第一、二层卷积值; |
步骤3.连接C2个通道的卷积结果作为下一层全连接的输入数据; |
步骤4.计算两层全连接层,得到SoftMax结果; |
步骤5.计算损失并使用学习率为的梯度下降算法获得各层参数(,,,,,,,)更新值; |
步骤6.更新各层参数(,,,,,,,); |
步骤7.重复步骤2-6直至达到设定的epochs数止。 |
4.实验分析
4.1 数据集
实验采用SIGHAN Bakeoff-2005数据集,该数据集是由国际性的中文分词评测竞赛公开的数据集。本实验中,我们只使用数据集中四份语料中的两份简体中文语料,这两份语料分别由北京大学(下称PKU数据集)和微软亚洲研究院(下称MSR数据集)整理。数据集的统计数据如表3所示。
表 3 数据集统计信息
PKU | MSR | |
词语数量(无重复) | 55,303 | 88,119 |
单字数量(无重复) | 4,698 | 5,167 |
词语总数 | 1,109,947 | 2,368,391 |
汉字总数 | 1,826,448 | 4,050,469 |
对于数据集的划分,考虑到数据集规模相对庞大。我们采用的分割方法对数据集进行训练集和测试集进行划分,即。训练集和测试集的数据在使用前均进行随机排列操作。
另外,对于字向量的训练数据集,我们采用的是搜狗公司公开的2006年分类新闻数据集和上面提及的PKU数据集与MSR数据集共三个数据集,文本文件大小共计约为71M字节。训练的字向量特征维度为120维。
4.2 实验评估标准
模型采用查准率(Precision,P)、查全率(Recall, R)、值和测试集的准确率(Accuracy, A)作为评估标准。定义为模型输出的字标签预测分类值集合,为数据集字标签的真实值集合,模型的查准率由式7给出定义:
查全率由式8给出:
值由式9给出定义,它是值和值的调和平均数,其中.
模型的测试集的准确率为:
以上四个值都是值越高模型表现越好。
4.3 实验环境及超参数
实验采用带有GPU的云服务器运行我们的实验代码,具体的实验环境为:
表 4 实验环境
GPU型号 | NVIDIA Tesla K80 |
显存大小 | 11GB |
操作系统 | Ubuntu 18.04 |
深度学习平台 | Python 3.6、PyTorch 0.4.0 |
CUDA版本 | 9.1 |
字向量训练工具 | Word2vec |
神经网络的超参数对神经网络模型的优劣是至关重要的,经过多次调试,我们选出表5中超参数值作为本实验最终模型所采用的超参数。
表 5 神经网络超参数
参数 | 值 |
Epochs | 30 |
Batch size | 512 |
Learn rate | 0.001 |
Word embedding size | 120 |
Channel size 1 | 20 |
Channel size 2 | 60 |
Hidden layer unit number | 80 |
Activation function | tanh |
4.4 实验结果
实验设置了两个纵向对比实验和一个横向对比实验。纵向对比实验是针对字的上下文大小对该字的标签分类有何影响而进行。横向对比实验是考虑在相同参数数量的情况下,池化与不池化对分类结果的影响如何。
在上下文大小对字标签分类影响的实验中,我们分别设置上下文长度为1、2、3来进行实验。即一个字的前后各1、2、3个字分别组成3、5、7窗口大小的字序列,由它们的字向量分别组成、、维矩阵作为三个实验的输入数据。并且,我们分别设置了4-标签集和2-标签集作为对比,以评估模型在标签数量不同时的表现。实验结果如表6、表7所示(为增加区分度,保留小数点后四位,红色加粗表示该列最大值)。
表 6 不同上下文大小使用BMES标签集的实验结果
BMES | PKU | MSR | ||||||
Score | P | R | F1 | A | P | R | F1 | A |
context-1 | 0.9335 | 0.9344 | 0.9336 | 93.35% | 0.9320 | 0.9301 | 0.9306 | 93.01% |
context-2 | 0.9438 | 0.9426 | 0.9426 | 94.26% | 0.9442 | 0.9433 | 0.9435 | 94.33% |
context-3 | 0.9460 | 0.9444 | 0.9446 | 94.44% | 0.9517 | 0.9507 | 0.9509 | 95.07% |
表 7 不同上下文大小使用BE标签集的实验结果
BE | PKU | MSR | ||||||
Score | P | R | F1 | A | P | R | F1 | A |
context-1 | 0.9618 | 0.9617 | 0.9617 | 96.17% | 0.9598 | 0.9596 | 0.9596 | 95.96% |
context-2 | 0.9662 | 0.9660 | 0.9661 | 96.60% | 0.9656 | 0.9655 | 0.9655 | 96.55% |
context-3 | 0.9671 | 0.9669 | 0.9669 | 96.69% | 0.9685 | 0.9684 | 0.9684 | 96.84% |
从实验结果可以看出,模型在两个数据集上表现较为一致,具有良好的稳定性。在多上下文单字的情况下,模型对字的标签判别更加准确。并且,字标签的类别越少,分词效果越好。
作为参考,表8列出由文献[21]所统计的近两年基于深度学习方法的分词模型与本文模型的F1值对比结果,这里所有模型使用的是相同的数据集(Bakeoff-2005)。从结果中可以看出,我们的模型有着很好的表现。
表 8 不同模型的f1值对比
Models | PKU | MSR |
Zhang et al. (2016) | 0.951 | 0.970 |
Liu et al (2016) | 0.9391 | 0.9521 |
Cai and Zhao (2016) | 0.955 | 0.965 |
Cai et al. (2017) | 0.958 | 0.971 |
Ours | 0.9669 | 0.9684 |
另外,针对池化层对模型的影响如何这一问题,我们选择在前一个实验中表现最优的条件来进行池化与不池化的对比实验。具体的,我们使用BE标签集标注法、上下文字窗口大小为7(即context-3,前后各3个字)来分别对PKU数据集和MSR数据集进行实验。实验结果如表9所示。对于池化的方法,我们采用三种池化的方法,分别为最大值池化(max pooling)、平均值池化(average pooling)、k-max池化(k-max pooling)。池化操作类似于卷积,不过池化只是用池化核对感受野范围内的元素进行筛选。最大值池化是选择感受野内最大的特征值,平均值池化是对感受野内的特征取平均值,k-max池化是最大值池化的扩展,用于选取感受野内数值最大的个特征。考虑到网络中模型参数数量对模型拟合程度的影响,在添加了池化层以后,网络相对的会减少一些特征,从而减少模型参数的数量。因此,我们在池化实验中适当增加了卷积的通道数和隐藏层单元数量以增强模型对学习任务的拟合程度。
实验结果表明,最大值池化和平均值池化对模型性能的表现比较相似,并且比较差。K-max池化由于是保留了更多的特征,因而表现相对于最大值和平均值池化要好一些,但仍不如无池化层的模型表现。这也验证了我们提出前面的假设。
至于移除池化层对模型的时间复杂度影响,本实验测试的结果是有池化层(任意一种池化方式)的模型训练时间是无池化层的模型训练时间的4倍左右。也就是说,移除池化层的做法不仅给模型带来准确率的提升,也加快了模型的训练速度。
表 9 不同池化方法使用BE标签集的实验结果
BE | PKU | MSR | ||||||
Score | P | R | F1 | A | P | R | F1 | A |
Max-pooling | 0.8163 | 0.8005 | 0.8046 | 80.05% | 0.8074 | 0.7994 | 0.8015 | 79.94% |
Average-pooling | 0.8067 | 0.8057 | 0.8058 | 80.57% | 0.7986 | 0.7939 | 0.7952 | 79.39% |
4-max-pooling | 0.8635 | 0.8626 | 0.8628 | 86.26% | 0.8685 | 0.8668 | 0.8672 | 86.68% |
No-pooling | 0.9671 | 0.9669 | 0.9669 | 96.69% | 0.9685 | 0.9684 | 0.9684 | 96.84% |
5.结束语
本文在卷积神经网络的基础上,提出一种无池化的卷积神经网络分词模型PCNN。该模型可以高效地在训练中学习字向量维度之间的特征关联信息,准确地标识出单字的标签类别,从而完成分词任务。该模型准确率高,稳定性好,具有良好的适应性。
我们认为这是在中文分词领域的一次新的尝试,通过学习字向量特征之间的关系信息来识别字与字之间潜在的“分隔”,从而准确地标识出字的标签类别。并且,实验结果也验证了我们的观点。根据由不同领域的文本数据训练的字向量的不同,该模型也适应各种领域内的中文分词任务。由于实验条件有限,我们没有进行更多的模型测试,模型还有很大的改进空间,有待于后续的研究。