0. Cause I just wanna wake up in the fleeting light
0.1 アイスクリームみた溶けそう、その瞳にみつめられたなら
新论文方向想好了,一个改进的TextCNN应用实例吧。数据集来源于学长之前打比赛时官方发的2G数据包,大概达到的效果就是通过用户短评去给某个景点的旅行指标进行打分。当然会有一个疑问,在我们现实的应用场景中不都是用户进行打分吗。但这里我要做的是对短评的深层语义进行挖掘,然后得出打分(无奈,为了写论文而写),其实确实没有什么意义,但是自然语言处理就是这样。
为了给论文做一点铺垫,今天更新一个基于TextCNN的情感二分类问题。这个实验做了很久,4月3号完成的。当时边做边写,用了很多时间给虚拟机的使用写了一个README文档。
简单描述一下这个问题。电影影评一般属于短评,那么我们要做的就是将任一条用户影评分类至 [positive,negative] 两个标签,也就俗称为情感二分类问题。数据集源自于Movie Review Data这个开源站点http://www.cs.cornell.edu/people/pabo/movie-review-data/ ,里面有不同大小的datasets,均按照positive和negative两个标签分好类,可以根据电脑内存配置和实验需求进行选择。
现在每个方向都是基于深度学习的XXXX。自然语言处理也不例外,每天学习的还是CNN和RNN。3月份跟老师吵架的时候,因为那时候弄了一个基于LSTM的自动音乐序列生成,也就是训练集不是文本,他因为这个事情跟我生了半个月的气。TextCNN简单来说,就是比卷积神经网络CNN多了一个Embedding层,这个Embedding层的作用就是为了把文字转化为向量和矩阵,完毕。
0.2 会いたいなんて思っても、恥ずかしいからなかなか言えない
今天的标题会不会太长了,这一节结合Tensorboard简单说一下TextCNN的网络结构吧。前提是稍微熟悉一点CNN,如果忘记了可以参考我之前写一篇的CNN的学习记录博文,可以说非常的入门级和清晰了。代码将会在第二部给出,运行结果在第三部分给出。
图1 tensorboard中展示的TextCNN结构
可以看到,TextCNN在第一层加入了Embedding层,将输入的文本向量转化为数字向量。在输入Embedding之前,我们需要写一个data_helper的函数,去做文本的切词、去停用词、去标点符号、补齐等操作。把每一条短评处理为相同长度的文本向量(比如每一条都是100个词)后,输入Embedding层。Embedding层调用google开发的Word2vec方法将文本向量映射至数字向量。也就是说,经过Embedding层后每一条短评(100个词为例,每个词为100维)变成 [(x1_1,x1_2,...x1_100)....(x100_1,....x100_100)] 这样一组向量或者成为矩阵进行后续的计算。
经过Embedding层后的操作和CNN基本没区别,也是遵循Conv+Pool最后在全连接层进行Softmax操作,但在每一步的细节上有区别,这需要去代码里面好好看看,卷积采样窗口和池化方法等等都有不同。针对NLP的CNN常用Pool方法可以参考我之前写的一篇CNN中常见的几种pool操作。
这一小节最后再借用Yoon Kim论文中的一张图进行解释吧,论文参考 Convolutional Neural Networks for Sentence Classification 。wait这个词经过Embedding层后变为下图第一步中的向量形式,然后通过卷积Conv层变成第二步中的方格。然后下图中使用的pool方法为maxpool,因为第二步中多个方格只有一个输出到全连接层中。最后一步,全连接层通过softmax输出一个二分类概率。具体原理可以参考我写的CNN学习记录。
图2 TextCNN的情感二分类图示
1. Before these lights they all went dark
这一部分还是继续上干货,贴代码,总共有4个py文件。简单解释一下作用。
data_helpers.py:文本文件导入,切词、去停用词、去标点符号,文本向量填充等等。
eval.py:负责参数和结果的部分输出。
text_cnn.py:网络定义。
train.py:训练部分。
使用时直接运行train.py就可以了。想查看更多的中间过程(比如每条短评经过Embedding层后是什么样子的),参考 https://blog.csdn.net/github_38414650/article/details/74019595 。下面我按上述顺序贴代码。
# data_helpers.py import numpy as np def clean_str(string): def load_data_and_labels(positive_data_file,negative_data_file): x_text = positive_examples + negative_examples positive_labels = [[0,1] for _ in positive_examples] def batch_iter(data,batch_size,num_epochs,shuffle=True): for epoch in range(num_epochs): |
#! /usr/bin/env python # eval.py import tensorflow as tf # Parameters # Data Parameters # Eval Parameters # Misc Parameters FLAGS = tf.app.flags.FLAGS # CHANGE THIS: Load data. Load your own data here # Map data into vocabulary print("\nEvaluating...\n") # Evaluation # Get the placeholders from the graph by name # Tensors we want to evaluate # Generate batches for one epoch # Collect the predictions here for x_test_batch in batches: # Print accuracy if y_test is defined # Save the evaluation to a csv |
# text_cnn.py import tensorflow as tf class TextCNN(object): # Placeholders for input, output and dropout # Keeping track of l2 regularization loss (optional) # Embedding layer # Create a convolution + maxpool layer for each filter size # Combine all the pooled features # Add dropout # Final (unnormalized) scores and predictions # Calculate mean cross-entropy loss # Accuracy |
# train.py import tensorflow as tf # Parameters # Data loading params # Model Hyperparameters # Training parameters FLAGS = tf.app.flags.FLAGS # Data Preparation # Load data # Build vocabulary # Randomly shuffle data # Split train/test set del x, y, x_shuffled, y_shuffled print("Vocabulary Size: {:d}".format(len(vocab_processor.vocabulary_))) # Training with tf.Graph().as_default(): # Define Training procedure # Keep track of gradient values and sparsity (optional) # Output directory for models and summaries # Summaries for loss and accuracy # Train Summaries # Dev summaries # Checkpoint directory. Tensorflow assumes this directory already exists so we need to create it # Write vocabulary # Initialize all variables def train_step(x_batch, y_batch): def dev_step(x_batch, y_batch, writer=None): # Generate batches |
2. I would fade away with you
首先是控制台的输出情况,训练轮数与每轮迭代次数可以在eval.py中进行修改。
图3 控制台的输出
因为写了save model的东西,所以可以在tensorboard中查看更多训练的详细情况。tensorboard的使用方法查看我之前写的一篇博客有关TensorBoard一些小Tip和实例。可以看到train的准确率基本达到1,在该训练集上TextCNN能够准确进行短评的情感归类了。不信你试试,I hate this movie。如何调用存储好的训练model移步CSDN进行查询。今天就写到这里了。周末愉快。
图4 训练的准确率函数
图5 损失函数
原文地址:https://www.cnblogs.com/catallen/p/9220778.html