[PYTHON] Erstellen Sie einen japanischen Satzvektor mit BertModel von huggingface / transformers

Ich werde vorstellen, wie man aus vorgelernten BERT einen japanischen Satzvektor erstellt.

Umgebung

Verfahren

1. Modell laden


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')

2. Vorbereitung der Eingabedaten

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"]

3. Vorverarbeitung (Wort-ID-Konvertierung, Auffüllen, spezielle Token-Zuweisung)

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]']

4. Anweisungsvektorisierung mit BERT

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.

Referenzseite

Recommended Posts

Erstellen Sie einen japanischen Satzvektor mit BertModel von huggingface / transformers
[Mit japanischem Modell] Satzvektormodell empfohlen für Personen, die 2020 natürliche Sprache verarbeiten
Koexistenz von Fcitx und Zoom ~ Mit japanischer Lokalisierung ~
Erstellen Sie ein Bild mit Zeichen mit Python (Japanisch)
Erstellen Sie eine Tabelle mit IPython Notebook