[PYTHON] Créez un vecteur de phrase japonais avec BertModel of huggingface / transformers

Je vais vous présenter comment créer un vecteur de phrase japonais à partir de BERT pré-appris.

environnement

procédure

1. Chargement du modèle


import torch
from transformers.tokenization_bert_japanese import BertJapaneseTokenizer
from transformers import BertModel 

#Tokenizer japonais
tokenizer = BertJapaneseTokenizer.from_pretrained('bert-base-japanese')
#Bert pré-appris
model = BertModel.from_pretrained('bert-base-japanese')

2. Préparation des données d'entrée

Cette fois, nous avons préparé une liste contenant 3 phrases

input_batch = \
    ["Des cuisses et des cuisses", 
    "Le client d'à côté est un client qui mange souvent des kakis",
    "Directeur du Bureau des brevets et des licences de Tokyo"]

3. Prétraitement (conversion d'identifiant de mot, remplissage, attribution spéciale de jetons)

Si vous utilisez batch_encode_plus, il effectuera un prétraitement de la liste de texte vers le mini-lot pour l'entrée du modèle. pad_to_max_length est une option de remplissage.

encoded_data = tokenizer.batch_encode_plus(
input_batch, pad_to_max_length=True, add_special_tokens=True)

résultat Veuillez noter que le type de dictionnaire sera renvoyé. ʻInput_ids` est un identifiant de mot.

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

En passant, si vous vérifiez comment il a été tokenisé, ce sera comme suit.

input_ids = torch.tensor(encoded_data["input_ids"])
tokenizer.convert_ids_to_tokens(input_ids[0].tolist())

résultat

Les jetons spéciaux sont correctement accordés.

['[CLS]', 'Su', '##Aussi', '##Aussi', 'Aussi', 'AussiAussi', 'Aussi', 'AussiAussi', 'de', 'domicile', '[SEP]', '[PAD]']

4. Vectorisation des instructions avec BERT

Entrez les ʻinput_ids` tensorisés dans BERT.

Selon la documentation officielle (https://huggingface.co/transformers/model_doc/bert.html#transformers.BertModel), le modèle renvoie un taple. Puisque le premier élément devient le vecteur d'état caché de la couche finale, il est extrait avec ʻoutputs [0] `.

outputs = model(input_ids)
last_hidden_states = outputs[0]
print(last_hidden_states.size())
# torch.Size([3, 12, 768])

En regardant la taille du vecteur de sortie, c'est (taille du mini-lot, longueur de la série, nombre de dimensions du vecteur). ** Je veux créer un vecteur de phrase à partir du [CLS] ajouté au début du texte saisi **, donc extrayez-le comme suit.

sentencevec = last_hidden_states[:,0,:]
print(sentencevec.size())
# torch.Size([3, 768])

C'est tout ce qu'on peut en dire.

Page de référence

Recommended Posts

Créez un vecteur de phrase japonais avec BertModel of huggingface / transformers
[Avec modèle japonais] Modèle vectoriel de phrases recommandé pour les personnes qui traitent le langage naturel en 2020
Coexistence de Fcitx et Zoom ~ Avec localisation japonaise ~
Créer une image avec des caractères avec python (japonais)
Créer une table avec le notebook IPython