使用CNN进行情感分类
文章目录
- 1. 读取数据
- 2. 数据集拆分
- 3. 文本向量化
- 4. 建立CNN模型
- 5. 训练、测试
参考 基于深度学习的自然语言处理
1. 读取数据
数据文件:
import numpy as np
import pandas as pddata = pd.read_csv("yelp_labelled.txt", sep='\t', names=['sentence', 'label'])data.head() # 1000条数据
# 数据 X 和 标签 y
sentence = data['sentence'].values
label = data['label'].values
2. 数据集拆分
# 训练集 测试集拆分
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(sentence, label, test_size=0.3, random_state=1)
3. 文本向量化
- 训练 tokenizer,文本转成 ids 序列
# 文本向量化
import keras
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=6000)
tokenizer.fit_on_texts(X_train) # 训练tokenizer
X_train = tokenizer.texts_to_sequences(X_train) # 转成 [[ids...],[ids...],...]
X_test = tokenizer.texts_to_sequences(X_test)
vocab_size = len(tokenizer.word_index)+1 # +1 是因为index 0, 0 不对应任何词,用来pad
- pad ids 序列,使之有相同的长度
maxlen = 100
# pad 保证每个句子的长度相等
from keras.preprocessing.sequence import pad_sequences
X_train = pad_sequences(X_train, maxlen=maxlen, padding='post')
# post 尾部补0,pre 前部补0
X_test = pad_sequences(X_test, maxlen=maxlen, padding='post')
4. 建立CNN模型
from keras import layers
embeddings_dim = 150
filters = 64
kernel_size = 5
batch_size = 64nn_model = keras.Sequential()
nn_model.add(layers.Embedding(input_dim=vocab_size, output_dim=embeddings_dim, input_length=maxlen))
nn_model.add(layers.Conv1D(filters=filters,kernel_size=kernel_size,activation='relu'))
nn_model.add(layers.GlobalMaxPool1D())
nn_model.add(layers.Dropout(0.3))
# 上面 GlobalMaxPool1D 后,维度少了一维,下面自定义layers再扩展一维
nn_model.add(layers.Lambda(lambda x : keras.backend.expand_dims(x, axis=-1)))
nn_model.add(layers.Conv1D(filters=filters,kernel_size=kernel_size,activation='relu'))
nn_model.add(layers.GlobalMaxPool1D())
nn_model.add(layers.Dropout(0.3))
nn_model.add(layers.Dense(10, activation='relu'))
nn_model.add(layers.Dense(1, activation='sigmoid')) # 二分类sigmoid, 多分类 softmax
参考文章:
Embedding层详解
Keras: GlobalMaxPooling vs. MaxPooling
- 配置模型
nn_model.compile(optimizer='adam', loss='binary_crossentropy',metrics=['accuracy'])
nn_model.summary()
from keras.utils import plot_model
plot_model(nn_model, to_file='model.jpg') # 绘制模型结构到文件
Model: "sequential_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_4 (Embedding) (None, 100, 150) 251400
_________________________________________________________________
conv1d_8 (Conv1D) (None, 96, 64) 48064
_________________________________________________________________
global_max_pooling1d_7 (Glob (None, 64) 0
_________________________________________________________________
dropout_7 (Dropout) (None, 64) 0
_________________________________________________________________
lambda_4 (Lambda) (None, 64, 1) 0
_________________________________________________________________
conv1d_9 (Conv1D) (None, 60, 64) 384
_________________________________________________________________
global_max_pooling1d_8 (Glob (None, 64) 0
_________________________________________________________________
dropout_8 (Dropout) (None, 64) 0
_________________________________________________________________
dense_6 (Dense) (None, 10) 650
_________________________________________________________________
dense_7 (Dense) (None, 1) 11
=================================================================
Total params: 300,509
Trainable params: 300,509
Non-trainable params: 0
5. 训练、测试
history = nn_model.fit(X_train,y_train,batch_size=batch_size,epochs=50,verbose=2,validation_data=(X_test,y_test))
# verbose 是否显示日志信息,0不显示,1显示进度条,2不显示进度条
loss, accuracy = nn_model.evaluate(X_train, y_train, verbose=1)
print("训练集:loss {0:.3f}, 准确率:{1:.3f}".format(loss, accuracy))
loss, accuracy = nn_model.evaluate(X_test, y_test, verbose=1)
print("测试集:loss {0:.3f}, 准确率:{1:.3f}".format(loss, accuracy))# 绘制训练曲线
from matplotlib import pyplot as plt
pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1) # set the vertical range to [0-1]
plt.show()
输出:
Epoch 1/50
11/11 - 1s - loss: 0.6933 - accuracy: 0.5014 - val_loss: 0.6933 - val_accuracy: 0.4633
Epoch 2/50
11/11 - 0s - loss: 0.6931 - accuracy: 0.5214 - val_loss: 0.6935 - val_accuracy: 0.4633
Epoch 3/50
11/11 - 1s - loss: 0.6930 - accuracy: 0.5257 - val_loss: 0.6936 - val_accuracy: 0.4633
....省略
11/11 - 0s - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.7943 - val_accuracy: 0.7600
Epoch 49/50
11/11 - 1s - loss: 0.0016 - accuracy: 1.0000 - val_loss: 0.7970 - val_accuracy: 0.7600
Epoch 50/50
11/11 - 0s - loss: 0.0027 - accuracy: 1.0000 - val_loss: 0.7994 - val_accuracy: 0.7600
22/22 [==============================] - 0s 4ms/step - loss: 9.0586e-04 - accuracy: 1.0000
训练集:loss 0.001, 准确率:1.000
10/10 [==============================] - 0s 5ms/step - loss: 0.7994 - accuracy: 0.7600
测试集:loss 0.799, 准确率:0.760
训练集:loss 0.001, 准确率:1.000
测试集:loss 0.799, 准确率:0.760
存在过拟合,训练集准确率很高,测试集效果差
- 随意测试
text = ["i am not very good.", "i am very good."]
x = tokenizer.texts_to_sequences(text)
x = pad_sequences(x, maxlen=maxlen, padding='post')
pred = nn_model.predict(x)
print("预测{}的类别为:".format(text[0]), 1 if pred[0][0]>=0.5 else 0)
print("预测{}的类别为:".format(text[1]), 1 if pred[1][0]>=0.5 else 0)
输出:
预测i am not very good.的类别为: 0
预测i am very good.的类别为: 1
使用CNN进行情感分类相关推荐
- 深度学习在情感分类中的应用
简介与背景 情感分类及其作用 情感分类是情感分析的重要组成部分,情感分类是针对文本的情感倾向进行极性分类,分类数量可以是二分类(积极或消极),也可以是多分类(按情感表达的不同程度),情感分析在影音评论 ...
- CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下
CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下 目录 图示过程 核心代码 图示过程 核心代码 def mini_XCEPTION(inp ...
- PaddlePaddle︱开发文档中学习情感分类(CNN、LSTM、双向LSTM)、语义角色标注
PaddlePaddle出教程啦,教程一部分写的很详细,值得学习. 一期涉及新手入门.识别数字.图像分类.词向量.情感分析.语义角色标注.机器翻译.个性化推荐. 二期会有更多的图像内容. 随便,帮国产 ...
- 情感分类模型介绍CNN、RNN、LSTM、栈式双向LSTM
情感分类模型介绍CNN.RNN.LSTM.栈式双向LSTM 1.文本卷积神经网络(CNN) 卷积神经网络经常用来处理具有类似网格拓扑结构(grid-like topology)的数据.例如,图像可以视 ...
- CNN在文本分类的应用(内有代码实现) 论文Convolutional Neural Networks for Sentence Classification
一.CNN文本分类简介 文本分类是NLP领域的一个重要子任务,文本分类的目标是自动的将文本打上已经定义好的标签,常见的文本分类任务有: 用户评论的情感识别 垃圾邮件过滤 用户查询意图识别 新闻分类 由 ...
- PaddlePaddle文本卷积实现情感分类和微博女友情绪监控AI
本期文章我们将使用文本卷积和StackLSTM层来实现一个情感分类网络,这样你就可以拥有一个属于自己的情感监控AI啦,甚至通过微博的接口来监控你女朋友的情绪.而要实现这一切,你不需要别的什么东西,你只 ...
- 【论文复现】使用CNN进行文本分类
今天要写的是关于NLP领域的一个关键问题:文本分类. 相对应的论文是:Convolutional Neural Networks for Sentence Classification 参考的博客为: ...
- 传统情感分类方法与深度学习的情感分类方法对比
标注:本博客是参考论文有<传统情感分类方法与机遇深度学习的情感分类方法对比分析>.<自然语言处理中的深度学习:方法及应用> 情感分类是自然语言处理的重要分支,传统情感分类主要有 ...
- 论文复现:用 CNN 进行文本分类
前一篇文章中我们学习了 CNN 的基础结构,并且知道了它是计算机视觉领域的基础模型,其实 CNN 不仅仅可以用于计算机视觉,还可以用于处理自然语言处理问题,今天就来看看如何用 CNN 处理文本分类任务 ...
最新文章
- Spring Boot注解大全,一键收藏了!
- Hibernate基于JDBC的批量删除
- LiveVideoStack Meet | 北京:卷时代,多媒体人 生存指北
- 现代女性都有哪些烦恼?
- vCenter Events
- linux 下挂载光驱
- 如何在Linux中使用ulimit命令
- .Net中如何操作IIS(原理篇)
- 主控域NTP时间同步(PTP时钟同步服务器)配置方法
- iOS 关于接入海康视频SDK的步骤
- 服装尺寸 html,女装标准尺码对照表,服装尺寸对照表,衣服尺码对照表
- 2.sklearn—评价指标大全(平均误差、均方误差、混淆矩阵、准确率、查全率、查准率、召回率、特异度,F1-score、G-mean、KS值、ROC曲线、AUC值、损失函数、结构风险最小)
- 计算机的自带拍视频教程,电脑如何录制视频并剪辑
- 加州理工学院计算机研究生申请条件,加州理工学院研究生申请条件
- js实现漂亮的雪花飘落效果
- 微信小程序实现展示图片(图片推广小程序可以使用)
- 欧盟CE法规及标准查询常用网站
- 硬核:如何用「区块链」改进传染病监测预警网络?
- from表单点击submit提交后没有反应
- Android Notification 没有声音 没有震动 的情况
热门文章
- 【Kubernetes】k8s 的基本使用指令
- BAT经典面试题精简版(基础知识附答案)
- redistemplate怎么修改数据_如何使用RedisTemplate访问Redis数据结构?
- python和revit_pyRevit系列教程1
- JPG PNG GIF BMP图片格式的区别
- 秒懂机器学习---当机器学习遇上决策树....
- linux相关命令介绍
- [Python] NotImplemented 和 NotImplementedError 区别
- 二元查找树的后序遍历结果
- 转 OFBIZ webservice简介