为什么在 NLP 分类任务中选择 CNN 呢?
1.CNN神经网络可以像处理图像一样处理文本并“理解”它们
2.主要好处是高效率
3.在许多方面,由于池化层和卷积核大小所造成的限制(虽然可以将卷积核设置得更大),会导致丢弃信息,但这并不意味着它们不是有用的模型。利用 CNN 能够有效地对相对较大的数据集进行检测和预测情感
4.即使依赖 Word2vec 词嵌入,CNN 也可以在不映射整个语言的条件下,通过较少的词嵌入表示来运行

import numpy as np
# 处理填充输入数据的辅助模块
from keras.preprocessing import sequence
# 基础的 Keras 神经网络模型
from keras.models import Sequential
# 模型中常用的层对象
from keras.layers import Dense, Dropout, Activation
# 卷积层和池化
from keras.layers import Conv1D, GlobalMaxPooling1D
import glob
import os
from random import shuffle
from nltk.tokenize import TreebankWordTokenizer
from gensim.models.keyedvectors import KeyedVectors
from nlpia.loaders import get_data
from keras.models import model_from_json
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()# 为NumPy和TensorFlow设置随机种子以确保可以得到一致的结果
np.random.seed(123)
tf.set_random_seed(123)# 加载数据
# 文档加载预处理
def pre_process_data(filepath):"""This is dependent on your training data source but we willtry to generalize it as best as possible."""positive_path = os.path.join(filepath, 'pos')negative_path = os.path.join(filepath, 'neg')pos_label = 1neg_label = 0dataset = []# glob是实用的文件名匹配库,glob.glob()函数将会匹配给定路径下的所有pattern,并以列表形式返回。# 用它可以查找符合特定规则的文件路径名for filename in glob.glob(os.path.join(positive_path, '*.txt')):with open(filename, 'r', encoding='UTF-8') as f:dataset.append((pos_label, f.read()))for filename in glob.glob(os.path.join(negative_path, '*.txt')):with open(filename, 'r', encoding='UTF-8') as f:dataset.append((neg_label, f.read()))shuffle(dataset)return datasetdataset = pre_process_data('xxx\\aclImdb\\aclImdb\\train')
# 元组的第一个元素是情感的目标值:1 表示积极情感,0 表示消极情感
print(dataset[0])# 向量化及分词器
word_vectors = KeyedVectors.load_word2vec_format('xxx\\googlenews-vectors-negative300.bin.gz',binary=True)'''
这里有一些信息损失。谷歌新闻的 Word2vec 词汇表中只包含了一部分停用词,
使很多像“a”这样的常用词将在函数处理过程中被丢弃,这个处理不是特别理想,不过大家可
以通过这个方法得到一个信息有损失情况下的卷积神经网络的基线性能。如果想要避免信息损
失,大家可以单独训练 word2vec 模型,以确保有更好的向量覆盖率。另外,数据中还有很多类
似于<br\>的 HTML 标签,它们通常与文本的情感无关,必须从数据中去除。
'''
def tokenize_and_vectorize(dataset):tokenizer = TreebankWordTokenizer()vectorized_data = []expected = []for sample in dataset:tokens = tokenizer.tokenize(sample[1])sample_vecs = []for token in tokens:try:sample_vecs.append(word_vectors[token])except KeyError:pass # No matching token in the Google w2v vocabvectorized_data.append(sample_vecs)return vectorized_data# 目标标签
def collect_expected(dataset):""" Peel off the target values from the dataset """expected = []for sample in dataset:expected.append(sample[0])return expected# vectorized_data结构:[[[词向量], [], ...], [[], [], ...], ...]
vectorized_data = tokenize_and_vectorize(dataset)
# [...]
expected = collect_expected(dataset)# 划分训练集/测试集
split_point = int(len(vectorized_data)*.8)
x_train = vectorized_data[:split_point]
y_train = expected[:split_point]
x_test = vectorized_data[split_point:]
y_test = expected[split_point:]# CNN 参数
# maxlen 变量用于设置评论的最大长度,
# 因为卷积神经网络的每个输入必须具有相同的维数,所以需要截断超出 400 个词条的样
# 本,并填充少于 400 个词条的样本,填充值可以是 Null 或 0
maxlen = 400
# 在后向传播误差和更新权重前,向网络输入的样本数量
batch_size = 32
# 传入卷积神经网络中词条向量的长度
embedding_dims = 300
# 要训练的卷积核的数量
filters = 250
# 卷积核大小:每个卷积核将是一个矩阵:embedding_dims × kernel_size,
# 在这里是 250 × 3
kernel_size = 3
# 在普通的前馈网络中传播链端点的神经元的数量
hidden_dims = 250
# 整个训练数据集在网络中的传入次数
epochs = 4# 填充及截断词条序列,长度不够的填充元素为0的词向量
def pad_trunc(data, maxlen):"""For a given dataset pad with zero vectors or truncate to maxlen"""new_data = []# Create a vector of 0s the length of our word vectorszero_vector = []for _ in range(len(data[0][0])):zero_vector.append(0.0)for sample in data:if len(sample) > maxlen:temp = sample[:maxlen]elif len(sample) < maxlen:temp = sample# Append the appropriate number 0 vectors to the listadditional_elems = maxlen - len(sample)for _ in range(additional_elems):temp.append(zero_vector)else:temp = sample# 最后将扩展后的数据放在扩展数据列表的最后new_data.append(temp)return new_data# 收集经过扩展和截断的数据,并将其转换为 numpy 数组,以便在 Keras 中使用
x_train = pad_trunc(x_train, maxlen)
x_test = pad_trunc(x_test, maxlen)
# 大小为样本数量×序列长度×词向量长度
x_train = np.reshape(x_train, (len(x_train), maxlen, embedding_dims))
y_train = np.array(y_train)
x_test = np.reshape(x_test, (len(x_test), maxlen, embedding_dims))
y_test = np.array(y_test)# 卷积神经网络
# 构建一个一维 CNN
print('Build model...')
# Keras 中标准的模型定义方式
model = Sequential()
model.add(Conv1D(filters,kernel_size,padding='valid',activation='relu',strides=1,input_shape=(maxlen, embedding_dims)))
# 可选的池化方法有 GlobalMaxPooling1D()、MaxPooling1D(n)或 AvgPooling1D(n),其中
# n 表示池化区域大小,默认值为 2
# 全局最大池化
model.add(GlobalMaxPooling1D())
# 带 dropout 的全连接层
# 从一个普通的全连接隐藏层开始,然后加入dropout 和 ReLU
model.add(Dense(hidden_dims))
model.add(Dropout(0.2))
model.add(Activation('relu'))
# 输出层,是实际的分类器
model.add(Dense(1))
model.add(Activation('sigmoid'))# 编译 CNN:编译为初始未训练状态
# compile()完成模型的构建
# loss可选:binary_crossentropy 和 categorical_crossentropy...
# optimizer可选:随机梯度下降、Adam和 RSMProp...
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])# 训练 CNN,fit()完成模型的训练:
# 通过反向传播每个样本的误差来学习最后面的卷积核和前馈全连接网络之间的权重,
# 以及 250 个不同的卷积核各自的权重
# batch_size:反向传播更新权重之前处理的数据样本
# 数。每个批次中 n 个样本的累计误差会同时处理# 当训练中的损失持续减少,而验证损失 val_loss 在周期结束时与前一周期相比开始增加
# 时,就出现了明显的过拟合。找到验证损失曲线开始向上弯曲的中间值是获得一个好模型的关键。
model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))# 保存模型
# 将模型的结构保存在 JSON 文件中,并将训练后的权重保存在另
# 一个文件中,以便之后重新实例化
model_structure = model.to_json()
with open("cnn_model.json", "w") as json_file:json_file.write(model_structure)
model.save_weights("cnn_weights.h5")# 加载保存的模型
with open("cnn_model.json", "r") as json_file:json_string = json_file.read()
model = model_from_json(json_string)
model.load_weights('cnn_weights.h5')# 预测
# 测试样本数据
sample_1 = "I hate that the dismal weather had me down for so long, when will it break! Ugh, when does happiness return? The sun is blinding and the puffy clouds are too thin. I can't wait for the weekend."
vec_list = tokenize_and_vectorize([(1, sample_1)])
test_vec_list = pad_trunc(vec_list, maxlen)
test_vec = np.reshape(test_vec_list, (len(test_vec_list), maxlen, embedding_dims))
print(model.predict(test_vec))
print(model.predict_classes(test_vec))

自然语言处理--keras实现一维卷积网络对IMDB 电影评论数据集构建情感分类器相关推荐

  1. 自然语言处理--Keras 实现LSTM循环神经网络分类 IMDB 电影评论数据集

    LSTM 对于循环网络的每一层都引入了状态(state)的概念,状态作为网络的记忆(memory).但什么是记忆呢?记忆将由一个向量来表示,这个向量与元胞中神经元的元素数量相同.记忆单元将是一个由 n ...

  2. 自然语言处理--Keras 实现循环神经网络分类 IMDB 电影评论数据集

    那么为什么要使用 RNN 呢?不一定要选择循环神经网络,与前馈网络或卷积神经网络相比,它训练和传递新样本的成本相对较高(循环层计算成本较高). 但是循环网络在记忆能力方面的特殊优势即记住句子中出现过的 ...

  3. 自然语言处理-应用场景-文本分类:基于LSTM模型的情感分析【IMDB电影评论数据集】--(重点技术:自定义分词、文本序列化、输入数据批次化、词向量迁移使用)

    文本情感分类 1. 案例介绍 现在我们有一个经典的数据集IMDB数据集,地址:http://ai.stanford.edu/~amaas/data/sentiment/,这是一份包含了5万条流行电影的 ...

  4. 【keras】一维卷积神经网络多分类

    刚刚接触到深度学习,前2个月的时间里,我用一维的卷积神经网络实现了对于一维数据集的分类和回归.由于在做这次课题之前,我对深度学习基本上没有过接触,所以期间走了很多弯路. 在刚刚收到题目的要求时,我选择 ...

  5. Keras实现一维卷积(Conv1D)实例

    实战一维卷积(Conv1D):kaggle叶子分类问题 通过例子理解: (1)一维卷积是如何工作的: (2)输入数据是如何构建的: 在csv文件中,数据集或者特征集的保存方式nxm,其中n为样本个数, ...

  6. 自然语言处理——对电影评论的文本情感分析

    题目(来自阿里云天池):数据主要包括IMDB网站上的电影评论文本数据. 数据分为训练数据和测试数据,分别保存在train.csv和test_noLabel.csv两个文件中. 字段说明如下: (1)I ...

  7. python卷积神经网络回归预测_回归[keras]的一维卷积神经网络,做

    在上一篇博客里我介绍了如何利用keras对一个给定的数据集来完成多分类任务. 100%的分类准确度验证了分类模型的可行性和数据集的准确度. 在这篇博客当中我将利用一个稍加修改的数据集来完成线性回归任务 ...

  8. 用keras作CNN卷积网络书本分类(书本、非书本)

    本文介绍如何使用keras作图片分类(2分类与多分类,其实就一个参数的区别...呵呵) 先来看看解决的问题:从一堆图片中分出是不是书本,也就是最终给图片标签上:"书本"." ...

  9. Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积)

    Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积) 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积 ...

最新文章

  1. Python---获取div标签中的文字
  2. 数据库之取出表中最新时间的数据
  3. linux前10ip,检查网口流量与前10名流量大IP
  4. TwentyTwelve透明主题二次美化版
  5. bzoj2038[2009国家集训队]小Z的袜子(hose)
  6. 苹果备忘录怎么调字体大小_苹果手机的备忘录怎么恢复?不知道的快来看看
  7. 顶会ICML特别开设“怼日”Workshop,意见不同您尽管来
  8. The Definitive Guide To Django 2 学习笔记(八) 第四章 模板 (四)基本的模板标签和过滤器...
  9. 测试的第二重境界:站在Bug之上
  10. 测试驱动javascript开发 -- 3.测试驱动开发过程(上)
  11. [转] 文件内容查看 cat,less,more,tail,head,sed
  12. Python实现多重弹窗脚本 整蛊朋友
  13. 超市管理系统连接服务器失败,超市管理系统应用解决超市管理难题
  14. PS教程 | 美女面部剥落碎片效果
  15. 十进制 二进制 十六进制 八进制
  16. 本地上运行正常,但是部署到了服务器却一直验证码错误(Nginx反向代理导致的session丢失问题)
  17. 爬山的蜗牛旅程:java内存结构
  18. hadoop错误DataXceiver error processing WRITE_BLOCK operation
  19. jchdl - RTL实例 - MOS6502 ALU (Verilog)
  20. python第一次作业

热门文章

  1. win10如何截屏_Win10隐藏秘技大公开
  2. Java程序员在用的大数据工具
  3. ANC主动降噪,FFT方案与FxLMS方案比较
  4. MySQL 的 Debezium 连接器-中文版
  5. 阿里云通信发布全新号码认证服务, 重新定义手机号码认证的方式
  6. 学习自我管理和自我营销
  7. 双系统(win10+ubuntu)引导页消失
  8. 2023 新版 微信公众号无限回调系统源码
  9. 远程桌面 多人同时 使用谷歌浏览器
  10. 金九银十进大厂必刷的105道Java面试题(不得不说的秘密)