【自然语言处理】情感分析(五):基于 BERT 实现

news2024/11/16 9:21:48

情感分析(五):基于 BERT 实现

本文是 情感分析 系列的第 5 5 5 篇,也是本系列的收官之作。前四篇分别是:

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

即使大家没用过 BERT(Bidirectional Encoder Representation from Transformers),相信对它在自然语言处理任务中的优越表现也早已有所耳闻。本篇博客将重点介绍 BERT 是如何助力情感分析的。工欲善其事必先利其器,在正式开始之前,先介绍几个要用到的包。

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

1.相关包介绍

1.1 TensorFlow Official Models

TensorFlow Official Models 是使用 TensorFlow 高级 API 的模型集合。比如,它提供了多种 预训练语言模型(Pre-trained Language Model),如下表所示:

模型参考(论文)
ALBERTALBERT: A Lite BERT for Self-supervised Learning of Language Representations
BERTBERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
ELECTRAELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators

安装时,TensorFlow Official Models 需要与 TensorFlow 的版本匹配。例如,TensorFlow-models v2.8.xTensorFlow v2.8.x 兼容。TensorFlow 的版本不低于 2.2,Python 版本 3.7+。更多安装详情请参阅官方文档。

pip install tf-models-official

1.2 TensorFlow Text

TensorFlow Text 为您提供一系列丰富的操作和库,帮助您处理文本形式的输入,例如原始文本字符串或文档。这些库可以执行基于文本的模型经常需要进行的预处理,并且包含对序列建模非常有用的其他功能。

pip install -U tensorflow-text==<version>

在这里插入图片描述
使用示例

import tensorflow as tf
import tensorflow_text as tf_text

def preprocess(vocab_table, example_text):

	# Normalize text
    tf_text.normalize_utf8(example_text)

    # Tokenize into words
    word_tokenizer = tf_text.WhitespaceTokenizer()
    tokens = word_tokenizer.tokenize(example_text)

    # Tokenize into subwords
    subword_tokenizer = tf_text.WordpieceTokenizer(lookup_table, token_out_type=tf.int64)
    subtokens = subword_tokenizer.tokenize(tokens).merge_dims(1, -1)

    # Apply padding
    padded_inputs = tf_text.pad_model_inputs(subtokens, max_seq_length=16)
    
    return padded_inputs

1.3 TensorFlow Hub

TensorFlow Hub 是一个包含经过训练的机器学习模型的代码库,这些模型稍作调整便可部署到任何设备上。您只需几行代码即可重复使用经过训练的模型,例如 BERT 和 Faster R-CNN。

pip install --upgrade tensorflow_hub

使用示例

nnlm-en-dim128:在英语 Google 新闻 200B 语料库上训练的基于标记的文本嵌入。

import tensorflow_hub as hub

model = hub.KerasLayer("https://tfhub.dev/google/nnlm-en-dim128/2")
embeddings = model(["The rain in Spain.", "falls","mainly", "In the plain!"])

print(embeddings.shape)  # (4,128)

2.基于 BERT 的情感分析实战

import os
import shutil

import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_text as text
from official.nlp import optimization  # to create AdamW optimizer

数据集:Large Movie Review Dataset

这是一个用于二元情感分类的数据集,包含比以前的基准数据集多得多的数据。我们提供了一组 25000 25000 25000 条极性电影评论用于训练, 25000 25000 25000 条用于测试,还有其他未标记的数据可供使用。提供了原始文本和已经处理过的词袋格式。

url = 'https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz'

dataset = tf.keras.utils.get_file('aclImdb_v1.tar.gz', url, untar=True, cache_dir='.', cache_subdir='')

dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb')

train_dir = os.path.join(dataset_dir, 'train')

# remove unused folders to make it easier to load the data
remove_dir = os.path.join(train_dir, 'unsup') # 解压缩后,会有一个 unsup 文件夹。因后续未用到,故删除之
shutil.rmtree(remove_dir) # 递归删除文件夹下的所有子文件夹和子文件

在这里插入图片描述
接下来,构造训练、验证、测试数据集。

tf.keras.utils.text_dataset_from_directory:从目录中的文本文件生成 tf.data.Dataset

  • batch_size:数据批次的大小,默认值为 32 32 32。如果为 None,则不会对数据进行批处理(数据集将产生单个样本)。
  • validation_split:介于 0 0 0 1 1 1 之间的可选浮点数,保留用于验证的数据部分。
  • subset:要返回的数据的子集。 “训练”、“验证” 或 “两者” 之一。仅在设置了 validation_split 时使用。当 subset=“both” 时,程序返回两个数据集(分别是训练和验证数据集)的元组。
AUTOTUNE = tf.data.AUTOTUNE # tf.data 运行时动态调整值
batch_size = 32
seed = 42

raw_train_ds = tf.keras.utils.text_dataset_from_directory('aclImdb/train', 
	batch_size=batch_size, validation_split=0.2, subset='training', seed=seed)

class_names = raw_train_ds.class_names

train_ds = raw_train_ds.cache().prefetch(buffer_size=AUTOTUNE)

val_ds = tf.keras.utils.text_dataset_from_directory('aclImdb/train',
    batch_size=batch_size, validation_split=0.2, subset='validation', seed=seed)

val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

test_ds = tf.keras.utils.text_dataset_from_directory('aclImdb/test', batch_size=batch_size)

test_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)

在这里插入图片描述

tfhub_handle_preprocess = 'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3'
tfhub_handle_encoder = 'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-512_A-8/1'

bert_en_uncased_preprocess:Text preprocessing for BERT.

small_bert/bert_en_uncased_L-4_H-512_A-8:Smaller BERT model.

def build_classifier_model():
    text_input = tf.keras.layers.Input(shape=(), dtype=tf.string, name='text')
    preprocessing_layer = hub.KerasLayer(tfhub_handle_preprocess, name='preprocessing')
    encoder_inputs = preprocessing_layer(text_input)
    encoder = hub.KerasLayer(tfhub_handle_encoder, trainable=True, name='BERT_encoder')
    outputs = encoder(encoder_inputs)
    net = outputs['pooled_output']
    net = tf.keras.layers.Dropout(0.1)(net)
    net = tf.keras.layers.Dense(1, activation=None, name='classifier')(net)
    return tf.keras.Model(text_input, net)

hub.KerasLayer:该层包装了一个可调用对象以用作 Keras 层。可调用对象可以直接传递,或者由带有传递给 hub.load() 的句柄的 Python 字符串指定。

classifier_model = build_classifier_model()
tf.keras.utils.plot_model(classifier_model)

在这里插入图片描述
tf.keras.losses.BinaryCrossentropy:计算真实标签和预测标签之间的交叉熵损失。

tf.keras.metrics.BinaryAccuracy:计算预测匹配二进制标签的频率。

loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
metrics = tf.metrics.BinaryAccuracy()

tf.data.experimental.cardinality:返回数据集的基数(如果已知)。

epochs = 5
steps_per_epoch = tf.data.experimental.cardinality(train_ds).numpy()
num_train_steps = steps_per_epoch * epochs
num_warmup_steps = int(0.1*num_train_steps)
init_lr = 3e-5

optimizer = optimization.create_optimizer(init_lr=init_lr,
                                          num_train_steps=num_train_steps,
                                          num_warmup_steps=num_warmup_steps,
                                          optimizer_type='adamw')
classifier_model.compile(optimizer=optimizer, loss=loss, metrics=metrics)
print(f'Training model with {tfhub_handle_encoder}')
history = classifier_model.fit(x=train_ds, validation_data=val_ds, epochs=epochs)

在这里插入图片描述

loss, accuracy = classifier_model.evaluate(test_ds)

print(f'Loss: {loss}')
print(f'Accuracy: {accuracy}')

在这里插入图片描述

def print_my_examples(inputs, results):
    result_for_printing = [f'input: {inputs[i]:<30} : score: {results[i][0]:.6f}' for i in range(len(inputs))]
    print(*result_for_printing, sep='\n')


examples = [
    'this is such an amazing movie!',  # this is the same sentence tried earlier
    'The movie was great!',
    'The movie was meh.',
    'The movie was okish.',
    'The movie was terrible...'
]

original_results = tf.sigmoid(classifier_model(tf.constant(examples)))

print('Results from the model in memory:')
print_my_examples(examples, original_results)

在这里插入图片描述


模型的准确度是 85 % 85\% 85% 左右,这是通过一个相对较小的 BERT 模型实现的。

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

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

相关文章

简答说明通用智能基础模型的基本处理逻辑

当能量多的时候 激发的是欲望 按照中庸之道 多余的能力要消耗掉 当没有可以查询的模仿行为或者是大量消耗能量行为的时候 就开始记录行为统计为一个发生概率行为表 当拥有了概率记录数据后&#xff0c;按照最大发生概率依次模仿行为 行为得到的反馈 反馈的时间越短 则判断剩余能…

【论文速递】BEVFormer: 通过时空变换器从多相机图像中学习BEV表示

【论文原文】&#xff1a;ECCV2022 - BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers 论文&#xff1a;https://arxiv.org/abs/2203.17270 代码&#xff1a;https://github.com/fundamentalvision/BEVFormer…

C++ opencv之配置环境

opencv下载官网下载连接:https://opencv.org/releases/选择相应版本下载&#xff0c;windows操作系统下载windows版本下载exe后&#xff0c;双击即可安装&#xff0c;选择好路径&#xff0c;尽量安装路径不要存在中文&#xff0c;安装好如下:vs2022配置opencv为DLL添加Path环境…

windows10搭建spark本地开发环境

windows10搭建spark本地开发环境1. spark概述2. 安装spark2.1 Windows10 安装Spark本地开发环境2.1.1 **版本说明**2.1.2 **环境准备**2.1.2.1 JDK 安装和配置2.1.2.1.1 JDK下载2.1.2.1.2 JDK安装2.1.2.1.3 JDK配置2.1.2.2 Scala 安装和配置2.1.2.2.1Scala下载2.1.2.2.2 Scala安…

51单片机学习笔记-11 DS18B02温度传感器(单总线)

11 DS18B02温度传感器 [toc] 注&#xff1a;笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 11.1 温度传感器与单总线通信 11.1.1 DS18B20温度传感器 DS18B20是一种常见的数字温度传感器&#xff0c;其控制命令和数据都是以…

SAP ADM100-Unit3 系统配置介绍:系统如何评估它的参数

本节将了解系统评估配置文件参数的顺序,并了解这些参数存储的位置。 1、配置profile参数 各个实例和SAP系统都是使用Profile配置文件参数来配置的。这些参数的默认值被定义在内核程序代码中。 可以通过配置文件改变这些参数的默认值,当实例被开启时将读取配置文件中参数值。…

大屏加载速度优化--突破chrome 6个请求线程限制

1. 问题 当大屏中的内容很多时&#xff0c;比如50个以上&#xff0c;整个页面呈现速度会慢很多&#xff0c;影响用户体验。 通过 chrome开发者工具可以看到&#xff0c;默认情况下&#xff0c;chrome仅开启6个请求线程&#xff0c;用于发起ajax请求。 2. 解决方案 改进的方式…

epoll模型要点总结

(图是网上的&#xff0c;懒得自己画了) 1 epoll_ctl是向红黑树rbr插入、删除、修改fd。epoll_wait在双向链表rdllist中查询IO可读、可写、错误事件。 为什么使用红黑树&#xff1f;从插入、删除考虑。 2 epoll_ctl插入新fd时&#xff0c;新建epitem&#xff0c;会设置回调函…

2023年第五届清洁能源与智能电网国际会议(CCESG 2023)

2023年第五届清洁能源与智能电网国际会议&#xff08;CCESG 2023&#xff09; 重要信息 会议网址&#xff1a;www.ccesg.org 会议时间&#xff1a;2023年4月21-23日 召开地点&#xff1a;广西-南宁 截稿时间&#xff1a;2023年2月28日 录用通知&#xff1a;投稿后2周内 收…

结合代谢组学和网络药理学研究康复消炎栓治疗慢性盆腔炎作用机制

文章标题&#xff1a;Integrated Metabolomics and Network Pharmacology Study on the Mechanism of Kangfuxiaoyan Suppository for Treating Chronic Pelvic Inflflammatory Disease 发表期刊&#xff1a;Frontiers in Pharmacology 影响因子&#xff1a;5.988 发表年份&…

读书:《好奇心:保持对未知世界永不停息的热情》

刚看到《好奇心》这本书的书名&#xff0c;我对《好奇心》还是有点好奇心的。 为什么小孩的好奇心比大人多&#xff1f;也不一定&#xff0c;如果家长或老师没有足够好的引导的话&#xff0c;孩子也会对周围的世界没有兴趣。 好奇心为两种&#xff1a;消遣性好奇、认识性好奇…

【go-zero】在微服务架构中是否要使用分布式事务 如何避免分布式的耦合 微服务与分布式事务的对立

微服务要不要引入分布式事务讨论问题&#xff1a;微服务要不要引入分布式事务&#xff1f;1、分布式事务的场景分析2、分析利与弊3、如何优化分布式事务3.1 什么是CAP理论3.2 方式一&#xff1a;避免使用分布式事务1&#xff09;同步阻塞2&#xff09;异步调用3&#xff09;粗粒…

Linux中的Nginx平滑升级与回退

目录 一、平滑升级概述 1.平滑升级的定义 2.平滑升级的思路 &#xff08;1&#xff09;关于版本和备份 &#xff08;2&#xff09;向旧的Nginx的master进程发送USR2信号 &#xff08;3&#xff09;向旧的master进程发送winch信号&#xff0c;旧的worker子进程退出 &…

【疑难杂症】allennlp安装报错:Installing build dependencies ... error

背景&#xff1a; 配置PURE的算法环境&#xff0c;安装allennlp 0.9.0 &#xff08;pip install allennlp0.9.0&#xff09;报错&#xff0c;如图所示&#xff1a; 探索&#xff1a; 发现allennlp的依赖中有spacy&#xff0c;是在安装spacy 2.1.9的依赖时报错了。 此时我尝试…

PCB如何添加SMT定位孔经验总结

&#x1f3e1;《总目录》 目录1&#xff0c; 什么是SMT定位孔2&#xff0c;SMT定位孔有什么特征3&#xff0c;添加SMT定位孔的经验原则4&#xff0c;其他注意事项1&#xff0c; 什么是SMT定位孔 SMT定位孔是指在PCBA的SMT贴片焊接阶段&#xff0c;为了准确固定和定位板卡的机械…

【OpenGL学习】颜色和光照

颜色和光照 一、颜色的物理解释 颜色&#xff08;英语&#xff1a;colour&#xff0c;color&#xff09;又称色彩、色泽&#xff0c;是眼、脑和我们的生活经验对光的颜色类别描述的视觉感知特。这种对颜色的感知来自可见光谱中的电磁辐射对人眼视锥细胞的刺激。颜色是由光反射…

boost搜索引擎

文章目录1.项目介绍2.搜索引擎技术栈和项目环境3.正排索引和倒排索引 - 搜索引擎具体原理4.编写数据去标签和数据清洗模块Parser5.编写建立索引模块Index6.编写搜索引擎模块Searcher7.编写http_server8.效果展示1.项目介绍 Boost官网没有对应的搜索引擎&#xff0c;不方便我们…

04 frameset-iframe【尚硅谷JavaWeb教程】

04 frameset-iframe【尚硅谷JavaWeb教程】 frameset、iframe这个标签基本上已经不用了。 frameset标签 一个大的网页由很多个小的网页组成&#xff0c;会用到frameset。 frameset 表示页面框架&#xff0c;这个标签已经淘汰&#xff0c;了解&#xff0c;不需要掌握。 frame表…

Element ui Avatar头像管理组件 实现当用户没有头像时 以名称最后一个字为头像

el-avatar是一个比较方便的头像管理组件 src控制他的图片展示 <el-avatarclass "avatar":src"item.images" ></el-avatar>样式的话 可以用avatar控制 <style> .avatar{width: 18px;height: 18px;line-height: 18px; } .avatar img{b…

【可解释性机器学习】TextExplainer: 调试黑盒文本分类器

TextExplainer: 调试黑盒文本分类器示例问题&#xff1a;20个新闻组数据集的LSA SVM模型TextExplainer文本解释器的工作原理我们应该相信这个解释吗&#xff1f;让它们犯错吧让它们再次犯错吧自定义TextExplainer: 采样过程自定义TextExplainer&#xff1a;分类器参考资料尽管…