nlp中语义理解一直是业内的难题。汉语不同于英语,同样一个意思,可以有很多种说法,比如你是谁的问题,就可以有如下几种:①你是谁?②你叫什么名字?③您贵姓?④介绍一下你自己 等等。这些句子在语义上是十分接近的,如果做一个智能音响,对音响说出上述任何一句,其结果不应该因为句子形式的不同而不同,也就是说训练出的模型不能对同义语句太敏感。在神经概率语言模型产生之前,解决这个问题(或者nlp领域里比较流行的特征抽取),基本上都是依赖比较传统的TF-IDF算法来构造出一个句子的向量,然后计算向量的相似度。这种方法的能力是非常有限的,最大的问题首先是,不能表示出一个句子。在神经概率语言模型,也就是深度学习引入到nlp中之后,word2vector,lstm,cnn开始逐步占据主导。在最开始的由word2vector表达词向量,扩展到目前的用LSTM表达句子的向量,还有RCNN应用于NLP可以抽取出一个句子的高阶特征,这几年热度一直居高不下。
word2vector严格来讲,有4层的神经网络构成。input层是one-hot表示,接下来是embedding层,这两层中间的连接参数就是词的embedding表示,有one-hot到embedding的矩阵操作,相当于one-hot在词典中查找出这个词的embedding表示。所以说,word embedding的本质是连接one-hot到embedding层的权重参数,整个训练过程是训练这些参数。后两层是projection layer和output layer,output layer是分类输出层。word2vector之所以能够用表示两个词的向量的差异来衡量两个词的差异,根本原因是在训练过程中,embedding参数和output layer的参数互相推导,两者相互影响,也就是说在训练的过程中,已经兼顾到了上下文。
在word2vector产生后,情感分析便由word2vector和svm主导,先获取到用户评价句子的每个词的表示,对每个词打分,然后加权求和得出一句话的得分,来判断这句话是好评,中评还是差评。很显然,这种方法只是从词这个局部单元考虑出发,并没有考虑到整句话所表达的意思,很容易陷入局部最优解。lstm产生后,便摒弃了这个方案,先由lstm训练出这句话的向量,然后进入到回归层进行打分。这样就能从整句话出发来判断用户的评价了。