2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Im heutigen Bereich der Verarbeitung natürlicher Sprache (NLP) ist die Emotionserkennung ein sehr wichtiges Anwendungsszenario. Ob im intelligenten Kundenservice, in der Social-Media-Analyse oder im Bereich Emotional Computing: Die genaue Identifizierung der Emotionen der Benutzer kann das Benutzererlebnis und den Intelligenzgrad des Systems erheblich verbessern. BERT (Bidirektionale Encoder-Repräsentationen von Transformers) hat als leistungsstarkes vorab trainiertes Sprachmodell seine hervorragende Leistung bei mehreren NLP-Aufgaben unter Beweis gestellt. In diesem Blog stellen wir detailliert vor, wie das BERT-Modell verwendet werden kann, um die Erkennung von Gesprächsemotionen basierend auf dem MindSpore-Framework zu erreichen. Helfen Sie Ihnen, diese Technik mit Schritt-für-Schritt-Codebeispielen und detaillierten Erklärungen zu beherrschen.
BERT (Bidirektionale Encoder-Repräsentationen von Transformers) ist ein Transformer-basiertes bidirektionales Encoder-Darstellungsmodell. Es erfasst hauptsächlich Darstellungen auf Wort- und Satzebene durch zwei Vortrainingsaufgaben: Masked Language Model (MLM) und Next Sentence Prediction (NSP).
Nachdem BERT vorab trainiert wurde, kann es für eine Vielzahl nachgelagerter Aufgaben verwendet werden, wie z. B. Textklassifizierung, Ähnlichkeitsbeurteilung, Leseverständnis usw.
Im Teil zur Vorbereitung des Datensatzes haben wir den vom Baidu Feipiao-Team bereitgestellten Roboter-Chat-Datensatz heruntergeladen und dekomprimiert. Dieser Datensatz wurde vorverarbeitet und enthält Emotionsbezeichnungen. Jede Datenzeile besteht aus einer Beschriftung und einem wortsegmentierten Text. Die Bezeichnung stellt die Emotionskategorie dar (0 bedeutet negativ, 1 bedeutet neutral, 2 bedeutet positiv), und der Text ist der Gesprächsinhalt des Benutzers. Durch die Verwendung dieser strukturierten Daten können wir Stimmungsklassifizierungsaufgaben bequemer durchführen.
# 下载数据集
!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
Das Datensatzformat ist wie folgt:
label--text_a
0--谁骂人了?我从来不骂人,我骂的都不是人,你是人吗 ?
1--我有事等会儿就回来和你聊
2--我见到你很高兴谢谢你帮我
Das Laden und Vorverarbeiten von Daten sind entscheidende Schritte im maschinellen Lernprozess.wir verwendetenGeneratorDataset
um die Daten zu laden und Mapping-Operationen zu verwenden, um den Text in ein für das Modell akzeptables Format zu konvertieren.Konkret haben wir verwendetBertTokenizer
Tokenisieren Sie den Text in eine Vokabular-ID und führen Sie eine Pad-Operation durch. Der Zweck besteht darin, sicherzustellen, dass die Länge aller Eingabesequenzen konsistent ist, wodurch die Trainingseffizienz und die Modellleistung verbessert werden.
import numpy as np
from mindspore.dataset import text, GeneratorDataset, transforms
from mindnlp.transformers import BertTokenizer
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)
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']
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')
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
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)
Im Modellbauteil haben wir verwendetBertForSequenceClassification
um Emotionsklassifizierungsaufgaben durchzuführen. Dieses vorab trainierte Modell wurde an großen Korpora trainiert und verfügt über starke Sprachverständnisfähigkeiten. Durch das Laden vorab trainierter Gewichte können wir die Leistung des Modells bei Emotionsklassifizierungsaufgaben erheblich verbessern. Gleichzeitig verwenden wir die Auto-Mixed-Precision-Technologie, die nicht nur den Trainingsprozess beschleunigt, sondern auch die Videospeichernutzung reduziert und so ein effizienteres Training bei begrenzten Hardwareressourcen ermöglicht.
Optimierer und Bewertungsmetriken sind wichtige Komponenten im Modelltraining. Wir haben uns für den Adam-Optimierer entschieden, weil er bei der Verarbeitung großer Datenmengen und komplexer Modelle eine hervorragende Leistung bietet. In Bezug auf Bewertungsindikatoren verwenden wir Genauigkeit, um die Leistung des Modells zu messen. Mit diesen Einstellungen können wir sicherstellen, dass das Modell während des Trainings kontinuierlich optimiert wird und eine gute Leistung auf dem Validierungssatz erzielt.
Rückruffunktionen spielen eine wichtige Rolle im Modelltrainingsprozess. Wir richten zwei Rückruffunktionen ein:CheckpointCallback
UndBestModelCallback
. Ersteres wird verwendet, um regelmäßig die Gewichte des Modells zu speichern, während letzteres automatisch die Gewichte des Modells mit der besten Leistung lädt. Durch diese Rückruffunktionen stellen wir sicher, dass wichtige Modellparameter während des Trainings nicht verloren gehen und dass immer das leistungsstärkste Modell für Inferenz und Bewertung verwendet wird.
from mindnlp.transformers import BertForSequenceClassification
from mindspore import nn
from mindnlp._legacy.amp import auto_mixed_precision
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()
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])
trainer.run(tgt_columns="labels")
Im Abschnitt zur Modellvalidierung verwenden wir den Validierungsdatensatz, um die Leistung des Modells zu bewerten. Durch die Berechnung der Genauigkeit des Modells anhand des Validierungssatzes können wir die Generalisierungsfähigkeit und die tatsächliche Wirkung des Modells verstehen. Dieser Schritt ist sehr wichtig, da er uns dabei helfen kann, mögliche Probleme im Modelltrainingsprozess zu entdecken und entsprechende Anpassungen und Optimierungen vorzunehmen.
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)
evaluator.run(tgt_columns="labels")
Der Abschnitt „Modellinferenz“ zeigt, wie Sie das trainierte Modell verwenden, um eine Stimmungsklassifizierung für neue Daten durchzuführen.Wir haben a definiertpredict
Funktion, die eine Emotionsvorhersage durch Eingabe von Text durchführt und Vorhersageergebnisse ausgibt. Dieser Schritt demonstriert die praktischen Anwendungsmöglichkeiten des Modells und überprüft die Generalisierungsleistung des Modells.
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)
for label, text in dataset_infer:
predict(text, label)
Abschließend zeigen wir, wie Sie das Modell zur Emotionserkennung bei benutzerdefinierten Eingaben verwenden. Dieser Schritt demonstriert nicht nur die praktischen Anwendungsmöglichkeiten des Modells, sondern überprüft auch die Leistung des Modells unter verschiedenen Eingaben. Auf diese Weise können wir die Generalisierungsfähigkeit und die tatsächliche Wirkung des Modells besser verstehen.
predict("家人们咱就是说一整个无语住了 绝绝子叠buff")