基于CNN神经网络的情感分析

TextCNN介绍

卷积神经网络(Convolutional Neural Network, CNN)是一种具有局部连接、权重共享等特性的深层前馈神经网络。卷积神经网络最早主要用来处理图像信息,2014年,Kim1提出TextCNN,将卷积神经网络CNN应用到文本分类任务中。其详细结构示例如下图所示。
在这里插入图片描述

图片参考Kim等人论文《Convolutional Neural Networks for Sentence Classification》

1.嵌入层(embedding)

预训练词向量作为嵌入层,将数据中所有词分别表示成向量形式,得到一个词向量矩阵,该矩阵可以是静态的(static),用预训练词向量初始化embeddings,训练过程中不再更新,也可以是非静态(non-static),根据反向传播更新。

2.卷积层(Convolution)

设单词个数为n,词向量一共有d维,则得到n*d的矩阵。然后经过个数为k的不同卷积核大小(region_size)的一维卷积,设不同大小卷积核的个数(filters)为m,卷积核宽度与词向量维度一致为d,高度h是超参数。共得到k*m个特征图(feature map)。
例如图3-4所示,单词个数n=7,词向量维度d=5,得到7*5的矩阵,经过 k=3的region_size=(2,3,4),每个region_size 3个filters的卷积层卷积,得到3*2=6个feature map。

3.池化层(Polling)

不同尺寸的卷积核得到的特征大小不同,对每个feature map使用池化函数,使它们的维度相同,之后进行拼接,得到最终的k*m维列向量。
例如,上图中,对6个feature map使用1-max pooling得到6个维度相同的向量,之后将向量进行拼接,得到6维列向量。

4.全连接层(FullConnection and softmax)

将上一层得到的向量输入到全连接的softmax层,即可输出每个类别的概率。

TextCNN实验

本文使用non-static模式,采用预训练好的词向量,并在训练TextCNN时进行微调。由于CNN要求输入数据的长度一致,根据评论的最大长度,将长度小于50的评论补0,长度大于50的评论截断。
实验步骤:
1.不断调整模型中的超参数以提高模型性能,最终将模型的超参数设置为:max_seq_len:50,filter_sizes=[2,3,4],n-filters(每个filter数量)=100,batch-size:64,learning rate:0.0001,dropout rate:0.5。
2.损失函数采用交叉熵,使用Adam优化器进行最多200个epochs训练,当验证集损失连续20个epochs没有下降时,停止训练,将训练过程验证集损失最小的模型作为测试集输入的模型,得到最终测试集的准确率。
3.进行步骤2中的10次实验,得到最终的准确率±标准差为:0.8874±0.0042。

核心代码展示

import numpy as np
import pickle
import torch
import torch.nn as nn
import torch.utils.data
import time
import os
import torch.nn.functional as F
from sklearn import metrics
max_seq_length=50


with open("DATA/x_train.txt", "rb") as f:
    x_train = pickle.load(f)

with open("DATA/x_valid.txt", "rb") as f:
    x_valid = pickle.load(f)

with open("DATA/x_test.txt","rb") as f:
    x_test = pickle.load(f)
#将数据弄成长度相同
def split_data(corpus):
    for sentence in corpus:
       if len(sentence)>max_seq_length:
          for i in range(len(sentence)-max_seq_length):
              sentence.pop()
       else:
          sentence.extend([0]*(max_seq_length-len(sentence)))
    return corpus
embeddings=np.loadtxt("DATA/embeddings.txt",dtype=float)
embeddings=torch.from_numpy(embeddings)
x_train=split_data(x_train)
x_train=np.array(x_train)
x_train=torch.LongTensor(x_train)
y_train=np.loadtxt("DATA/y_train.txt",dtype=int)
y_train=torch.LongTensor(y_train)

x_valid=split_data(x_valid)
x_valid=np.array(x_valid)
x_valid=torch.LongTensor
  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值