那么为什么要使用 RNN 呢?不一定要选择循环神经网络,与前馈网络或卷积神经网络相比,它训练和传递新样本的成本相对较高(循环层计算成本较高)。
但是循环网络在记忆能力方面的特殊优势即记住句子中出现过的词,这是进入包括 NLP 或所有其他序列数据的更大世界的起点。
结构:

import numpy as np
import glob
import os
from random import shuffle
from nltk.tokenize import TreebankWordTokenizer
from gensim.models.keyedvectors import KeyedVectors
from nlpia.loaders import get_datafrom keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, SimpleRNN
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)# 向量化及分词器
word_vectors = KeyedVectors.load_word2vec_format('xxx\\googlenews-vectors-negative300.bin.gz',binary=True)# 加载数据
# 文档加载预处理
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 dataset'''
这里有一些信息损失。谷歌新闻的 Word2vec 词汇表中只包含了一部分停用词,
使很多像“a”这样的常用词将在函数处理过程中被丢弃,这个处理不是特别理想,不过大家可
以通过这个方法得到一个信息有损失情况下的卷积神经网络的基线性能。如果想要避免信息损
失,大家可以单独训练 word2vec 模型,以确保有更好的向量覆盖率。另外,数据中还有很多类
似于<br\>的 HTML 标签,它们通常与文本的情感无关,必须从数据中去除。
'''
# 数据分词和向量化的方法
def tokenize_and_vectorize(dataset):tokenizer = TreebankWordTokenizer()vectorized_data = []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 expecteddataset = pre_process_data('xxx\\aclImdb\\train')
# 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:]# RNN 参数
# maxlen 变量用于设置评论的最大长度,
# 需要展开RNN网络 400 次,可能发生梯度消失相关的问题,但是即使这样,这个网络也是非常有效的
maxlen = 400
# 在后向传播误差和更新权重前,向网络输入的样本数量
batch_size = 32
# 词向量的长度
embedding_dims = 300
# 整个训练数据集在网络中的传入次数
epochs = 3# 填充及截断词条序列,长度不够的填充元素为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)# RNN
# 初始化一个空的 Keras 网络
num_neurons = 50
# 标准的分层模型-Sequential()(分层的)模型
model = Sequential()# 神奇的 Keras 处理了组装神经网络的各个复杂环节:我们只需要将想要
# 的循环层添加到我们的网络中
# 添加一个循环层
# 这一层的输出将是一个 400 个元素的向量,其中每个元素都是一个 50 个元素的向量
# return_sequences:True则每个时刻都要返回网络输出,输出为400 个向量,每个向量为 50 维
# return_sequences:False则只返回最后一个时刻的 50 维向量
model.add(SimpleRNN( num_neurons, return_sequences=True,input_shape=(maxlen, embedding_dims)))
# 添加一个 dropout 层
model.add(Dropout(.2))
# 网络层 Flatten()将输入从 400 × 50 的张量扁平化为一个长度为 20 000 个元素的向量
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))# 编译循环神经网络
model.compile('rmsprop', 'binary_crossentropy', metrics=['accuracy'])
# model.summary():用于审察模型内部情况
print(model.summary())# 训练并保存模型
model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))model_structure = model.to_json()
with open("simplernn_model1.json", "w") as json_file:json_file.write(model_structure)
model.save_weights("simplernn_weights1.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."
with open("simplernn_model1.json", "r") as json_file:json_string = json_file.read()
model = model_from_json(json_string)
model.load_weights('simplernn_weights1.h5')
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_classes(test_vec))

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

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

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

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

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

  3. Tensorflow2.*教程之使用Tensorflow Hub 对IMDB电影评论数据集进行文本分类(2)

    使用数据集: IMDB 数据集 库文件: tensorflow tensorflow_hub:用于迁移学习的库和平台 tensorflow_datasets:提供常用数据集 我们使用 Tensorfl ...

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

    为什么在 NLP 分类任务中选择 CNN 呢? 1.CNN神经网络可以像处理图像一样处理文本并"理解"它们 2.主要好处是高效率 3.在许多方面,由于池化层和卷积核大小所造成的限制 ...

  5. 第七章:Tensorflow2.0 RNN循环神经网络实现IMDB数据集训练(理论+实践)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/LQ_qing/article/deta ...

  6. AI:神经网络IMDB电影评论二分类模型训练和评估

    AI:Keras神经网络IMDB电影评论二分类模型训练和评估,python import keras from keras.layers import Dense from keras import ...

  7. 循环神经网络LSTM实现电影情感分类

    循环神经网络LSTM实现电影情感分类 一.数据集: 为了对word embedding这种常用的文本向量化的方法进行巩固,这里我们会完成一个文本情感分类的案例 现在我们有一个经典的数据集IMDB数据集 ...

  8. 改良的用于情感分类的餐馆评论数据集

    改良的用于情感分类的餐馆评论数据集 原数据说明 字段说明 数据集改良 1.只保留 rating列 和comment列 2.数据集去重去空 3.按照rating大小二分类 4.均衡正负向评论 原数据说明 ...

  9. keras lastm循环神经网络训练验证测试

    在keras 上实践,通过keras例子来理解lastm循环神经网络 翻译 2016年12月07日 19:05:19 标签: 神经网络 9341 本文是对这篇博文的翻译和实践:  http://mac ...

最新文章

  1. idea + maven + profile + tomcat 调试 javaee 和js
  2. Zune 3.0与XNA GS 3.0 Beta
  3. Acwing 236. 格鲁吉亚和鲍勃(博弈论妙题)
  4. 二分查找非递归方式实现
  5. java胜任理由_Java在几乎所有方面均能胜任本机响应
  6. @async方法不调用了_在Spring中使用Future对象调用Async方法调用
  7. 【LeetCode笔记】253. 会议室 II(Java、偏数学)
  8. python 描述器 详解_描述器使用指南
  9. Helm 3 完整教程(十二):Helm 函数讲解(6)字典函数
  10. Xshell7免费版下载
  11. vue电商网站后台管理系统模板
  12. 机器学习中,矩阵转置的求导运算
  13. 快速生成文件夹内包含的的所有文件的文件名列表
  14. Debian11 安装Chromium浏览器
  15. Linux下玩转Dota2
  16. mobot_room.world-ROS2Gazebo9附1
  17. redis 删除数据,但是占用内存没有下降原因及解决办法
  18. python通过四个点求球心及球心半径
  19. Swift 3.0中GCD的常用方法
  20. 如何刷纯净线刷包?纯净线刷的教程以及刷机工具

热门文章

  1. 信息学奥赛一本通 1273:【例9.17】货币系统
  2. 一、线性表的顺序存储和基本运算
  3. python终端界面分屏输出_linux命令 - screen/终端分屏命令
  4. VS2010 调试警告 解决方法
  5. js base64 php,php中的base64decode 与js中的互相转换
  6. 实现阿里云物联网平台设备信息到微信小程序分享过程
  7. 【收藏】10个高能黑科技网站
  8. 如何刷一些网站的阅读量
  9. 多边形裁剪(Polygon Clipping) 2
  10. 学习java的第5天