上周分享了本文上篇,现有分词、机器学习、深度学习库Keras技术知识,下篇将详细介绍达观数据使用深度学习的分词尝试。
基于上面的知识,可以考虑使用深度学习的方法进行中文分词。分词的基础思想还是使用序列标注问题,将一个句子中的每个字标记成BEMS四种label。模型整的输入是字符序列,输出是一个标注序列,因此这是一个标准的sequence to sequence问题。因为一个句子中每个字的上下文对这个字的label类型影响很大,因此考虑使用RNN模型来解决。
测试硬件是Macbook Pro 2014 Mid高配版,带Nvidia GT 750M GPU,虽然GPU性能有限,但通过测试性能还是强过mac自带的i7 CPU。使用GPU进行模型运算,需要安装Nvidia的cuda相关程序及cuDNN库,会有较大的性能提升。软件方面使用python2.7,安装好了keras,theano及相关库。关于keras使用GPU训练的环境搭建问题,可以参考这篇文章(Run Keras on Mac OS with GPU,http://blog.wenhaolee.com/run-keras-on-mac-os-with-gpu/)
模型训练使用的是经典的bakeoff2005中的微软研究院的切分语料,将其中的train部分拿过来做训练,将test作为最终的测试。
训练数据准备
首先,将训练样本中出现的所有字符全部映射成对应的数字,将文本数字化,形成一个字符到数据的映射。在分词中,一个词的label受上下文影响很大,因此参考之前提到的lstm_text_generation.py示例,我们将一个长度为n个字符的输入文本处理成n个长度为k的向量,k为奇数。
举例来说,当k=7时,表示考虑了一个字前3个字和后三个字的上下文,将这个七个字作为一个输入,输出就是这个字的label类型(BEMS)。
基础模型建立
参考lstm_text_generation.py中的模型搭建方式,我们采用一层的LSTM构建网络,代码如下:
其中,输入的维度input_dim是字符类别总数,hidden_node 是隐藏层的结点个数。在上面的模型中,第一层输入层Embedding的作用是将输入的整数向量化。在现在这个模型中,输入是一个一维向量,里面每个值是字符对应的整数,Embedding层就可以将这些整数向量化,简单来讲就是生成了每个字的字向量。
接下来紧跟着一层是LSTM,它输出维度也是隐藏层的结点个数。Dropout层的作用是让一些神经节点随机不工作,来防止过拟合现象。Dense层是最后的输出,这里nb_classes的数目是4,代表一个字符的label。模型建立好后开始训练,重复20次,训练的结果如下:
图1 基础模型(1层LSTM优化器RMSprop)训练20次
训练好后,我们使用msr_test的测试数据进行分词,并将最终的分词结果使用icwb2自带的脚本进行测试,结果如下:
图2 基础模型F Score: 0.845
可以看到基础模型的F值一般,比传统的CRF效果差的较多,因此考虑优化模型。
模型参数调整
首先想到的是模型参数的调整。Keras官方文档中提到,RMSprop优化方法在RNN网络中通常是一个好的选择,但是在尝试了其他的优化器后,比如Adam,发现可以取得更好的效果:
图3 1层LSTM优化器Adam训练20次
可以看到,Adam在训练过程中的精度就已经高于RMSprop,使用icwb2的测试结果为:
图4 修改优化器Adam后的模型F Score:0.889
现在网络结构较简单,只有一层LSTM,参考文档示例中的模型设计,考虑使用两层的LSTM来进行测试,修改后的代码如下:
注意,第一层LSTM有个return_sequences =True可以将最后一个结果出入到输出序列,保证输出的tensor是3D的,因为LSTM的输入要求是3D的tensor。
两层LSTM模型训练过程如下:
图5 两层LSTM优化器Adam训练20次的模型
可以看到,两层LSTM使得模型更加复杂,训练时常也增加不少。模型训练后,使用icwb2的测试结果为:
图6 两层LSTM的模型F Score:0.889
可以看到,随着模型的复杂,虽然F Score无提升,但是其他的指标有一定的提升。一般来说,神经网络在大量训练数据下也会有更好的效果,后续会继续尝试更大数据集更复杂模型的效果。
使用深度学习技术,给NLP技术给中文分词技术带来了新鲜血液,改变了传统的思路。深度神经网络的优点是可以自动发现特征,大大减少了特征工程的工作量,随着深度学习技术的进一步发展,在NLP领域将会发挥更大的作用。达观数据将在已有成熟的NLP算法及模型基础上,逐渐融合基于深度神经网络的NLP模型,在文本分类、序列标注、情感分析、语义分析等功能上进一步优化提升效果,来更好为客户服务。
作者
高翔,达观数据联合创始人,上海交通大学通信硕士,负责达观数据产品技术相关开发管理工作,曾任职于盛大文学、盛大创新院,在搜索引擎、自然语言处理、机器学习及前端技术有着丰富的经验。