使用 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 删除。

编辑于

我来说两句

2 条评论
登录 后参与评论

相关文章

来自专栏ATYUN订阅号

深度学习:如何理解tensorflow文本蕴含的原理

文本的entailment(蕴涵)是一个简单的逻辑练习,用来判断一个句子是否可以从另一个句子推断出来。承担了文本的entailment任务的计算机程序,试图将一...

5654
来自专栏AI研习社

Inception Network 各版本演进史

Inception 网络是卷积神经网络 (CNN) 分类器发展中的一个重要里程碑。在 inception 之前, 大多数流行的 CNN 只是将卷积层堆叠得越来越...

973
来自专栏鹅厂优文

AI从入门到放弃:CNN的导火索,用MLP做图像分类识别?

图片标题会显示Accuracy(准确度),准确度的计算公式是: 识别正确图片数/图片总数。

3099
来自专栏ATYUN订阅号

深度实践:如何用神经网络给黑白照片着色

现如今,将图片彩色化是通常用Photoshop处理的。一幅作品有时候需要用一个月的时间来着色。可能单单一张脸就需要20层的粉色、绿色和蓝色阴影才能让它看起来恰到...

2767
来自专栏雷经纬的专栏

老司机带你检测相似图片

本文从从图片的dhash,ahash,phash,颜色分布向量到基于语义的sift,surf,gist特征,构建一套分层相似图片检测系统。本文致力于零基础单机快...

2K2
来自专栏人工智能头条

LSTM实现详解

1683
来自专栏企鹅号快讯

从零开始,教初学者如何征战全球最大机器学习竞赛社区Kaggle竞赛

在学习过深度学习的基础知识之后,参与实践是继续提高自己的最好途径。本文将带你进入全球最大机器学习竞赛社区 Kaggle,教你如何选择自己适合的项目,构建自己的模...

17210
来自专栏AI科技大本营的专栏

AI 技术讲座精选:「Python」LSTM时序预测状态种子初始化

长短期记忆网络(LSTM)是一种强大的递归神经网络,能够学习长观察值序列。 LSTM的一大优势是它们能有效地预测时间序列,但是作这种用途时配置和使用起来却较为...

3315
来自专栏目标检测和深度学习

资源 | 用Python和NumPy学习《深度学习》中的线性代数基础

642
来自专栏机器之心

教程 | 先理解Mask R-CNN的工作原理,然后构建颜色填充器应用

选自matterport 作者:Waleed Abdulla 机器之心编译 参与:刘晓坤 上年 11 月,matterport 开源了 Mask R-CNN 实...

2935

扫码关注云+社区