使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人生苦短,我用Python(Python快速教程 - 基础篇)

Life is short, you need Python 人生苦短,我用Python -- Bruce Eckel 5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用。 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明…

A5营销:传统企业站优化正文内容在SEO方面的三大注意事项

关于网站的正文内容,相信站长们都应该比较清楚正文内容的作用以及给网站所带来的价值,优质的网站正文内容可以给用户带来阅读体验和帮助、可以给网站带来庞大的流量、可以让蜘蛛一次吃个饱等等。当然,优质的正文内容不光是内容的质量正重要&a…

LeetCode 1000. 合并石头的最低成本(区间DP)

文章目录1. 题目2. 解题1. 题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数。 找出把所有石头合并成一堆的最低成本。如果不可…

Android 自定义View (一)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24252901 很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫&#x…

LeetCode 995. K 连续位的最小翻转次数(差分思想)

文章目录1. 题目2. 解题1. 题目 在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。 返回所需的 K 位翻转的次数,以便…

如何自学人工智能?

不少同学跃跃欲试,想投入 AI 的怀抱,但苦于不知如何下手。其中,人工智能的核心就是机器学习(Machine Learning),它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 我们今天就来分…

AI 人工智能学习经典书单

人工智能相关岗位中,涉及到的内容包含:算法、深度学习、机器学习、自然语言处理、数据结构、Tensorflow、Python 、数据挖掘、搜索开发、神经网络、视觉度量、图像识别、语音识别、推荐系统、系统算法、图像算法、数据分析、概率编程、计算机数学、数据仓…

牛客 牛牛爱喝酒(模拟)

文章目录1. 题目2. 解题1. 题目 链接:https://ac.nowcoder.com/acm/contest/9752/A 来源:牛客网 牛牛是一个酒鬼,非常爱喝酒, 一瓶酒m元钱, 两个酒瓶可以换一瓶酒, 四个瓶盖可以换一瓶酒, 现在…

零基础30分钟开启你的快速开发之旅

零基础30分钟开启你快速开发之旅 1. 前言 接触AgileEAS.NET SOA 中间件平台(以下简称EAS.NET平台)有4个多月时间,经过试用认为可以把它作为一个开发的基础平台,开发团队可以把开发的重点放在需求的把控和项目的交付上,…

牛客 牛牛的独特子序列(双指针/二分查找)

文章目录1. 题目2. 解题2.1 双指针2.2 二分查找1. 题目 链接:https://ac.nowcoder.com/acm/contest/9752/B 来源:牛客网 牛牛现在有一个长度为len只包含小写字母‘a’-z’的字符串x,他现在想要一个特殊的子序列, 这个子序列的长…

TCPIP通信

最近在开发TCPIP通信,封装了3个类,望各位大神指点指点。1 using System;2 using System.Collections.Generic;3 using System.Text;4 using System.Net.Sockets;5 using System.Threading;6 using System.Net;7 using System.Linq;8 using System.Net.Ne…

Python 20 秒画完小猪佩奇“社会人”!

每天写代码的程序员,你们知道今年社交平台上最火的带货女王是谁吗?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇。 如果你经常用抖音、快手、B 站、知乎、微博……或者类似的任何一个内容或社交平台&…

使用RNN预测文档归属作者

文章目录1. 文本处理2. 文本序列化3. 数据集拆分4. 建立RNN模型5. 训练6. 测试参考 基于深度学习的自然语言处理 1. 文本处理 数据预览 # 有两个作者的文章(A, B),定义为0, 1 A 0 # hamilton B 1 # madison UNKNOWN -1# 把…

LeetCode 1674. 使数组互补的最少操作次数(差分思想)

文章目录1. 题目2. 解题1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit 。 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的另一个整数。 如果对于所有下标 i(下标从 0 开始),nums[i] nums[…

Kaggle 房价预测竞赛优胜方案:用 Python 进行全面数据探索

[导读]Kaggle 的房价预测竞赛从 2016 年 8 月开始,到 2017 年 2 月结束。这段时间内,超过 2000 多人参与比赛,选手采用高级回归技术,基于我们给出的 79 个特征,对房屋的售价进行了准确的预测。今…

使用GRU单元的RNN模型生成唐诗

文章目录1. 读取数据2. 字符索引3. 创建文本序列4. 创建文本编码序列5. 使用GRU单元建立RNN模型6. 文本生成参考 基于深度学习的自然语言处理 本文使用 GRU 单元建立 RNN 网络,使用唐诗三百首进行训练,使用模型生成唐诗。 GRU RNN 网络能够克服简单RNN…

Python数据结构常见的八大排序算法(详细整理)

前言 八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。 常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 下面,利用Python分别…

牛客 牛牛选物(01背包)

文章目录1. 题目2. 解题1. 题目 链接:https://ac.nowcoder.com/acm/contest/9887/A 来源:牛客网 牛牛有现在有n个物品,每个物品有一个体积v[i]和重量g[i],他想选择其中总体积恰好为V的若干个物品,想使这若干个物品的总重量最大&…

微信小程序最常用的布局——Flex布局

最近在学习微信小程序,在设计首页布局的时候,新认识了一种布局方式display:flex 1 .container { 2 display: flex; 3 flex-direction: column; 4 align-items: center; 5 background-color: #b3d4db; 6 } 编译之后的效果很明显,界面…

LeetCode 649. Dota2 参议院(循环队列)

文章目录1. 题目2. 解题1. 题目 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行…