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

news2024/11/26 17:45:14

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

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

  • 【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现
  • 【自然语言处理】情感分析(二):基于 scikit-learn 的 Naive Bayes 实现

本文代码已上传至 我的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)加速学习过程。

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

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

相关文章

web字体和图标 web字体 字体图标

目录web字体和图标web字体字体图标网站图标使用方法(font class 版本(推荐))图标离线使用方法图标使用方法(Unicode 版本)web字体和图标 web字体 用户电脑上没有安装相应字体,强制让用户下载该…

C++动态内存管理:new 和 delete

目录 一.前言 二.new和delete的基本使用 1.new/delete操作内置类型 三.定位new表达式(placement-new) 四.new操作数出现内存申请错误时的处理方式:抛异常 五.new和malloc的区别 一.前言 C沿用了C语言的底层内存管理机制: 然而在动态内存管理方面&am…

Java——三角形最小路径和

题目链接 leetcode在线oj题——三角形最小路径和 题目描述 给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。也就是…

AcWing 1057. 股票买卖 IV(状态机DP)

AcWing 1057. 股票买卖 IV (1)问题 (2)分析 这道题我们首先得明确一点,我们只有一支股票,只是这支股票在不同天有着不同的价格,因此我们可以把天作为单位划分不同的状态。同时这道题中还有一个…

极限存在准则 两个重要极限——“高等数学”

各位uu们你们好呀,今天小雅兰要学习的内容仍然是高等数学,是为:极限存在准则 两个重要极限。那现在就让我们一起进入高等数学的世界吧 引例 夹逼准则 准则Ⅰ 数列的夹逼准则 准则Ⅰ’ 函数的夹逼准则 重要极限Ⅰ 准则Ⅱ 单调有界数列必有极…

Servlet进阶1:Servlet原理

Servlet进阶一、Dispatcher二、doGet、doPost、Service方法的区别1. 三者联系2. 使用规则三、Servlet的生命周期四、Servlet、Servlet容器、Web服务器一、Dispatcher 一个Web App就是由一个或多个Servlet组成的,每个Servlet通过注解说明自己能处理的路径。早期的Se…

FreeRTOS-信号量详解

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:rivencode的个人主页 🔥系列专栏:玩转FreeRTOS 💬保持…

【algorithm】认真讲解前缀和与差分 (图文搭配)

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 📣系列专栏:AcWing算法笔记 今天的月色好美 文章目录前言一、前缀和算法1.1 什么是前缀和?1.2 一维前缀和二、二维前缀和三、一维差分四…

Java---微服务---分布式搜索引擎elasticsearch(1)

分布式搜索引擎elasticsearch(1)1.elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技术?1.1.5.总结1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排1.3.es…

表单标签的使用

1、input标签 场景:在网页中显示收集用户消息的表单效果,如登录页、注册页 通过type属性值的不同,展示不同的效果 type属性值说明text文本框,用于输入单行文本password密码框,用于输入密码radio单选框,用…

检查 malloc 函数返回内容的四个理由

写在前面: 一些开发人员可能对检查不屑一顾:他们故意不检查malloc函数是否分配了内存。他们的推理很简单——他们认为会有足够的记忆。如果没有足够的内存来完成操作,请让程序崩溃。似乎是一个糟糕的事实。 注意。在本文中,mall…

Opencv 之 DNN 与 CUDA综述

Opencv 之 DNN 与 CUDA 目录 Opencv官方手稿(包含各模块API介绍及使用例程) Opencv在github的仓库地址:https://github.com/opencvOpencv额外的测试数据 下载:https://github.com/opencv/opencv_extra #可通过git下载拉取 git c…

【算法练习】删除链表的节点

题源:牛客描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。1.此题对比原题有改动2.题目保证链表中节点的值互不相同3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C 语言&#…

pix2pix(二)训练图像尺寸及分配显卡

背景:新的数据集上,图像的大小为496496,与原尺寸512512不一样,不知道能否直接运行。另外,我们现在有了四张空余显卡服务器,并且新数据集的数据量较大,我们有空余的显卡资源加快训练。 目的&…

C++ 模板

在学习stl之前,我们就已经略微讲解了一些模板的知识,而现在,我们来进一步了解一下模板的相关知识 初步了解 目录 一. 非类型模板参数 二. 模板的特化 全特化 偏特化 三. 模板分离编译 四. 总结 一. 非类型模板参数 模板参数…

C进阶_结构体内存对齐

请看下面的代码&#xff0c;输出结果是多少&#xff1f; #include <stdio.h> int main() {struct S1{char c1;int i;char c2;};printf("%d\n", sizeof(struct S1));struct S2{char c1;char c2;int i;};printf("%d\n", sizeof(struct S2));return 0;…

Xmake v2.7.6 发布,新增 Verilog 和 C++ Modules 分发支持

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量&#xff0c;没有任何依赖&#xff0c;因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建&#xff0c;相比 makefile/CMakeLists.txt&#xff0c;配置语法更加简洁直观&#xff0c;对新手非常友好&#x…

前端CSS学习之路-css002

&#x1f60a;博主页面&#xff1a;鱿年年 &#x1f449;博主推荐专栏&#xff1a;《WEB前端》&#x1f448; ​&#x1f493;博主格言&#xff1a;追风赶月莫停留&#xff0c;平芜尽处是春山❤️ 目录 CSS字体属性 一、字体系列 二、字体大小 三、字体粗细 四、文字样…

Docker安装nacos

首先将自己的服务器在配置上弄成docker的 然后再下方命令框中直接粘贴如下命令&#xff1a; docker run –name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 –restartalways -e JVM_XMS256m -e JVM_XMX256m -e MODEstandalone -v /usr/local/nacos/logs:/home…

基于多协议传感器的桥梁监测数据采集与管理系统设计

文章目录前言1、要求&#xff1a;2、系统框图2.1系统总体框图2.2、stm32通过AHT20采集温湿度框图&#xff1a;2.3、stm32通过modbus协议与上位机通信框图&#xff1a;3、ModBus协议1、协议概述2、Modbus主/从协议原理3、通用Modbus帧结构---协议数据单元(PDU)4、两种Modbus串行…