使用 Tensorflow 构建 CNN 进行情感分析实践

导语 一次简单的实验。出于兴趣的自学,求拍砖。

1 导论

Web挖掘中的情感分析类问题,其实是一个分类问题。而CNN可以用来处理分类任务,就是在最终的softmax函数计算属于各个类的概率,并归属到概率最大的类。

本次实验参照的是Kim Yoon的论文Convolutional Neural Networks for Sentence Classification

代码放在我的GitHub上。可以直接使用。

2 系统

2.1 数据集

本次实验使用的数据集来自Kaggle。具体文件都在/data路径下(train-kaggle.txt)。训练数据集中每行都包括5个等级的情感(0到4)及具体的影评。dev.txt是验证数据集。用训练数据集训练,根据在验证数据集上的表现选取模型,最后用选定的模型进行分类,得到结果,即result.txt

2.2 网络

下面这张图来自前面提到的Kim Yoon的论文。也是我们代码要实现的网络。第一层是嵌入层,将词组装成低维度的向量。下一层是卷积层,在前一层得到的向量上进行卷积。再下一层,即池化,将卷积层的结果转成特征向量,进行正则化等操作,最后在softmax层得到分类结果。

2.3 代码实现

查看text_cnn.py,这里定义了用于文本分类任务的TextCNN类。初始化时会指定句子长度、类别个数等参数。

class TextCNN(object):
def __init__(
  self, sequence_length, num_classes, vocab_size,
  embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0):

对数据进行预处理后,就来到了第一层,要将词组装成低维度的向量:

# Embedding layer
with tf.device('/cpu:0'), tf.name_scope("embedding"):
self.W = tf.Variable(
tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
name="W")
self.embedded_chars = tf.nn.embedding_lookup(self.W, self.input_x)
self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)

代码指定了在CPU上执行,tf.nn.embedding_lookup(...)方法执行真正的嵌入操作。

pooled_outputs = []
for i, filter_size in enumerate(filter_sizes):
with tf.name_scope("conv-maxpool-%s" % filter_size):
# Convolution Layer
filter_shape = [filter_size, embedding_size, 1, num_filters]
W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
conv = tf.nn.conv2d(
self.embedded_chars_expanded,
W,
strides=[1, 1, 1, 1],
padding="VALID",
name="conv")
# Apply nonlinearity
h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
# Maxpooling over the outputs
pooled = tf.nn.max_pool(
h,
ksize=[1, sequence_length - filter_size + 1, 1, 1],
strides=[1, 1, 1, 1],
padding='VALID',
name="pool")
pooled_outputs.append(pooled)

上面这段代码是卷积层和池化操作,在TensorBoard中可以看可视化的结构:

3 实验结果

执行下面这行命令:

tensorboard --logdir ./runs/1497715905/summaries/

然后访问127.0.0.1:6060,可以在dashboard上看到精度与损失随着迭代变化的曲线。

精度:

损失:

而用这个模型给测试集分类的结果,就在result.txt中。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

资源 | MIT提出Matlab插件mNeuron:实现深度模型神经元的可视化

选自MIT 机器之心编译 参与:黄小天、Smith 近日,麻省理工学院(MIT)Antonio Torralba 等人发表了一篇题为《mNeuron:...

3426
来自专栏ATYUN订阅号

【深度学习】AI如何用文字表达情绪——使用人工神经网络进行带情感识别的文本分类

本文将带你尝试,不使用文本复杂的矩阵转换将文本分类。本文是对3种方法的综合描述和比较,这些方法被用来对下面这些数据的文本进行分类。完整的代码可以在下面链接找到。...

2293
来自专栏PaddlePaddle

【文本分类】基于DNN/CNN的情感分类

导语 PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题。这里,我们针对常见的机器学习任务,提...

3634
来自专栏人工智能LeadAI

零基础用TensorFlow玩转Kaggle的“手写识别”

这是一个TensorFlow的系列文章,本文是第二篇,在这个系列中,你讲了解到机器学习的一些基本概念、TensorFlowa的使用,并能实际完成手写数字识别、...

3078
来自专栏机器之心

教程 | 用数据玩点花样!如何构建skim-gram模型来训练和可视化词向量

3836
来自专栏ATYUN订阅号

图像处理:利用神经网络生成新图像和修复旧图像

查看附带Python代码的GitHub repo(链接地址为https://github.com/philkuz/PixelRNN)和Jupyter笔记本(链接...

5707
来自专栏技术小站

吴恩达深度学习笔记 course4 week4 测验

Face verification requires comparing a new picture against one person’s face, wh...

954
来自专栏PPV课数据科学社区

【学习】 R语言与机器学习学习笔记(1)K-近邻算法

前言 最近在学习数据挖掘,对数据挖掘中的算法比较感兴趣,打算整理分享一下学习情况,顺便利用R来实现一下数据挖掘算法。 数据挖掘里我打算整理的...

2836
来自专栏AI研习社

手把手教你用 Python 实现针对时间序列预测的特征选择

AI 研习社按:本文源自美国机器学习专家 Jason Brownlee 的博客,AI 研习社编译。 要将机器学习算法应用于时间序列数据,需要特征工程的帮助。 例...

3998
来自专栏深度学习那些事儿

利用pytorch实现Visualising Image Classification Models and Saliency Maps

saliency map即特征图,可以告诉我们图像中的像素点对图像分类结果的影响。

1604

扫码关注云+社区