背景
情感分析有很多的应用场景,比如做一个电商网站,卖家需要时刻关心用户对于商品的评论是否是正面的。再比如做一个电影的宣传和策划,电影在键盘侠们中的口碑也至关重要。互联网上关于任何一个事件或物品都有可能产生成千上万的文本评论,如何定义每一个文本的情绪是正面或是负面的,是一个很有挑战的事情。挑战体现在以下几个方面,区别于结构化数据,评论数据的长短不一,很难限定到固定的维度。另外很难通过某个词判断用户的情绪,举个极端的例子,fu*k通常被认为是贬义词,但是如果一条评论是“傲海 is fu*kinghandsome”,那么其实就是一个正向的意义。本文我要使用IMDB数据集,通过20行的Tensorflow代码实现一个电影评论预测模型,准确率可以超过百分之九十五,里面涉及到一些词袋模型以及embedding的概念,这些我等下一篇文章再讲,这一次我们就讲实践。
数据
介绍下本文用到的训练数据IMDB,完全开源的一个电影评价数据集,有好几万条真实的电影评论数据。
每一个数据都被储存为txt文件存放,其中pos文件夹就存放正面评论的数据,neg文件夹存放负面情绪的数据。这些数据可以通过一些简单的代码提取出来,并且标记。数据集下载地址:http://ai.stanford.edu/~amaas/data/sentiment/
简单来说,在数据预处理阶段,需要把这些文本按照正向和负向打标,并且把文本向量化,比如“Aohai is fuc*inggentle”这种话要怎么变成数值向量,下一篇文章会具体说明。
代码
代码其实不止20行,但是真正建模并训练的就是只有20行,简单介绍下哈:
trainX = pad_sequences(trainX, maxlen=100, value=0.)
testX = pad_sequences(testX, maxlen=100, value=0.)
# Converting labels to binary vectors
trainY = to_categorical(trainY, nb_classes=2)
testY = to_categorical(testY, nb_classes=2)
# Network building
net = tflearn.input_data([None, 100])
net = tflearn.embedding(net, input_dim=vocabulary_size, output_dim=128)
net = tflearn.lstm(net, 128, dropout=0.8)
net = tflearn.fully_connected(net, 2, activation='softmax')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,
loss='categorical_crossentropy')
# Training
model = tflearn.DNN(net, tensorboard_verbose=0)
model.fit(trainX, trainY,n_epoch=1, validation_set=(testX, testY), show_metric=True,
batch_size=32)
predictions = model.predict(trainX)
print(predictions)
前4行应该比较容易懂
- pad_sequences把输入的词向量转成矩阵,不够的用0补
- to_categorical:把目标列分成0和1,0是负样本,1是正样本
- 用的是Tensorflow的high level的库tflearn去构建神经网络计算图
- embedding下次讲,大家可以理解为把每个词表示成向量
- 用的是lstm模型,好处就是这种网络结构比较适合做上下文关联的分析,适合NLP的场景
- full connect加regression,分类的标准组合
- 然后fit一下,开启训练,n_epoch是迭代的轮数,为了快速出结果我就写的1
- 利用模型对训练数据做一次predict,大家也可以换成自己的数据
运行结果
代码层级是这样的:
执行文件emotional.py和下载的IMDB数据放到同一级目录,train文件夹下有pos和neg两个文件夹,分别存放正向和负向的评论~
算了,大家直接clone我的项目,我放一些数据在里面,直接运行:
python emotional.py就行
需要安装Tensorflow和tflearn这两个库,当然也可以用阿里云机器学习PAI的notebook,这样就不用安装了,下图就是我用PAI跑出来的截图。
运行结果:
epoch表示的是迭代次数,代码里只设置了迭代一次。最下面的这一串矩阵一共有两列,每一行对应一个需要预测的评论数据,每一行的第一列表示这个评论属于负向的概率,每一行的第二列表示这个评论属于正向的概率。
代码地址
我只放了一点点测试数据,完整的数据大家自己去IMDB下吧:https://github.com/jimenbian/sentiment-analysis
与网上的案例不同,其它案例都缺少自定义数据集的功能,限制在了IMDB,使用本文的code可以任意修改预测数据集
参考:http://blog.csdn.net/aliceyangxi1987/article/details/76176746