昇思25天學習打卡營第10天|基于MindSpore實現BERT對話情緒識別

基于MindSpore實現BERT對話情緒識別

  • 模型簡介
  • 數據集
  • 模型構建
  • 模型驗證
  • 模型推理
  • 自定義推理數據集

模型簡介

BERT全稱是來自變換器的雙向編碼器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末開發并發布的一種新型語言模型。與BERT模型相似的預訓練語言模型例如問答、命名實體識別、自然語言推理、文本分類等在許多自然語言處理任務中發揮著重要作用。模型是基于Transformer中的Encoder并加上雙向的結構。

BERT模型的主要創新點都在pre-train方法上,即用了Masked Language Model和Next Sentence Prediction兩種方法分別捕捉詞語和句子級別的representation。

  • Masked Language Model:隨機把語料庫中15%的單詞做Mask操作。對于這15%的單詞做Mask操作分為三種情況:80%的單詞直接用[Mask]替換、10%的單詞直接替換成另一個新的單詞、10%的單詞保持不變。
  • Next Sentence Prediction:目的是讓模型理解兩個句子之間的聯系。與Masked Language Model任務相比,Next Sentence Prediction更簡單些,訓練的輸入是句子A和B,B有一半的幾率是A的下一句,輸入這兩個句子,BERT模型預測B是不是A的下一句。

BERT預訓練之后,會保存它的Embedding table和12層Transformer權重(BERT-BASE)或24層Transformer權重(BERT-LARGE)。使用預訓練好的BERT模型可以對下游任務進行Fine-tuning,比如:文本分類、相似度判斷、閱讀理解等。

應用價值
對話情緒識別(Emotion Detection,簡稱EmoTect),專注于識別智能對話場景中用戶的情緒,針對智能對話場景中的用戶文本,自動判斷該文本的情緒類別并給出相應的置信度,情緒類型分為積極、消極、中性。 對話情緒識別適用于聊天、客服等多個場景,能夠幫助企業更好地把握對話質量、改善產品的用戶交互體驗,也能分析客服服務質量、降低人工質檢成本。

代碼示例:

# 下載依賴
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
!pip install mindnlpimport 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# 定義情緒數據集對象
class SentimentDataset:"""Sentiment Dataset"""def __init__(self, path):self.path = pathself._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表示積極),第二列是以空格分詞的中文文本,如下示例,文件為 utf8 編碼。

label–text_a
0–誰罵人了?我從來不罵人,我罵的都不是人,你是人嗎 ?
1–我有事等會兒就回來和你聊
2–我見到你很高興謝謝你幫我

代碼示例:

# 下載數據集
!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 npdef 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)# transformstype_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 datasetdataset = 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 datasetif 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 datasetfrom 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 Tensorfor label, text in dataset_infer:predict(text, label)

運行結果:
運行結果

自定義推理數據集

準備輸入自定義推理數據,展示模型的泛化能力。
代碼示例:

predict("家人們咱就是說一整個無語住了 絕絕子疊buff")
predict("我靠")
predict("我熱愛學習")# 運行結果:
'''
inputs: '家人們咱就是說一整個無語住了 絕絕子疊buff', predict: '中性'
inputs: '我靠', predict: '消極'
inputs: '我熱愛學習', predict: '積極'
'''

截圖時間
截圖時間

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41284.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML超鏈接和錨鏈接

HTML超鏈接和錨鏈接 一、定義 HTML的超鏈接&#xff08;Hyperlink&#xff09;用于在網頁之間創建鏈接&#xff0c;使用戶可以點擊這些鏈接來導航到其他頁面或資源。 二、基本語法 1、語法 HTML中的超鏈接使用a標簽來定義 <a href"URL">鏈接文本</a&g…

yolov8實戰——yolov8TensorRT部署(python推理)(保姆教學)

yolov8實戰——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教學&#xff09; 一 、準備好代碼和環境安裝TensorRt下載代碼和安裝環境 部署和推理構建ONNX構建engine無torch推理torch推理 最近用到yolov8&#xff0c;但是尋找了一圈才找到了yolov8最…

[SAP ABAP] 版本管理

版本管理是指軟件開發過程中各種程序代碼、配置文件以及說明文檔等文件變更的管理 生成版本 版本管理 對比版本 點擊上述版本管理即可進行版本對比操作 補充擴展 我們可以使用事務碼SE10對傳輸請求進行創建、修改、刪除、合并以及更改所有者等操作 使用事務碼SCC1進行不同cl…

3D生成模型TripoSR完美搭建流程,包含所有問題解決方案!

最近需要使用3D生成模型,無意中看到了TripoSR,覺得效果還行,于是打算在Linux系統上部署一下,結果遇到很多坑,在這里寫一下詳細的部署流程和部署過程中遇到的問題。 下面是TripoSR的源碼地址。 GitHub - VAST-AI-Research/TripoSRContribute to VAST-AI-Research/TripoSR…

java-Linkedlist源碼分析

## 深入分析 Java 中的 LinkedList 源碼 LinkedList 是 Java 集合框架中的一個重要類&#xff0c;它基于雙向鏈表實現&#xff0c;提供了高效的插入和刪除操作。與 ArrayList 不同&#xff0c;LinkedList 的結構使其在特定操作上有更優的性能表現。本文將詳細分析 LinkedList …

android 進程,線程調度的區別

一 分析&#xff1a; 進程和線程在調度上有什么不同呢&#xff1f;當有一個task去占用指定的資源時候叫進程&#xff0c;當有多個task去共享使用這些資源時候&#xff0c;這個task和之后的task都叫線程&#xff08;最初這個task叫主線程&#xff09;而linux調度主要調的就是cp…

【Portswigger 學院】文件上傳

教程和靶場來源于 Burpsuite 的官網 Portswigger&#xff1a;File upload vulnerabilities - PortSwigger 原理與危害 很多網站都有文件上傳的功能&#xff0c;比如在個人信息頁面允許用戶上傳圖片作為頭像。如果網站應用程序對用戶上傳的文件沒有針對文件名、文件類型、文件內…

前端基礎:JavaScript(篇一)

目錄 JavaScript概述 JavaScript歷史&#xff1a; 須知&#xff1a; 基本語法 變量 代碼 運行 數據類型 1、數值型(number)&#xff1a; 代碼 運行 2、布爾型(boolean)&#xff1a; 代碼 運行 3、字符串型&#xff1a; 代碼 運行 4、 undefined類型 代碼…

TCP的pop網絡模式

TCP的pop網絡模式 1、tcp連接的狀態有以下11種 CLOSED&#xff1a;關閉狀態LISTEN&#xff1a;服務端狀態&#xff0c;等待客戶端發起連接請求SYN_SENT&#xff1a;客戶端已發送同步連接請求&#xff0c;等待服務端相應SYN_RECEIVED&#xff1a;服務器收到客戶端的SYN請請求&…

MySQL 基本語法講解及示例(下)

第六節&#xff1a;如何檢索資料 在本節中&#xff0c;我們將介紹如何使用SQL語句檢索數據庫中的資料&#xff0c;具體包括選擇特定列、排序、條件過濾以及組合排序等操作。我們以一個名為student的表格為例&#xff0c;演示不同的檢索方法。 初始表格 student student_idname…

修復harbor的/account/sign-in\?globalSearch=b不登錄可以查詢鏡像的問題

Nginx的location指令不能直接匹配查詢參數&#xff0c;所以需要通過其他方式來處理。這里是一個使用if指令結合查詢參數來實現的方法。該方法會在請求路徑中帶有特定查詢參數時返回404。 使用if指令匹配查詢參數 打開Nginx配置文件&#xff1a; sudo vim /etc/nginx/sites-ava…

Python中frozenset,秒變不可變集合,再也不用擔心多線程了!

目錄 1、Frozenset基礎介紹 ?? 1.1 Frozenset定義與創建 1.2 不可變集合特性 1.3 與Set的區別對比 2、Frozenset操作實踐 ?? 2.1 初始化與添加元素嘗試 2.2 成員測試: in & not in 2.3 集合運算: 并集、交集、差集 2.4 使用場景示例: 字典鍵、函數參數默認值 …

登錄設計(實戰項目)-1個手機號多用戶身份登錄

一. 背景&#xff1a; 該需求是一個互聯網醫院的預約單場景&#xff0c;護士在小程序上申請患者查房預約單&#xff0c;醫生在小程序上對預約單進行接單&#xff0c;護士開始查房后填寫查房小結&#xff0c;客戶需要對用戶信息進行授權&#xff0c;醫生查房后進行簽字&#xff…

勁爆!華為享界兩款新車曝光,等等黨有福了

文 | AUTO芯球 作者 | 雷慢 勁爆啊&#xff0c;北汽的一份環境影響分析報告&#xff0c; 不僅曝光了享界S9的生產進展&#xff0c; 還泄露了自家的另兩款產品&#xff0c; 第一款是和享界S9同尺寸的旅行車&#xff0c; 我一看&#xff0c;這不是我最喜歡的“瓦罐”嗎&…

v-html 空格/換行不生效

接口返回的內容如下&#xff1a;有空格有換行&#xff0c;但 使用v-html無效 需加css樣式 white-space: pre-wrap; <div class"pretty-html" v-html"Value"></div>.pretty-html {white-space: pre-wrap; /* 保留空格和換行&#xff0c;并允許…

掌握麥肯錫精英的6個技巧,你也能成為1%的精英!

不知道大家有沒有想過&#xff0c;我們和那些全球頂尖精英的差距可能只有1%&#xff0c;只是99%的人還不知道這件事。 今天給大家推薦一本好書&#xff0c;《你和麥肯錫精英的差別只有1%》。優思學院發現&#xff0c;在我們的六西格瑪、精益管理的學生中很多人對自己沒有自信。…

軟通動力子公司鴻湖萬聯最新成果SwanLink AI亮相世界人工智能大會

7月4日&#xff0c;2024世界人工智能大會暨人工智能全球治理高級別會議&#xff08;WAIC 2024&#xff09;在上海拉開帷幕&#xff0c;軟通動力董事長兼首席執行官劉天文受邀出席開幕式。其間&#xff0c;軟通動力攜子公司鴻湖萬聯深度參與到大會各項活動中&#xff0c;并全面展…

C語言_結構體初階(還未寫完)

結構體的聲明 1. 什么是結構&#xff1f;結構是一些值的集合&#xff0c;這些值稱為成員變量。結構的每個成員可以是不同類型的變量 數組&#xff1a;一組相同類型元素的集合 結構體&#xff1a;一組不一定相同類型元素的集 2. 結構的聲明 struct tag //tag根據實際情況給名字…

Spring注解@Qualifier

Autowired 注解是 Spring 依賴注入。但是有些場景下僅僅靠這個注解不足以讓Spring知道到底要注入哪個 bean。 默認情況下&#xff0c;Autowired 按類型裝配 Spring Bean。 如果容器中有多個相同類型的 bean&#xff0c;則框架將拋出 NoUniqueBeanDefinitionException&#xff0…

數字化產科管理平臺全套源碼,java產科電子病歷系統源碼

數字化產科管理平臺全套成品源碼&#xff0c;產科電子病歷系統源碼&#xff0c;多家大型婦幼專科醫院應用案例。源碼完全授權交付。 數字化產科管理平臺&#xff08;智慧產科系統&#xff09;是為醫院產科量身定制的信息管理系統。它管理了孕婦從懷孕開始到生產結束42天以內的一…