昇思25天学习打卡营第17天 | 基于MindSpore实现BERT对话情绪识别

news2024/11/22 20:36:16

昇思25天学习打卡营第17天 | 基于MindSpore实现BERT对话情绪识别

文章目录

  • 昇思25天学习打卡营第17天 | 基于MindSpore实现BERT对话情绪识别
    • BERT模型
    • 对话情绪识别
    • BERT模型的文本情绪分类任务
      • 数据集
        • 数据下载
        • 数据加载与预处理
      • 模型构建
      • 模型验证
      • 模型推理
    • 总结
    • 打卡

BERT模型

BERT(Bidirectional Encoder Representations from Transformers)是Google开发的一种新型语言模型,模型主要基于Transformer中的Encoder并加上双向的结构。

BERT的主要创新点在pre-train方法上,使用了

  • Masked Language Model :随机把语料库中 15 % 15\% 15%的单词做Mask操作,对这些单词的Mask操作分为:
    • 80 % 80\% 80%的单词直接用[Mask]替换;
    • 10 % 10\% 10%的单词直接替换成另一个新的单词;
    • 10 % 10\% 10%的单词保持不变。
  • Next Sentence Prediction:目的是让模型理解两个句子之间的联系。训练的输入是句子A和B,B有一半的几率是A的下一句,BERT模型预测B是否为A的下一句。

对话情绪识别

对话情绪识别(Emotion Detection, EmoTect),专注于识别智能对话场景中用户的情绪。针对用户文本,自动判断该文本的情绪类别并给出相应的置信度。情绪类型分为积极、消极、中性。

BERT模型的文本情绪分类任务

数据集

import os

import mindspore
from mindspore.dataset import text, GeneratorDataset, transforms
from mindspore import nn, context

from mindnlp._legacy.engine import Trainer, Evaluator
from mindnlp._legacy.engine.callbacks import CheckpointCallback, BestModelCallback
from mindnlp._legacy.metrics import Accuracy

# prepare dataset
class SentimentDataset:
    """Sentiment Dataset"""

    def __init__(self, path):
        self.path = path
        self._labels, self._text_a = [], []
        self._load()

    def _load(self):
        with open(self.path, "r", encoding="utf-8") as f:
            dataset = f.read()
        lines = dataset.split("\n")
        for line in lines[1:-1]:
            label, text_a = line.split("\t")
            self._labels.append(int(label))
            self._text_a.append(text_a)

    def __getitem__(self, index):
        return self._labels[index], self._text_a[index]

    def __len__(self):
        return len(self._labels)

数据来自于百度飞桨团队,由两列组成,以制表符(\t)分隔:

  • 第一列是情绪分类的类别(0表示消极;1表示中性;2表示积极)
  • 第二列是以空格分词的中文文本。

label–text_a
0–谁骂人了?我从来不骂人,我骂的都不是人,你是人吗 ?
1–我有事等会儿就回来和你聊
2–我见到你很高兴谢谢你帮我

数据下载
# download dataset
!wget https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz -O emotion_detection.tar.gz
!tar xvf emotion_detection.tar.gz
数据加载与预处理
import numpy as np

def process_dataset(source, tokenizer, max_seq_len=64, batch_size=32, shuffle=True):
    is_ascend = mindspore.get_context('device_target') == 'Ascend'

    column_names = ["label", "text_a"]
    
    dataset = GeneratorDataset(source, column_names=column_names, shuffle=shuffle)
    # transforms
    type_cast_op = transforms.TypeCast(mindspore.int32)
    def tokenize_and_pad(text):
        if is_ascend:
            tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)
        else:
            tokenized = tokenizer(text)
        return tokenized['input_ids'], tokenized['attention_mask']
    # map dataset
    dataset = dataset.map(operations=tokenize_and_pad, input_columns="text_a", output_columns=['input_ids', 'attention_mask'])
    dataset = dataset.map(operations=[type_cast_op], input_columns="label", output_columns='labels')
    # batch dataset
    if is_ascend:
        dataset = dataset.batch(batch_size)
    else:
        dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id),
                                                         'attention_mask': (None, 0)})

    return dataset

from mindnlp.transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
dataset_train = process_dataset(SentimentDataset("data/train.tsv"), tokenizer)
dataset_val = process_dataset(SentimentDataset("data/dev.tsv"), tokenizer)
dataset_test = process_dataset(SentimentDataset("data/test.tsv"), tokenizer, shuffle=False)

模型构建

通过BertForSequenceClassification构建用于情绪分类的BERT模型,加载预训练权重,设置情绪三分类的超参数自动构建模型。

from mindnlp.transformers import BertForSequenceClassification, BertModel
from mindnlp._legacy.amp import auto_mixed_precision

# set bert config and define parameters for training
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=3)
model = auto_mixed_precision(model, 'O1')

optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5)

metric = Accuracy()
# define callbacks to save checkpoints
ckpoint_cb = CheckpointCallback(save_path='checkpoint', ckpt_name='bert_emotect', epochs=1, keep_checkpoint_max=2)
best_model_cb = BestModelCallback(save_path='checkpoint', ckpt_name='bert_emotect_best', auto_load=True)

trainer = Trainer(network=model, train_dataset=dataset_train,
                  eval_dataset=dataset_val, metrics=metric,
                  epochs=5, optimizer=optimizer, callbacks=[ckpoint_cb, best_model_cb])

%%time
# start training
trainer.run(tgt_columns="labels")

模型验证

在验证集上对模型验证,查看模型在验证数据上的指标。

evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)
evaluator.run(tgt_columns="labels")

模型推理

dataset_infer = SentimentDataset("data/infer.tsv")

def predict(text, label=None):
    label_map = {0: "消极", 1: "中性", 2: "积极"}

    text_tokenized = Tensor([tokenizer(text).input_ids])
    logits = model(text_tokenized)
    predict_label = logits[0].asnumpy().argmax()
    info = f"inputs: '{text}', predict: '{label_map[predict_label]}'"
    if label is not None:
        info += f" , label: '{label_map[label]}'"
    print(info)

from mindspore import Tensor

for label, text in dataset_infer:
    predict(text, label)

总结

这一节对BERT模型进行了介绍,其主要创新点为Masked Language Model和Next Sentence Prediction,这两种方法可以捕获词语和句子级别的特征表示。使用预训练的BERT模型,可以很方便的对下游任务进行Fine-tuning。这一节介绍了BERT在情绪分类任务上的应用。

打卡

在这里插入图片描述

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

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

相关文章

Python+Flask+MySQL/Sqlite的个人博客系统(前台+后端管理)【附源码,运行简单】

PythonFlaskMySQL/Sqlite的个人博客系统(前台后端管理)【附源码,运行简单】 总览 1、《个人博客系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 管理员登录2.2 程序主页面2.3 笔记新增界面2.4 文章新增界面2.5 文章/笔记管理界面2…

SpreadsheetLLM:微软对Excel编码的“摊膀伏”

--->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<--- SpreadsheetLLM Excel的特点是二维数据格式、灵活的布局和多样化的格式选项。微软最近引入了SpreadsheetLLM&#xff0c;开创了一种高效的编码方法&#xff0c;用于释放和优化LLMs在电子表格上…

[CP_AUTOSAR]_分层软件架构_接口之通信模块交互介绍

目录 1、协议数据单元(PDU)传输2、通信模块的案例2.1、SDU、 PCI & PDU2.2、通信模块构成2.3、从数据传输的角度看Communication2.4、Communication中的接口 在前面 《关于接口的一些说明》 以及  《Memory软件模块接口说明》 中&#xff0c;简要介绍了CP_AUTOSAR分层…

农田自动化闸门的结构组成与功能解析

在现代化的农业节水灌溉领域中&#xff0c;农田自动化闸门的应用越来越广泛。它集成了先进的技术&#xff0c;通过自动化控制实现水资源的精准调度和高效利用。本文将围绕农田自动化闸门的结构组成&#xff0c;详细介绍其各个部件的功能和特点。 农田自动化闸门主要由闸门控制箱…

【Java安全】基础配置篇-01

Java安全-01 文章目录 Java安全-01前置基础小demo开发记录文件上传 课程学习记录初始配置阶段0x00 微服务阶段历史0x01 第一个SpringBoot程序0x02 原理初探0x03 SpringBoot配置文件0x04 给属性赋值的几种方法0x05 JSR303校验0x06 多环境配置0x07 再探自动配置原理 开发阶段0x00…

勒索软件运营商的恶意软件

ARC Labs 发现并分析了一种用于Qilin勒索软件攻击的新工具。 这种恶意软件被称为“Killer Ultra”&#xff0c;旨在禁用流行的威胁检测和响应&#xff08;EDR&#xff09;以及防病毒软件。 ARC Labs 专家进行了深入分析&#xff0c;以了解 Killer Ultra 的全部功能&#xff0…

新品发布|全面适配鸿蒙NEXT安全检测,助力鸿蒙安全生态建设

鸿蒙系统打破了移动操作系统两极格局&#xff0c;实现操作系统核心技术的自主可控、安全可靠&#xff0c;在神州大地上掀起一波科技革新的浪潮&#xff0c;HarmonyOS NEXT成为大型企业必须要布局的应用系统之一&#xff0c;如何检测鸿蒙应用的安全性是企业内部的核心难点之一&a…

C++基础语法:STL之容器(4)--序列容器中的list(一)

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 序列容器的学习.以<C Prime Plus> 6th Edition(以下称"本书")内容理解 本书中容器内容不多只有几页.最好是有数据结构方面的知识积累,如果没有在学的同时补上. 序列容器回顾:序列容器内元素按严格…

加密软件有什么用?五款电脑文件加密软件推荐

加密软件对于个人和企业来说至关重要&#xff0c;尤其是在2024年这样一个高度数字化的时代&#xff0c;数据安全变得尤为重要。 数据保护&#xff1a;加密软件可以保护敏感信息不被未经授权的人访问。这包括个人数据、财务记录、健康信息、企业机密等。 防泄漏&#xff1a;防…

组合数学+费用背包+刷表,G2 - Playlist for Polycarp (hard version)

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 G2 - Playlist for Polycarp (hard version) 二、解题报告 1、思路分析 一…

Linux驱动开发-05APP和驱动的交互方式

一、传输数据 APP和驱动: copy_to_usercopy_from_user驱动和硬件: 各个子系统的函数通过ioremap映射寄存器地址后,直接访问寄存器二、APP使用驱动的四种方式 驱动程序:提供能力,不提供策略 非阻塞(查询)(应用程序访问底层驱动时(read、write时),驱动没有数据不等待,…

【Vue】深入理解 `v-model` 指令:实现数据双向绑定的终极指南

文章目录 一、v-model 指令概述二、v-model 的基本用法1. 绑定输入框的值2. 绑定多行文本框的值3. 绑定复选框4. 绑定单选框5. 绑定选择框 三、v-model 的工作原理四、v-model 的高级用法1. 自定义组件中的 v-model模板部分 (<template>)脚本部分 (<script>) 2. 多…

vue项目源码调试方法 ,chrome调试控制台工作区使用,利用chrome控制台调试vue项目源码的方法 图解

我们在开发vue项目的时候&#xff0c;项目开始后的第一件事情应该就是准备调试工作了&#xff0c;Chrome调试控制台就给我们提供了这样的一个方便的调试工作区。方法为&#xff0c;在Chrome浏览器里面打开你要调试的页面&#xff0c;然后打开调试控制台&#xff0c;如下&#x…

基于STC8H4K64TL单片机的触摸功能和数码管驱动功能实现一个触摸按键单击长按都增加数值另一个触摸按键单击长按都减少数值应用

基于STC8H4K64TL单片机的触摸功能和数码管驱动功能实现一个触摸按键单击长按都增加数值另一个触摸按键单击长按都减少数值应用 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单…

【Linux】汇总TCP网络连接状态命令

输入命令&#xff1a; netstat -na | awk /^tcp/ {S[$NF]} END {for(a in S) print a, S[a]} 显示&#xff1a; 让我们逐步解析这个命令&#xff1a; netstat -na: netstat 是一个用于显示网络连接、路由表、接口统计等信息的命令。 -n 选项表示输出地址和端口以数字格式显示…

ACCL+: an FPGA-Based Collective Engine for Distributed Applications——论文泛读

OSDI 2024 Paper 论文阅读笔记整理 问题 FPGA在云部署中越来越普遍[16,81]&#xff0c;如智能NIC[29,35,64,67103]、流处理器[31,32,55,68]和分布式加速器[15,41,61,65,86,93115]。可以使用FPGA到FPGA的直接通信来构建高效的分布式系统。然而&#xff0c;使用FPGA设计分布式应…

通过 EMR Serverless Spark 提交 PySpark 流任务

在大数据快速发展的时代&#xff0c;流式处理技术对于实时数据分析至关重要。EMR Serverless Spark提供了一个强大而可扩展的平台&#xff0c;它不仅简化了实时数据处理流程&#xff0c;还免去了服务器管理的烦恼&#xff0c;提升了效率。本文将指导您使用EMR Serverless Spark…

python爬虫获取网易云音乐评论歌词以及歌曲地址

python爬虫获取网易云音乐评论歌词以及歌曲地址 一.寻找数据接口二.对负载分析三.寻找参数加密过程1.首先找到评论的请求包并找到发起程序2.寻找js加密的代码 四.扣取js的加密源码1.加密函数参数分析①.JSON.stringify(i0x)②bse6Y(["流泪", "强"])③bse6Y…

Linux--Socket套接字编程

Socket编程 Socket编程是一种在网络中不同计算机之间实现数据交换的编程方式。它允许程序创建网络连接&#xff0c;并通过这些连接来发送和接收数据。Socket编程是网络编程的基础&#xff0c;广泛应用于客户端-服务器&#xff08;C/S&#xff09;架构中。 要实现双方通信&…

【扩散模型(六)】Stable Diffusion 3 diffusers 源码详解1-推理代码-文本处理部分

系列文章目录 【扩散模型&#xff08;一&#xff09;】中介绍了 Stable Diffusion 可以被理解为重建分支&#xff08;reconstruction branch&#xff09;和条件分支&#xff08;condition branch&#xff09;【扩散模型&#xff08;二&#xff09;】IP-Adapter 从条件分支的视…