【自然语言处理】情感分析(四):基于 Tokenizer 和 Word2Vec 的 CNN 实现

news2024/11/27 14:39:28

情感分析(四):基于 Tokenizer 和 Word2Vec 的 CNN 实现

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

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

本文将用 卷积神经网络(Convolutional Neural Networks, C N N CNN CNN)替换上一篇博客中的 L S T M LSTM LSTM L S T M LSTM LSTM循环神经网络(Recurrent Neural Network, R N N RNN RNN)的一种。本文代码已上传至 我的GitHub,需要可自行下载。

1.数据准备

import sys
sys.path.append("..") # Adds higher directory to python modules path.
from NLPmoviereviews.data import load_data
X_train, y_train, X_test, y_test = load_data(percentage_of_sentences=10)

2.基于 Tokenizer 的 CNN 实现

tf.keras.preprocessing.text.Tokenizer 将文本语料库向量化。每个文本被转换为整数序列(每个整数是字典中标记的索引)或转换为向量,其中每个标记的系数可以是二进制的(如:One-Hot),基于数量统计的(如:BOW),基于 TF-IDF 的……

默认情况下会删除所有标点符号,文本被转换为以空格分隔的单词序列(单词可能包含 ' 字符)。然后将这些序列分成标记列表,再将它们索引或矢量化。 0 0 0 是保留索引,不会分配给任何单词。

from tensorflow.keras.preprocessing.text import Tokenizer

# This initializes a Keras utilities that does all the tokenization for you
tokenizer = Tokenizer()

# The tokenization learns a dictionary that maps a token (integer) to each word
# It can be done only on the train set - we are not supposed to know the test set!
# This tokenization also lowercases your words, apply some filters, and so on - you can check the doc if you want
tokenizer.fit_on_texts(X_train)
    
# We apply the tokenization to the train and test set
X_train_token = tokenizer.texts_to_sequences(X_train)
X_test_token = tokenizer.texts_to_sequences(X_test)

vocab_size=len(tokenizer.word_index)

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

from tensorflow.keras.preprocessing.sequence import pad_sequences

X_train_pad = pad_sequences(X_train_token, dtype=float, padding='post', maxlen=150)
X_test_pad = pad_sequences(X_test_token, dtype=float, padding='post', maxlen=150)

X_train_pad.shape, y_train.shape, X_test_pad.shape, y_test.shape

在这里插入图片描述

from tensorflow.keras import models, layers

embedding_size=100

model_cnn = models.Sequential()
model_cnn.add(layers.Embedding(input_dim=vocab_size+1, output_dim=embedding_size, mask_zero=True, input_length=150))
model_cnn.add(layers.Conv1D(20, kernel_size=3, activation='relu'))
model_cnn.add(layers.Flatten())
model_cnn.add(layers.Dense(10, activation="relu"))
model_cnn.add(layers.Dense(1, activation="sigmoid"))

model_cnn.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

Embedding:嵌入层。一种比 One-Hot 更加有效的对离散特征进行编码的方法。一般用于将输入中的单词映射为稠密向量。嵌入层的参数需要学习。

在本模型中,Embedding 层参数:input_dimvocab_size + 1 1 1output_dim 是嵌入空间维度,mask_zero 必须设置为 True。在这里,出于计算原因,将 input_length 设置为您观察的最大长度(您刚刚在上一个问题中定义)。更多参数如下:

  • input_dim:int > > > 0 0 0。词汇表大小, 即最大整数 index + 1 1 1
  • output_dim:int > = >= >= 0 0 0。词向量的维度。
  • embeddings_initializer:embeddings 矩阵的初始化方法(keras.initializers)。
  • embeddings_regularizer:embeddings 矩阵的正则化方法(keras.regularizers)。
  • embeddings_constraint:embeddings 矩阵的约束函数(keras.constraints)。
  • mask_zero:是否把 0 0 0 看作为一个应该被遮蔽的特殊的 padding 值。 这对于可变长的 循环神经网络层 十分有用。 如果设定为 True,那么接下来的所有层都必须支持 masking,否则就会抛出异常。 如果 mask_zeroTrue,作为结果,索引 0 0 0 就不能被用于词汇表中 (input_dim 应该与 vocabulary + 1 1 1 大小相同)。
  • input_length:输入序列的长度,当它是固定的时。 如果你需要连接 FlattenDense 层,则这个参数是必须的(没有它,dense 层的输出尺寸就无法计算)。

Conv1D:普通一维卷积,常用于文本,内核的大小恰好对应于每个内核正在考虑的并排单词(标记)的数量。参数个数 = 输入通道数 × 卷积核尺寸(如 3 3 3) × 卷积核个数。

Flatten:平展层,用于将多维张量压成一维。

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

model_cnn.summary()

在这里插入图片描述

使用 早停法EarlyStopping)拟合模型,并根据测试数据对其进行评估。

from tensorflow.keras.callbacks import EarlyStopping

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

model_cnn.fit(X_train_pad, y_train, 
          epochs=20, 
          batch_size=32,
          validation_split=0.3,
          verbose=0,
          callbacks=[es]
         )


res = model_cnn.evaluate(X_test_pad, y_test, verbose=0)

print(f'The accuracy evaluated on the test set is of {res[1]*100:.3f}%')

在这里插入图片描述

3.基于 Word2Vec 的 CNN 实现

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

在这里插入图片描述

word2vec=api.load('glove-wiki-gigaword-100')
from NLPmoviereviews.utilities import padding

X_train_pad = padding(word2vec, X_train, maxlen=150)
X_test_pad = padding(word2vec, X_test, maxlen=150)

X_train_pad.shape, y_train.shape, X_test_pad.shape, y_test.shape

在这里插入图片描述

from tensorflow.keras import models, layers
from tensorflow.keras.optimizers import Adam
from tensorflow.keras import regularizers

reg_l1 = regularizers.l1(0.001)
reg_l1l2 = regularizers.L1L2(l1=0.005, l2=0.005)

model = models.Sequential()
model.add(layers.Masking(mask_value=0, input_shape=(150,100)))
model.add(layers.Conv1D(16, kernel_size=3, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(32, kernel_size=2, activation='relu', kernel_regularizer=reg_l1))
model.add(layers.Dropout(0.5))
model.add(layers.Flatten())
model.add(layers.Dense(10, activation="relu", activity_regularizer=reg_l1l2))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation="sigmoid"))

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

tf.keras.regularizers 提供的内置类如下:

在这里插入图片描述

model.summary()

在这里插入图片描述

from tensorflow.keras.callbacks import EarlyStopping

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

history = model.fit(X_train_pad, y_train, 
          epochs=200, 
          batch_size=64,
          validation_split=0.3,
          verbose=0,
          callbacks=[es]
         )


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}%')

在这里插入图片描述

import matplotlib.pyplot as plt

plt.subplots(figsize=(10, 8))
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.show()

在这里插入图片描述


如果我们的模型非常适合任务,那么最简单和最快的模型能以与复杂的预训练模型相当的精度完成相同的任务。

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

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

相关文章

服务发现Discovery和Eureka自我保护机制

目录 一、服务发现Discovery ​二、Eureka自我保护 (一)故障现象 (二)导致原因 (三)怎么禁止自我保护 三、Eureka2.0的停更 一、服务发现Discovery 对于注册进eureka里面的微服务,可以通…

外挂、破解软件理论与实战

外挂、破解软件理论与实战 1 理论 1.1 不同操作系统下的可执行文件 Windows【PE】 PE 格式,可移植可执行格式(Portable Executable), 是 Windows 下的主要可执行文件格式。别被名字迷惑了,PE 文件必须是 Windows 下…

第四十六章 动态规划——状态机模型

第四十六章 动态规划——状态机模型一、通俗理解状态机DP1、什么是状态机2、什么是状态机DP二、例题1、AcWing 1049. 大盗阿福(1)问题(2)分析a.状态定义b.状态转移c.循环设计d.初末状态(3)代码2、AcWing 10…

C++学习/温习:新型源码学编程(三)

写在前面(祝各位新春大吉!兔年如意!) 【本文持续更新中】面向初学者撰写专栏,个人原创的学习C/C笔记(干货)所作源代码输出内容为中文,便于理解如有错误之处请各位读者指正请读者评论回复、参与投票&#xf…

01 课程简介、HTML标签【尚硅谷JavaWeb教程】

1. 课程体系设计 2. HTML标签 服务器—浏览器&#xff08;字符串"" &#xff09; demo01.html 1&#xff09;html语言是解释型语言&#xff0c;不是编译型 浏览器是容错的 2&#xff09;html页面中由一对标签组成&#xff1a; < html>称为 开始标签 < /htm…

Java基础语法——数组概念、数组内存图解(一个数组、二个数组)及二元数组的应用

目录 数组概述 数组定义格式 数组概念 数组的定义格式 数组的初始化 数组初始化概述 数组的初始化方式 Java中的内存分配 Java中一个数组的内存图解 Java中二个数组的内存图解 两个数组指向同一个地址的内存图解 数组操作中两个常见的小问题 二维数组 二维数组概述…

c++11 标准模板(STL)(std::forward_list)(十一)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

前端架构处理Cookie、Session、Token

1. Cookie Cookie 总是保存在客户端中。按在客户端中的存储位置&#xff0c;可分为内存 Cookie 和硬盘 Cookie。 内存 Cookie 由浏览器维护&#xff0c;保存在内存中&#xff0c;浏览器关闭后就消失了&#xff0c;其存在时间是短暂的。硬盘 Cookie 保存在硬盘里&#xff0c;…

Spring Boot、Spring MVC热部署

一、相关概述 JVM能够识别的是字节码.class文件每次重新运行都是一个重新编译的过程&#xff0c;也就是说会生成新的target字节码文件&#xff1b;但是每次修改了代码之后也必须要重新运行&#xff0c;这样比较麻烦。热部署就能较好地解决该问题&#xff0c;直接刷新页面就可以…

(22)go-micro微服务kibana使用

文章目录一 kibana介绍二 Kibana主要功能三 Kibana侧边栏四 Kibana安装1.拉取镜像2.运行命令3.查看是否运行五 Kibana使用六 Kibana图形化界面七 最后一 kibana介绍 Kibana &#xff1a;是一个开源的分析和可视化平台&#xff0c;旨在与 Elasticsearch 合作。Kibana 提供搜索、…

初识Nonebot2

文章目录什么是nonebot2&#xff1f;机器人工作流程WebSocket协议OneBot标准Nonebot2框架工作路径什么是nonebot2&#xff1f; 关于NoneBot2&#xff0c;我们先来引用一下官方文档的描述 NoneBot2是一个可扩展的 Python 异步机器人框架&#xff0c;它会对机器人收到的事件进行…

创建进度条 tqdm模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 创建进度条 tqdm模块 选择题 以下python代码最后输出错误的一项是? from tqdm import tqdm import time text{loss:0.2,learn:0.8} print(【开始执行】) for i in tqdm(range(50)…

python图像处理(图像缩放)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 图像缩放也是isp处理的一个基本功能。现在的camera像素越来越大,但是显示设备的分辨率是一定的,如果想把图像显示在显示器或者lcd上面,那就要符合对应显示设备的分辨率。一般来说…

【数据结构与算法理论知识点】5、图与贪心算法

5、图与贪心算法 逻辑结构 5.1、图的定义和术语 图&#xff1a;Graph(V,E) V:顶点&#xff08;数据元素&#xff09;的有穷非空集合&#xff1b; E:边的有穷集合。 **无向图:**每条边都是无方向的 有向图:每条边都是有方向的 完全图:任意两个点都有一条边相连 稀疏图:有很…

SSM 农产品销售管理系统

SSM 农产品销售管理系统 SSM 农产品销售管理系统 功能介绍 首页 用户登录注册 图片轮播 最新上架 农产资讯 产品商城 产品详情 在线留言 加入购物车 提交购买 评论 收藏 系统简介 系统公告 关于我们 友情链接 后台管理 登录 系统用户管理 修改密码 用户权限管理 产品信息管理…

Hadoop基础之《(4)—Yarn概述》

一、什么是Yarn YARN&#xff08;Yet Another Resource Negotiator&#xff09;&#xff0c;简称YARN&#xff0c;另一种资源协调者&#xff0c;是Hadoop的资源管理器。 二、Yarn的组成 Yarn有两个核心组件&#xff0c;ResourceManager和NodeManager。 1、ResourceManager&am…

UE Operation File [ Read / Write ] DTOperateFile 插件说明

蓝图直接操作文件的功能节点 可以获取文件基本信息以及读写文件 目录 1. File Exists 2. File Size 3. File Delete 4. File Is Read Only 5. File Move 6. File Save By String 7. File Save By Array String 8. File Save By Array Binary 9. File Append By Strin…

Jenkins(一):什么是Jenkins?

目录 一、Jenkins是什么&#xff1f; 二、安装步骤 1.访问官网&#xff0c;下载安装包 2.解锁Jenkins 3.设置Jenkins的工作目录&#xff08;可选&#xff09; 总结 前言 近期在研究自动化部署&#xff0c;在这里对Jenkins做个笔记。 一、Jenkins是什么&#xff1f; Jenk…

数据挖掘,计算机网络、操作系统刷题笔记36

数据挖掘&#xff0c;计算机网络、操作系统刷题笔记36 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;orac…

泊松过程与排队论

全国同理:随机过程随机会过 ......唉 你说热统,他为什么要搭配着随机过程一起学 ......唉 你说数模比赛 为什么不能白送一个奖牌小摘要泊松过程泊松过程来到间隔与等待时间的分布来到时刻的条件分布M/G/1 忙期非齐次泊松过程复合泊松过程条件泊松过程排队系统输入常见的输入分布…