【自然语言处理】情感分析(三):基于 Word2Vec 的 LSTM 实现

2023-11-08

情感分析(三):基于 Word2Vec 的 LSTM 实现

本文是 情感分析 系列的第 3 3 3 篇,前两篇分别是:

本文代码已上传至 我的GitHub,需要可自行下载。

1.数据准备

import sys
sys.path.append("..") # Adds higher directory to python modules path.
from NLPmoviereviews.data import load_data

load_data 函数有一个 percentage_of_sentences 参数。如果一开始就使用全量数据集可能会使计算速度变慢,甚至可能导致 RAM 溢出。因此,应该从 10 % 10\% 10% 的句子开始,看看计算机是否能处理它。否则,以较小的比例重新运行。

X_train, y_train, X_test, y_test = load_data(percentage_of_sentences=10)

2.基线模型

基线是非常基本的模型或解决方案。通常会创建一个基线,然后尝试制作更复杂的解决方案,以获得更好的结果。

我们的基线可以是预测 y_train 中出现最多的标签(如果数据集是平衡的,则基线精度为 1 / n 1/n 1/n,其中 n n n 是类的数量,此处为 2 2 2)。

import pandas as pd
pd.Series(y_test).value_counts()

在这里插入图片描述

baseline_accuracy=1/2
print(f'Baseline accuracy on the test set : {baseline_accuracy:.2f}')

在这里插入图片描述

3.Word2Vec

Gensim 在数据存储库中附带了几个已经预训练的模型:

from gensim.models import Word2Vec
import gensim.downloader as api
print(list(api.info()['models'].keys()))

在这里插入图片描述
对这一块不太理解的可以查看我的这篇博客:【自然语言处理】Gensim中的Word2Vec

加载其中一个预训练的 Word2Vec 嵌入空间。(glove-wiki-gigaword-100 约 128MB 大小)

word2vec_transfer=api.load('glove-wiki-gigaword-100')

默认的存储路径如下所示:

在这里插入图片描述
X_trainX_test 进行嵌入。

import numpy as np
from NLPmoviereviews.utilities import padding

看一下 padding 的实现过程。

为了实现的简便,keras 只能接受长度相同的序列输入。因此,如果目前序列长度参差不齐,这时需要使用 pad_sequences。该函数是将序列转化为经过填充以后的一个长度相同的新序列新序列。

from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np


# 将句子(单词列表)转换为表示嵌入空间中单词的矩阵
def embed_sentence_with_TF(word2vec, sentence):
    """
    Function to convert a sentence (list of words) into a matrix representing the words in the embedding space
    """
    embedded_sentence = []
    for word in sentence:
        if word in word2vec:
            embedded_sentence.append(word2vec[word])

    return np.array(embedded_sentence)


# 将句子列表转换为矩阵列表
def embedding(word2vec, sentences):
    """
    Function that converts a list of sentences into a list of matrices
    """
    embed = []

    for sentence in sentences:
        embedded_sentence = embed_sentence_with_TF(word2vec, sentence)
        embed.append(embedded_sentence)

    return embed


def padding(word2vec, X, maxlen):
    X_embed = embedding(word2vec, X)
    X_pad = pad_sequences(X_embed, dtype='float32', padding='post', maxlen=maxlen)
    return X_pad
X_train_pad = padding(word2vec_transfer, X_train, maxlen=200)
X_test_pad = padding(word2vec_transfer, X_test, maxlen=200)
X_train_pad.shape, y_train.shape, X_test_pad.shape, y_test.shape

在这里插入图片描述
X_train_padX_test_pad 进行以下测试:

  • 它们是 numpy 数组
  • 它们是 3 3 3 维的
  • 最后一个维度是 Word2Vec 嵌入空间的大小(可以用 word2vec.wv.vector_size 得到)
  • 第一个维度是 X_trainX_test 的大小
# TEST
for X in [X_train_pad, X_test_pad]:
    assert type(X) == np.ndarray
    assert X.shape[-1] == word2vec_transfer.vector_size


assert X_train_pad.shape[0] == len(X_train)
assert X_test_pad.shape[0] == len(X_test)

4.RNN Model:LSTM

如果你此前不了解 LSTM(Long Short-Term Memory),可以查看我的这篇博客【神经网络】图解LSTM和GRU。在我们构建神经网络之前先来了解几个概念。

当我们训练深度学习神经网络的时候通常希望能获得最好的泛化性能(generalization performance,即可以很好地拟合数据)。但是所有的标准深度学习神经网络结构如全连接多层感知机都很容易过拟合:当网络在训练集上表现越来越好,错误率越来越低的时候,实际上在某一刻,它在测试集的表现已经开始变差。

EarlyStopping(早停法)是 callbacks 的一种,callbacks 用于指定在每个 epoch 开始和结束的时候进行哪种特定操作。callbacks 中有一些设置好的接口,可以直接使用,如 accval_acclossval_loss等等。

EarlyStopping 则是用于提前停止训练的 callbacks。具体地,可以达到当训练集上的 l o s s loss loss 不再减小(即减小的程度小于某个阈值)的时候停止继续训练。使用 EarlyStopping 也可以加快学习的速度,提高调参效率。

tensorflow.keras.optimizers 提供了以下几种内置优化器类:AdadeltaAdagradAdamAdamaxFtrlNadamOptimizerRMSpropSGD

keras.layers.Masking(mask_value=0.0) 是用于对值为指定值的位置进行掩蔽的操作,以忽略对应的 timestep。在输入张量的每个时刻(即输入张量的第一个维度),如果输入张量在这一时刻的所有值都等于指定的 mask_value,那么这一时刻将会在接下来的下游层都会被跳过(只要其支持 masking 操作)。如果下游层不支持 masking 操作,那么就会报错。

Bidirectional:双向循环网络包装器。可以将 LSTMGRU 等层包装成双向循环网络。从而增强特征提取能力。

Dropout:随机置零层。训练期间以一定几率将输入置 0 0 0,一种正则化手段。

Dense:密集连接层。参数个数 = 输入层特征数 × 输出层特征数(weight)+ 输出层特征数(bias

model.compile 方法用于在配置训练方法时,告知训练时用的 优化器损失函数准确率评测标准

from tensorflow.keras import models, layers
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.optimizers import RMSprop, Adam, SGD

if 'model' in globals():
    del model

model = models.Sequential()  # 线性堆叠网络
model.add(layers.Masking(mask_value=0, input_shape=(200,100)))
model.add(layers.Bidirectional(layers.LSTM(200, activation='tanh')))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(100, activation="relu"))
model.add(layers.Dense(20, activation="relu"))
model.add(layers.Dense(1, activation="sigmoid"))

model.compile(loss='binary_crossentropy', optimizer=Adam(learning_rate=0.00001), metrics=['accuracy'])

对整个网络结构进行一个简单的可视化。(注意 tensorflow 版本,本处是 2.0 2.0 2.0

import tensorflow as tf
tf.keras.utils.plot_model(model, show_shapes=True, show_layer_names=True, rankdir="TB",expand_nested=True, dpi=200)

在这里插入图片描述

es = EarlyStopping(patience=15, restore_best_weights=True, verbose=1)

EarlyStopping 参数的含义:

在这里插入图片描述

# Fit the model on the train data
history = model.fit(X_train_pad, y_train,
                    validation_split=0.2,
                    epochs = 180,
                    batch_size = 64, 
                    verbose = 0, 
                    callbacks = [es])

在这里插入图片描述
拟合的时间可能比较长。

5.预测

res = model.evaluate(X_test_pad, y_test, verbose=0)
print(f'The accuracy evaluated on the test set is of {res[1]*100:.3f}%')

在这里插入图片描述

6.绘制拟合曲线

import matplotlib.pyplot as plt

f, (ax1, ax2) = plt.subplots(1, 2, figsize=(18, 8))

ax1.plot(history.history['loss'], label = 'train')
ax1.plot(history.history['val_loss'], label = 'val')
#ax1.set_ylim(0., 0.5)
ax1.set_title('loss')
ax1.legend()

ax2.plot(history.history['accuracy'], label='train accuracy')
ax2.plot(history.history['val_accuracy'], label='val accuracy')
#ax2.set_ylim(0., 0.015)
ax2.set_title('accuracy')
ax2.legend()

在这里插入图片描述


本文提供了一个基线模型,其实可以进一步进行优化,比如利用 C L R CLR CLR(Cyclical Learning Rates for Training Neural Networks, Leslie N. Smith 2017)加速学习过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【自然语言处理】情感分析(三):基于 Word2Vec 的 LSTM 实现 的相关文章

  • 给定单词向量(而不是单词本身),获取最相似的单词

    使用gensim models Word2Vec库 您可以提供一个模型和一个 单词 您希望找到最相似单词的列表 model gensim models Word2Vec load word2vec format model file bin
  • 在 Word2Vec 中合并预训练模型?

    我已经下载了 1000 亿字的 Google 新闻预训练矢量文件 除此之外 我还在训练自己的 3GB 数据 生成另一个预训练的矢量文件 两者都有 300 个特征维度和超过 1GB 的大小 我如何合并这两个巨大的预训练向量 或者我如何训练一个
  • 使用 word2vec 的二元组向量表示

    我想使用 word2vec 工具构建文档的词嵌入 我知道如何找到与单个单词 一元组 相对应的向量嵌入 现在 我想找到二元组的向量 是否可以使用 word2vec 构建二元词嵌入 如果是 怎么办 以下代码片段将为您提供二元组的向量表示 请注意
  • 嵌入层 Keras 的可变长度输入

    我有一个可变大小的文本语料库 我正在尝试使用 keras 中的嵌入层将文本输入 LSTM 模型 我的代码看起来像这样 import numpy as np from keras layers import Embedding Input L
  • 深度好文:最全的大模型 RAG 技术概览

    本文是对检索增强生成 Retrieval Augmented Generation RAG 技术和算法的全面研究 对各种方法进行了系统性的梳理 涉及了 RAG 流程中的数据拆分 向量化 查询重写 查询路由等等 在做 RAG 的小伙伴一定知道
  • 用通俗易懂的方式讲解:图解 Transformer 架构

    文章目录 用通俗易懂方式讲解系列 1 导语 2 正文开始 现在我们开始 编码 从宏观视角看自注意力机制 从微观视角看自注意力机制 通过矩阵运算实现自注意力机制
  • LSTM中的input_shape和batch_input_shape有什么区别

    这只是设置同一事物的不同方式还是它们实际上具有不同的含义 和网络配置有关系吗 在一个简单的例子中 我无法观察到以下之间的任何区别 model Sequential model add LSTM 1 batch input shape Non
  • Keras One Hot 编码内存管理 - 最好的出路

    我知道这个问题已经以不同的方式得到了解答past https stackoverflow com questions 41058780 python one hot encoding for huge data 但我无法弄清楚并适合我的代码
  • 张量流中 LSTM 的正则化

    Tensorflow 提供了一个很好的 LSTM 包装器 rnn cell BasicLSTM num units forget bias 1 0 input size None state is tuple False activatio
  • 了解 Tensorflow LSTM 模型输入?

    我在理解 TensorFlow 中的 LSTM 模型时遇到一些困难 我用tflearn http tflearn org 作为包装器 因为它自动完成所有初始化和其他更高级别的工作 为了简单起见 我们考虑这个示例程序 https github
  • Tensorflow 2.2.0 错误:[预测必须 > 0] [条件 x >= y 不满足元素方向:] 使用双向 LSTM 层时

    在处理命名实体识别任务时 我收到以下错误消息 tensorflow python framework errors impl InvalidArgumentError assertion failed predictions must be
  • 为什么 Gensim doc2vec 给出 AttributeError: 'list' object has no attribute 'words'?

    我正在尝试使用以下代码来实验 gensim doc2vec 据我从教程中了解到 它应该有效 然而它给出了属性错误 列表 对象没有属性 单词 from gensim models doc2vec import LabeledSentence
  • 将 CNN 的输出传递给 BILSTM

    我正在开发一个项目 其中我必须将 CNN 的输出传递给双向 LSTM 我创建了如下模型 但它抛出 不兼容 错误 请让我知道哪里出了问题以及如何解决这个问题 model Sequential model add Conv2D filters
  • 在 Keras 中使用 Subtract 层

    我正在 Keras 中实现所描述的 LSTM 架构here http nlp cs rpi edu paper multilingualmultitask pdf 我认为我已经非常接近了 尽管我在共享层和特定语言层的组合方面仍然存在问题 这
  • 为什么我的 keras LSTM 模型陷入无限循环?

    我正在尝试构建一个小型 LSTM 它可以通过在现有 Python 代码上进行训练来学习编写代码 即使是垃圾代码 我已将数百个文件中的数千行代码连接到一个文件中 每个文件以
  • H2O 是否或将会提供任何与 h2o word2vec 一起使用的预训练向量?

    H2O 最近在其 API 中添加了 word2vec 能够在您自己提供的语料库上轻松训练自己的词向量真是太好了 然而 使用大数据和大型计算机存在更大的可能性 由于网络带宽和计算能力的限制 谷歌或 H2O ai 等软件供应商可能无法访问这种类
  • 如何将单词和向量手动添加到Word2vec gensim?

    比方说 word2vec模型是我训练过的 word2vec 模型 当词汇表之外的单词 oov word 发生时 我计算一个向量vec using 计算向量 oov word 方法 现在 我想添加 追加oov word及其对应的向量vec到我
  • 如何使用 word2vec 找到与向量最接近的单词

    我刚刚开始使用 Word2vec 我想知道如何找到最接近向量的单词 我有这个向量 它是一组向量的平均向量 array 0 00449447 0 00310097 0 02421786 dtype float32 有没有一种直接的方法可以在我
  • 将 word2vec 模型查询的结果保存在 csv 文件中?

    我正在语料库上训练 word2vec 模型 然后查询该模型 这工作正常 但我正在运行一个实验 需要针对不同的条件调用模型 保存每个条件的模型 查询每个条件的模型 然后将查询的输出保存到 csv 文件中 例如进一步分析所有条件 我研究了 ge
  • Caffe 的 LSTM 模块

    有谁知道 Caffe 是否有一个不错的 LSTM 模块 我从 russel91 的 github 帐户中找到了一个 但显然包含示例和解释的网页消失了 以前是http apollo deepmatter io http apollo deep

随机推荐

  • 代理模式 【设计模式之禅作者】

    代理模式 12 1 我是游戏至尊 2007年 感觉很无聊 于是就玩了一段时间的网络游戏 游戏名就不说了 要不就有做广告的嫌疑 反正就是打怪 升级 砍人 被人砍 然后继续打怪 升级 打怪 升级 我花了两个月的时间升级到80级 已经很有成就感了
  • Leetcode每日一题:57. 插入区间

    原题 给你一个 无重叠的 按照区间起始端点排序的区间列表 在列表中插入一个新的区间 你需要确保列表中的区间仍然有序且不重叠 如果有必要的话 可以合并区间 示例 1 输入 intervals 1 3 6 9 newInterval 2 5 输
  • 00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问(kafka)

    产生此问题的原因 在window下使用kafka导致 在linux下使用kafka没有此问题 window下kafka报错 linux下kafka正常
  • 文本挖掘学习笔记(二):文档信息向量化与主题关键词提取

    注 学习笔记基于文彤老师文本挖掘的系列课程 全文基于 射雕英雄传 语料库 下面是读入数据的一个基于Pandas的通用操作框架 读入为数据框 import pandas as pd from matplotlib import pyplot
  • element表格复选框,弹框关闭取消选择

    弹框表格复选框清空 this nextTick gt this refs tabledata clearSelection
  • 面向工业物联网的拍赫兹通信

    摘要 相比于传统无线射频通信 拍赫兹通信 PetaCom petahertz communication 具有高速率 低时延和高确定性等显著优势 在工业物联网 IIoT industrial internet of things 中可以发挥
  • [1178]数据库like和rlike区别

    like 通配符 使用时需指定具体值 如 用like筛选某张表姓张的人全部信息 或名字叫张三的信息 张或张三就必须写为具体值 sql语法的 模糊匹配 通配符 代表零个或任意字符 代表1个字符 rlike 正则 模糊查询 区间范围判断 如 用
  • 链表问题处理

    今天主要是对一些链表相关问题的理解和处理 下面所有问题处理的都是这种链表 struct ListNode int val struct ListNode next 话不多说 我直接进入正题 1 删除链表中等于给定值 val 的所有节点 给你
  • 【音效处理】Reverb 混响算法简介

    系列文章目录 Delay Line 简介及其 C C 实现 LFO 低频振荡器简介及其 C C 实现 音效处理 Delay Echo 简介 音效处理 Vibrato 简介 文章目录 系列文章目录 一 混响 二 人工混响 三 数字混响算法 3
  • 最大化TensorFlow* CPU性能

    用户可以在v2 5之后的官方x86 64 TensorFlow 设置环境变量TF ENABLE ONEDNN OPTS 1来启用这些CPU优化 export TF ENABLE ONEDNN OPTS 1 大多数建议都适用于官方x86 64
  • 在有NVIDIA显卡的机器上安装Ubuntu 18.04 LTS的一些建议

    在装有NVIDIA显卡的机器上安装Ubuntu 18 04 LTS的一些建议 如果安装途中出现问题 导致不能正常进入系统 请看以下步骤 一 编辑Grub Ubuntu的引导程序 二 root下更改 三 重启进入系统 下载驱动 如果安装途中出
  • Raven2渗透

    1 实训目的 通过此次实验来学习对Raven2的渗透 Raven 2是中级boot2root VM 有四个要捕获的标志 在多次破坏之后 Raven Security采取了额外的措施来加固其Web服务器 以防止黑客 找到四个flag 学习一些
  • /etc/login.defs配置文件详解

    etc login defs 文件是用来定义创建用户时需要的一些用户配置信息 如创建用户时 是否需要家目录 UID和GID的范围 用户及密码的有效期限 家目录的权限 密码加密方式等等
  • SpringBoot开发使用篇(2)—数据层解决方案

    目录 一 数据层解决方案 1 1 SQL 1 1 1 数据源配置 Hikari 1 1 2 持久化技术 JdbcTemplate 1 1 3 H2数据库 1 2 NoSQL 1 2 1 Redis 1 2 2 Mongodb 1 2 3 E
  • 链式法则

    2个事件同时发生的概率 P a b P a b P b 其中 P a b 表示 a和b事件同时发生的概率 P a b 是一个条件概率 表示在b事件发生的条件下 a发生的概率 3个事件的概率链式调用 P a b c P a b c P b c
  • 三、Linux网络编程:Socket编程-网络模型

    3 Socket编程 网络模型 3 1 OSI七层模型 图解 每层的功能 模型 功能 物理层 比特流传输 数据链路层 网络控制 链路纠错 网络层 寻址 路由 传输层 建立主机端到端的连接 会话层 建立 维护和管理会话 表示层 格式转化 加密
  • 解决sqlplus /as sysdba登陆oracle无效

    安装完oracle 然后执行完下面的自动配置脚本后 没有任何地方设置过密码 etc init d oracledb ORCLCDB 19c configure 在这个命令执行完成后 会提醒查看完整日志的地方 Look at the log
  • C语言100例 第一天习题练习

    C语言中基本的输入与输出 例题1 输入两个正整数a和b 输出a b的值 其中a b 10000 include
  • Centos7 开机卡死在桌面

    问题 Centos7 开机死卡成了这样 一动不动 如下图 原因 一般来说是一些开机自启的东西使得Centos卡死 有可能是在 etc rc d rc local文件里加入的脚本 也有可能 etc fstab文件里面自动挂载的硬盘 解决方法
  • 【自然语言处理】情感分析(三):基于 Word2Vec 的 LSTM 实现

    情感分析 三 基于 Word2Vec 的 LSTM 实现 本文是 情感分析 系列的第 3 3 3 篇 前两篇分别是 自然语言处理 情感分析 一 基于 NLTK 的 Naive Bayes 实现 自然语言处理 情感分析 二 基于 scikit