1. 基于MindSpore實現BERT對話情緒識別
1.1 環境配置
# 實驗環境已經預裝了mindspore==2.2.14,如需更換mindspore版本,可更改下面mindspore的版本號
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14# 該案例在 mindnlp 0.3.1 版本完成適配,如果發現案例跑不通,可以指定mindnlp版本,執行`!pip install mindnlp==0.3.1`
!pip install mindnlp
!pip show mindspore
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting mindnlp==0.3.1Downloading https://pypi.tuna.tsinghua.edu.cn/packages/72/37/ef313c23fd587c3d1f46b0741c98235aecdfd93b4d6d446376f3db6a552c/mindnlp-0.3.1-py3-none-any.whl (5.7 MB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.7/5.7 MB 18.8 MB/s eta 0:00:00a 0:00:01
...
Requirement already satisfied: tzdata>=2022.7 in /home/nginx/miniconda/envs/jupyter/lib/python3.9/site-packages (from pandas->datasets->mindnlp==0.3.1) (2024.1)
Building wheels for collected packages: jiebaBuilding wheel for jieba (setup.py) ... doneCreated wheel for jieba: filename=jieba-0.42.1-py3-none-any.whl size=19314459 sha256=9ddea89911261cc55a74d51c5bd604e293e2c08b73a29597c8fde9ed0dc8dfc7Stored in directory: /home/nginx/.cache/pip/wheels/1a/76/68/b6d79c4db704bb18d54f6a73ab551185f4711f9730c0c15d97
Successfully built jieba
Installing collected packages: sortedcontainers, sentencepiece, pygtrie, jieba, addict, xxhash, safetensors, regex, pytest, pyarrow-hotfix, pyarrow, multiprocess, multidict, ml-dtypes, hypothesis, fsspec, frozenlist, async-timeout, yarl, pyctcdecode, aiosignal, tokenizers, aiohttp, datasets, evaluate, mindnlpAttempting uninstall: pytestFound existing installation: pytest 8.0.0Uninstalling pytest-8.0.0:Successfully uninstalled pytest-8.0.0Attempting uninstall: fsspecFound existing installation: fsspec 2024.6.0Uninstalling fsspec-2024.6.0:Successfully uninstalled fsspec-2024.6.0
Successfully installed addict-2.4.0 aiohttp-3.9.5 aiosignal-1.3.1 async-timeout-4.0.3 datasets-2.20.0 evaluate-0.4.2 frozenlist-1.4.1 fsspec-2024.5.0 hypothesis-6.105.0 jieba-0.42.1 mindnlp-0.3.1 ml-dtypes-0.4.0 multidict-6.0.5 multiprocess-0.70.16 pyarrow-16.1.0 pyarrow-hotfix-0.6 pyctcdecode-0.5.0 pygtrie-2.5.0 pytest-7.2.0 regex-2024.5.15 safetensors-0.4.3 sentencepiece-0.2.0 sortedcontainers-2.4.0 tokenizers-0.19.1 xxhash-3.4.1 yarl-1.9.4
Name: mindspore
Version: 2.2.14
Summary: MindSpore is a new open source deep learning training/inference framework that could be used for mobile, edge and cloud scenarios.
Home-page: https://www.mindspore.cn
Author: The MindSpore Authors
Author-email: contact@mindspore.cn
License: Apache 2.0
Location: /home/nginx/miniconda/envs/jupyter/lib/python3.9/site-packages
Requires: asttokens, astunparse, numpy, packaging, pillow, protobuf, psutil, scipy
Required-by: mindnlp
1.2 模型簡介
BERT全稱是來自變換器的雙向編碼器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末開發并發布的一種新型語言模型。與BERT模型相似的預訓練語言模型例如問答、命名實體識別、自然語言推理、文本分類等在許多自然語言處理任務中發揮著重要作用。模型是基于Transformer中的Encoder并加上雙向的結構,因此一定要熟練掌握Transformer
的Encoder
的結構。
BERT模型的主要創新點都在pre-train方法上,即用了Masked Language Model
和Next Sentence Prediction
兩種方法分別捕捉詞語和句子級別的representation。
在用Masked Language Model方法訓練BERT的時候,隨機把語料庫中15%的單詞做Mask操作。對于這15%的單詞做Mask操作分為三種情況:80%的單詞直接用[Mask]替換、10%的單詞直接替換成另一個新的單詞、10%的單詞保持不變。
因為涉及到Question Answering (QA) 和 Natural Language Inference (NLI)之類的任務,增加了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),專注于識別智能對話場景中用戶的情緒,針對智能對話場景中的用戶文本,自動判斷該文本的情緒類別并給出相應的置信度,情緒類型分為積極、消極、中性。 對話情緒識別適用于聊天、客服等多個場景,能夠幫助企業更好地把握對話質量、改善產品的用戶交互體驗,也能分析客服服務質量、降低人工質檢成本。
下面以一個文本情感分類任務為例子來說明BERT模型的整個應用過程。
- 導入依賴
# 導入os模塊,提供了一種方便的方式來使用操作系統相關的功能。
import os# 導入mindspore模塊,這是一個面向AI的深度學習框架。
import mindspore# 從mindspore.dataset子模塊中導入text、GeneratorDataset和transforms,這些都是用于數據處理的工具。
# text用于處理文本數據,GeneratorDataset用于創建自定義的數據集,transforms用于數據增強和預處理。
from mindspore.dataset import text, GeneratorDataset, transforms# 從mindspore模塊中導入nn和context。
# nn是構建神經網絡層的模塊,context是用于設置運行環境的模塊,如硬件設備、運行模式等。
from mindspore import nn, context# 從mindnlp._legacy.engine子模塊中導入Trainer和Evaluator。
# Trainer是訓練模型的類,Evaluator是評估模型的類。
from mindnlp._legacy.engine import Trainer, Evaluator# 從mindnlp._legacy.engine.callbacks子模塊中導入CheckpointCallback和BestModelCallback。
# CheckpointCallback用于在訓練過程中保存模型的權重,BestModelCallback用于保存評估結果最好的模型。
from mindnlp._legacy.engine.callbacks import CheckpointCallback, BestModelCallback# 從mindnlp._legacy.metrics子模塊中導入Accuracy,這是一個用于計算準確率的評估指標。
from mindnlp._legacy.metrics import Accuracy
輸出:
Building prefix dict from the default dictionary ...
Dumping model to file cache /tmp/jieba.cache
Loading model cost 1.032 seconds.
Prefix dict has been built successfully.
大意為:
正在從默認詞典構建前綴詞典…
正在將模型轉儲到文件緩存 /tmp/jieba.cache
加載模型耗時1.032秒。
前綴詞典已成功構建。
# 準備數據集
class SentimentDataset:"""情感數據集"""def __init__(self, path):self.path = path # 初始化數據集路徑self._labels, self._text_a = [], [] # 初始化標簽和文本列表self._load() # 調用加載函數def _load(self):# 以只讀模式打開指定路徑的文件,并指定編碼為utf-8with 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):# 實現getitem方法,以便能夠通過索引訪問數據集的元素return self._labels[index], self._text_a[index] # 返回對應索引的標簽和文本def __len__(self):# 實現len方法,以便能夠獲取數據集的大小return len(self._labels) # 返回標簽列表的長度,即數據集的大小
1.3 數據集
這里提供一份已標注的、經過分詞預處理的機器人聊天數據集,來自于百度飛槳團隊。數據由兩列組成,以制表符(‘\t’)分隔,第一列是情緒分類的類別(0表示消極;1表示中性;2表示積極),第二列是以空格分詞的中文文本,如下示例,文件為 utf8 編碼。
label–text_a
0–誰罵人了?我從來不罵人,我罵的都不是人,你是人嗎 ?
1–我有事等會兒就回來和你聊
2–我見到你很高興謝謝你幫我
這部分主要包括數據集讀取,數據格式轉換,數據 Tokenize 處理和 pad 操作。
# 使用wget命令從百度NLP的官方網站下載情感檢測數據集的壓縮文件
# 并將下載的文件重命名為emotion_detection.tar.gz
!wget https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz -O emotion_detection.tar.gz# 使用tar命令解壓下載的emotion_detection.tar.gz文件
!tar xvf emotion_detection.tar.gz
輸出:
--2024-07-04 23:28:31-- https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz
Resolving baidu-nlp.bj.bcebos.com (baidu-nlp.bj.bcebos.com)... 119.249.103.5, 113.200.2.111, 2409:8c04:1001:1203:0:ff:b0bb:4f27
Connecting to baidu-nlp.bj.bcebos.com (baidu-nlp.bj.bcebos.com)|119.249.103.5|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1710581 (1.6M) [application/x-gzip]
Saving to: ‘emotion_detection.tar.gz’emotion_detection.t 100%[===================>] 1.63M 10.9MB/s in 0.2s 2024-07-04 23:28:31 (10.9 MB/s) - ‘emotion_detection.tar.gz’ saved [1710581/1710581]data/
data/test.tsv
data/infer.tsv
data/dev.tsv
data/train.tsv
data/vocab.txt
1.3.1 數據加載和數據預處理
新建 process_dataset 函數用于數據加載和數據預處理,具體內容可見下面代碼注釋。
import numpy as np# 定義一個處理數據集的函數,它接受源數據、分詞器、最大序列長度、批處理大小和是否打亂數據集的參數
def process_dataset(source, tokenizer, max_seq_len=64, batch_size=32, shuffle=True):# 判斷當前設備是否為Ascend AI處理器is_ascend = mindspore.get_context('device_target') == 'Ascend'# 定義數據集中的列名column_names = ["label", "text_a"]# 創建一個生成器數據集,使用指定的列名和是否打亂數據集的參數dataset = GeneratorDataset(source, column_names=column_names, shuffle=shuffle)# 定義類型轉換操作,將數據類型轉換為mindspore.int32type_cast_op = transforms.TypeCast(mindspore.int32)# 定義一個函數,用于對文本進行分詞和填充def tokenize_and_pad(text):# 如果是Ascend設備,則使用特定的分詞參數if is_ascend:tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)else:tokenized = tokenizer(text)# 返回輸入ID和注意力掩碼return tokenized['input_ids'], tokenized['attention_mask']# 對數據集進行映射操作,應用分詞和填充函數,并指定輸入和輸出列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')# 如果是Ascend設備,則直接批處理數據集if is_ascend:dataset = dataset.batch(batch_size)else:# 如果不是Ascend設備,則使用填充的批處理,并指定填充信息dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id),'attention_mask': (None, 0)})# 返回處理后的數據集return dataset
昇騰NPU環境下暫不支持動態Shape,數據預處理部分采用靜態Shape處理:
# 從mindnlp.transformers模塊中導入BertTokenizer類
from mindnlp.transformers import BertTokenizer# 使用BertTokenizer的from_pretrained靜態方法創建一個分詞器實例
# 該方法會根據預訓練模型的名稱加載預訓練的權重和配置
# 在這個例子中,加載的是'bert-base-chinese'模型的分詞器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
輸出:
100%49.0/49.0?[00:00<00:00,?3.10kB/s]107k/0.00?[00:00<00:00,?103kB/s]263k/0.00?[00:00<00:00,?161kB/s]624/??[00:00<00:00,?62.9kB/s]
from_pretrained方法會從互聯網上下載預訓練的模型權重和配置,如果已經下載過,則會從本地緩存中加載。
tokenizer.pad_token_id
輸出:
0
# 使用SentimentDataset類創建訓練數據集,傳入訓練數據的路徑
dataset_train = process_dataset(SentimentDataset("data/train.tsv"), tokenizer)# 使用SentimentDataset類創建驗證數據集,傳入驗證數據的路徑
dataset_val = process_dataset(SentimentDataset("data/dev.tsv"), tokenizer)# 使用SentimentDataset類創建測試數據集,傳入測試數據的路徑,并且指定shuffle參數為False,表示不進行數據打亂
dataset_test = process_dataset(SentimentDataset("data/test.tsv"), tokenizer, shuffle=False)# 調用dataset_train對象的get_col_names方法
# 這個方法會返回數據集中的列名列表
dataset_train.get_col_names()
輸出:
['input_ids', 'attention_mask', 'labels']
# 調用dataset_train數據集的create_tuple_iterator()方法,創建一個元組迭代器
# 使用next()函數獲取迭代器的下一個元素,即數據集中的第一個元素
# 并將該元素的內容打印出來,這將顯示數據集中的一個樣本,包括其特征和標簽
print(next(dataset_train.create_tuple_iterator()))
輸出:
[Tensor(shape=[32, 64], dtype=Int64, value=
[[ 101, 1914, 1568 ... 0, 0, 0],[ 101, 872, 812 ... 0, 0, 0],[ 101, 5314, 872 ... 0, 0, 0],...[ 101, 6929, 872 ... 0, 0, 0],[ 101, 1343, 6859 ... 0, 0, 0],[ 101, 2428, 677 ... 0, 0, 0]]), Tensor(shape=[32, 64], dtype=Int64, value=
[[1, 1, 1 ... 0, 0, 0],[1, 1, 1 ... 0, 0, 0],[1, 1, 1 ... 0, 0, 0],...[1, 1, 1 ... 0, 0, 0],[1, 1, 1 ... 0, 0, 0],[1, 1, 1 ... 0, 0, 0]]), Tensor(shape=[32], dtype=Int32, value= [2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 2, 2, 2, 1, 1])]
1.4 模型構建
通過 BertForSequenceClassification
構建用于情感分類的 BERT 模型,加載預訓練權重,設置情感三分類的超參數自動構建模型。后面對模型采用自動混合精度操作,提高訓練的速度,然后實例化優化器,緊接著實例化評價指標,設置模型訓練的權重保存策略,最后就是構建訓練器,模型開始訓練。
# 從mindnlp.transformers模塊中導入BertForSequenceClassification和BertModel類
from mindnlp.transformers import BertForSequenceClassification, BertModel# 從mindnlp._legacy.amp模塊中導入auto_mixed_precision函數
from mindnlp._legacy.amp import auto_mixed_precision# 使用BertForSequenceClassification的from_pretrained靜態方法加載預訓練的BERT模型
# 指定num_labels參數為3,因為情感分類任務有3個標簽
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=3)# 使用auto_mixed_precision函數對模型進行自動混合精度訓練
# 'O1'表示使用16位浮點數進行部分訓練,以提高訓練速度和減少內存消耗
model = auto_mixed_precision(model, 'O1')# 創建一個Adam優化器實例,傳入模型的訓練參數和學習率
# 學習率設置為2e-5,這是一個常見的BERT模型學習率
optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5)
輸出:
The following parameters in checkpoint files are not loaded:
['cls.predictions.bias', 'cls.predictions.transform.dense.bias', 'cls.predictions.transform.dense.weight', 'cls.seq_relationship.bias', 'cls.seq_relationship.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.transform.LayerNorm.weight']
The following parameters in models are missing parameter:
['classifier.weight', 'classifier.bias']
模型有一堆參數沒有加載…不知道是否影響…
# 創建一個Accuracy指標實例,用于評估模型的準確性
metric = Accuracy()# 定義用于保存檢查點的回調函數
# CheckpointCallback將在每個epoch結束時保存檢查點,并指定保存路徑和檢查點文件名
# keep_checkpoint_max參數指定最多保留的檢查點文件數
ckpoint_cb = CheckpointCallback(save_path='checkpoint', ckpt_name='bert_emotect', epochs=1, keep_checkpoint_max=2)# BestModelCallback將在驗證集上評估模型性能,并在性能提升時保存最佳模型的檢查點
# auto_load參數設置為True,表示在訓練結束后自動加載最佳模型的檢查點
best_model_cb = BestModelCallback(save_path='checkpoint', ckpt_name='bert_emotect_best', auto_load=True)# 創建一個Trainer實例,用于訓練模型
# network參數指定要訓練的模型
# train_dataset參數指定訓練數據集
# eval_dataset參數指定驗證數據集
# metrics參數指定評估模型性能的指標
# epochs參數指定訓練的輪數
# optimizer參數指定優化器
# callbacks參數指定訓練過程中使用的回調函數列表
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
# 使用Trainer的run方法啟動模型訓練
# tgt_columns參數指定目標列名,即模型需要預測的標簽列名
trainer.run(tgt_columns="labels")
輸出:
The train will start from the checkpoint saved in 'checkpoint'.
Epoch?0:?100%302/302?[04:14<00:00,??2.11s/it,?loss=0.34553832]
Checkpoint: 'bert_emotect_epoch_0.ckpt' has been saved in epoch: 0.
Evaluate:?100%34/34?[00:16<00:00,??3.44s/it]
Evaluate Score: {'Accuracy': 0.9083333333333333}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 0.---------------
Epoch?1:?100%302/302?[02:41<00:00,??1.91it/s,?loss=0.19056101]
Checkpoint: 'bert_emotect_epoch_1.ckpt' has been saved in epoch: 1.
Evaluate:?100%34/34?[00:05<00:00,??6.80it/s]
Evaluate Score: {'Accuracy': 0.9611111111111111}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 1.---------------
Epoch?2:?100%302/302?[02:41<00:00,??1.91it/s,?loss=0.12954864]
The maximum number of stored checkpoints has been reached.
Checkpoint: 'bert_emotect_epoch_2.ckpt' has been saved in epoch: 2.
Evaluate:?100%34/34?[00:04<00:00,??8.05it/s]
Evaluate Score: {'Accuracy': 0.9833333333333333}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 2.---------------
Epoch?3:?100%302/302?[02:41<00:00,??1.90it/s,?loss=0.08371902]
The maximum number of stored checkpoints has been reached.
Checkpoint: 'bert_emotect_epoch_3.ckpt' has been saved in epoch: 3.
Evaluate:?100%34/34?[00:04<00:00,??7.65it/s]
Evaluate Score: {'Accuracy': 0.9916666666666667}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 3.---------------
Epoch?4:?100%302/302?[02:41<00:00,??1.91it/s,?loss=0.06113353]
The maximum number of stored checkpoints has been reached.
Checkpoint: 'bert_emotect_epoch_4.ckpt' has been saved in epoch: 4.
Evaluate:?100%34/34?[00:04<00:00,??7.82it/s]
Evaluate Score: {'Accuracy': 0.9935185185185185}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 4.---------------
Loading best model from 'checkpoint' with '['Accuracy']': [0.9935185185185185]...
---------------The model is already load the best model from 'bert_emotect_best.ckpt'.---------------
CPU times: user 23min 36s, sys: 13min 1s, total: 36min 37s
Wall time: 15min 51s
5輪訓練后,準確率達到了99.35%(相對于訓練數據集來說)
1.5 模型驗證
將驗證數據集加再進訓練好的模型,對數據集進行驗證,查看模型在驗證數據上面的效果,此處的評價指標為準確率。
# 創建一個Evaluator實例,用于評估模型性能
# network參數指定要評估的模型
# eval_dataset參數指定評估數據集
# metrics參數指定評估模型性能的指標
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)# 使用Evaluator的run方法評估模型性能
# tgt_columns參數指定目標列名,即模型需要預測的標簽列名
evaluator.run(tgt_columns="labels")
輸出:
Evaluate:?100%33/33?[00:08<00:00,??1.26s/it]
Evaluate Score: {'Accuracy': 0.9063706563706564}
在驗證數據集上的準確率為90.64%
1.6 模型推理
遍歷推理數據集,將結果與標簽進行統一展示。
# 創建一個SentimentDataset實例,用于推理數據
# 傳入推理數據的路徑
dataset_infer = SentimentDataset("data/infer.tsv")# 定義一個預測函數,接受文本和標簽(可選)作為輸入
def predict(text, label=None):# 定義一個標簽映射字典,將標簽ID轉換為對應的標簽名稱label_map = {0: "消極", 1: "中性", 2: "積極"}# 使用tokenizer對文本進行分詞,并將結果轉換為Tensor# Tensor是一個用于存儲多維數組的類text_tokenized = Tensor([tokenizer(text).input_ids])# 使用模型對文本進行預測,獲取logitslogits = model(text_tokenized)# 獲取預測標簽,即logits中最大值的索引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)# 導入Tensor類,用于存儲多維數組
from mindspore import Tensor# 遍歷dataset_infer數據集,使用predict函數對每個文本進行預測
# 并打印預測結果
for label, text in dataset_infer:predict(text, label)
輸出:
inputs: '我 要 客觀', predict: '中性' , label: '中性'
inputs: 'KAO 你 真是 說 廢話 嗎', predict: '消極' , label: '消極'
inputs: '口嗅 會', predict: '中性' , label: '中性'
inputs: '每次 是 表妹 帶 窩 飛 因為 窩路癡', predict: '中性' , label: '中性'
inputs: '別說 廢話 我 問 你 個 問題', predict: '消極' , label: '消極'
inputs: '4967 是 新加坡 那 家 銀行', predict: '中性' , label: '中性'
inputs: '是 我 喜歡 兔子', predict: '積極' , label: '積極'
inputs: '你 寫 過 黃山 奇石 嗎', predict: '中性' , label: '中性'
inputs: '一個一個 慢慢來', predict: '中性' , label: '中性'
inputs: '我 玩 過 這個 一點 都 不 好玩', predict: '消極' , label: '消極'
inputs: '網上 開發 女孩 的 QQ', predict: '中性' , label: '中性'
inputs: '背 你 猜 對 了', predict: '中性' , label: '中性'
inputs: '我 討厭 你 , 哼哼 哼 。 。', predict: '消極' , label: '消極'
1.7 自定義推理數據集
自己輸入推理數據,展示模型的泛化能力。
predict("家人們咱就是說一整個無語住了 絕絕子debuff")
predict("今天真是太倒霉了")
predict("今天天氣不錯")
輸出:
2. 小結
本文主要介紹了用MindSpore實現BERT對話情緒識別的過程。主要包括環境配置、數據集下載、加載和預處理,模型構建和訓練、模型驗證、模型推理和模型泛化能力測試等方面。