Ich werde vorstellen, wie man aus vorgelernten BERT einen japanischen Satzvektor erstellt.
import torch
from transformers.tokenization_bert_japanese import BertJapaneseTokenizer
from transformers import BertModel
#Japanischer Tokenizer
tokenizer = BertJapaneseTokenizer.from_pretrained('bert-base-japanese')
#Vorgelernte Bert
model = BertModel.from_pretrained('bert-base-japanese')
Diesmal haben wir eine Liste mit 3 Sätzen erstellt
input_batch = \
["Von den Oberschenkeln und Oberschenkeln",
"Der Kunde nebenan ist ein Kunde, der oft Kakis isst",
"Direktor des Tokioter Patent- und Lizenzbüros"]
Wenn Sie [batch_encode_plus] verwenden (https://huggingface.co/transformers/main_classes/tokenizer.html#transformers.PreTrainedTokenizer.batch_encode_plus), wird es von der Textliste zum Mini-Batch für die Modelleingabe vorverarbeitet.
pad_to_max_length
ist eine Padding-Option.
encoded_data = tokenizer.batch_encode_plus(
input_batch, pad_to_max_length=True, add_special_tokens=True)
Ergebnis
Bitte beachten Sie, dass der Wörterbuchtyp zurückgegeben wird.
input_ids
ist die Wort-ID.
{'input_ids': [[2, 340, 28480, 28480, 28, 18534, 28, 18534, 5, 859, 3, 0],
[2, 2107, 5, 1466, 9, 1755, 14983, 761, 28489, 1466, 75, 3],
[2, 391, 6192, 3591, 600, 3591, 5232, 3, 0, 0, 0, 0]],
'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]]}
Übrigens, wenn Sie überprüfen, wie es tokenisiert wurde, wird es wie folgt sein.
input_ids = torch.tensor(encoded_data["input_ids"])
tokenizer.convert_ids_to_tokens(input_ids[0].tolist())
Ergebnis
Spezielle Token werden ordnungsgemäß gewährt.
['[CLS]', 'Su', '##Ebenfalls', '##Ebenfalls', 'Ebenfalls', 'EbenfallsEbenfalls', 'Ebenfalls', 'EbenfallsEbenfalls', 'von', 'Zuhause', '[SEP]', '[PAD]']
Geben Sie die tensorisierten input_ids
in BERT ein.
Gemäß der offiziellen Dokumentation (https://huggingface.co/transformers/model_doc/bert.html#transformers.BertModel) gibt das Modell einen Taple zurück. Das erste Element ist der verborgene Zustandsvektor der letzten Ebene. Rufen Sie ihn also mit "output [0]" ab.
outputs = model(input_ids)
last_hidden_states = outputs[0]
print(last_hidden_states.size())
# torch.Size([3, 12, 768])
Betrachtet man die Größe des Ausgabevektors, so ist dies (Mini-Batch-Größe, Serienlänge, Anzahl der Vektordimensionen). ** Ich möchte einen Satzvektor aus dem [CLS] erstellen, der am Anfang des eingegebenen Textes ** hinzugefügt wird. Extrahieren Sie ihn also wie folgt.
sentencevec = last_hidden_states[:,0,:]
print(sentencevec.size())
# torch.Size([3, 768])
Dies ist abgeschlossen.
Recommended Posts