文本情感分类(二)

来源:互联网 发布:淘宝守望先锋代练 编辑:程序博客网 时间:2024/05/06 02:05

该篇文章中,主要探讨关于深度学习解决自然语言问题。
深度学习与自然语言处理
近年来,深度学习算法被应用到了自然语言处理领域,获得了比传统模型更优秀的成果。
在自然语言处理中,最核心的一个问题是,如何把一个句子用数字的形式有效的表达出来?如果能够完成这一步,句子的分类就不成问题了。显然,一个最初的思路是:给每个词语赋予唯一的编号1,2,3,4…,然后把句子看成是编号的集合,比如假设1,2,3,4分别代表“我”、“你”、“爱”、“恨”,那么“我爱你”就是[1, 3, 2],“我恨你”就是[1, 4, 2]。这种思路看起来有效,实际上非常有问题,比如一个稳定的模型会认为3跟4是很接近的,因此[1, 3, 2]和[1, 4, 2]应当给出接近的分类结果,但是按照我们的编号,3跟4所代表的词语意思完全相反,分类结果不可能相同。因此,这种编码方式不可能给出好的结果。 也许会想到说,如果将相近的词语编号凑在一起不就行了?但是,如果给出每个词语唯一的编号,并且将相近的词语编号设为相近,实际上是假设了词义的单一性,也就是说,词义仅仅是唯一的,然而事实并非如此,词义应该是多维的。

word2vec:高维数据处理
从上面的讨论知道,很多词汇的意思是各个方向发散开的,而不是单纯的一个方向,因此唯一的编号不是特别理想。那么多个编号如何?换句话说,将词语对应的一个多维向量?没错,这是一个不错的思路。

为什么多维向量可行?首先多维向量解决了词语的多方向发散问题,仅仅是二维向量就可以360度全方位旋转了,何况是高维呢。其次,还有一个比较实际的问题,就是多维向量允许我们用变化小的数字就可以表征词语。
现在思路是有了,问题是,如何把这些词语放在正确的高维向量中?而且重点是,要在没有语言背景下做到这件事情的?而基于这个思路有一个开源的著名工具word2vec

简单来说,Wordvec就是完成了上面所说的我们要做的事情,用高维向量表示词语,并把相近意思的词语放在相近的位置上,并且用的是实数向量。我们只需要有大量的某语言的预料,就可以用他来训练模型了,获得词向量,

表达句子:句向量
接下来要解决的问题:我们已经分好词,并且已经将转换为高维向量,那么句子就对应着词向量的集合,也就是矩阵,类似于图像处理,图像数字化后也对应一个像素矩阵;可是模型的的输入一般只接受以为的特征,那么办呢?一个比较简单的想法就是讲矩阵展评,也就是将词向量一个接一个,组成一个更长的向量。这个思路是可以的,但是这样就会使得我们的输入高维高达几千为甚至上万维,事实上很难实现的。

事实上,对于图像处理来说,已经有一套成熟的方法了,叫做卷积神经网络。他是神经网络的一种,专门用来处理矩阵的输入的任务,能够将矩阵形式的输入编码为较低维度的一维向量,而且保留大多数有用信息,卷积神经网络一套也可以搬到自然语言处理中,尤其是文本情感分类中,效果也不错。

现在我们来谈谈有意思的两部。
第一步是标注语料的收集。要注意我们的模型是监督的,所以需要收集一些已经分好类的句子。而对于中文文本情感分类来说,这一步着实不容易,中文的资料往往是匮乏的。
2:模型阈值选取的问题。

print('Build model...')model = Sequential()model.add(Embedding(len(dict)+1, 256))model.add(LSTM(256, 128)) # try using a GRU instead, for funmodel.add(Dropout(0.5))model.add(Dense(128, 1))model.add(Activation('sigmoid'))model.compile(loss='binary_crossentropy', optimizer='adam', class_mode="binary")
阅读全文
0 0
原创粉丝点击