У меня уже установлен BERT, но я не знаю, как получить неконтекстные вложения слов.
Например:
input: 'Apple'
output: [1,2,23,2,13,...] #embedding of 'Apple'
Как я могу получить эти вложения слов?
Спасибо.
Я ищу какой-то метод, но ни один блог не написал способ.
BERT использует статические вложения подслов на своем первом уровне, где они суммируются с вложениями изученных позиций. Вы можете получить слой встраивания, позвонив model.embeddings.word_embeddings
. Вы должны иметь возможность передавать индексы, которые вы получаете от BertTokenizer
, в этот слой и получать вложения подслов.
Однако есть несколько предостережений со статическими вложениями: это не вложения слов, а подслова, которые BERT использует внутри (менее частые слова сегментируются на более мелкие единицы). Вложения имеют гораздо худшее качество, чем стандартные вложения слов (Word2Vec, FastText), потому что они обучены сочетаться с вложениями положения и служить в более поздних слоях, а не как отдельные вложения.
Существуют также методы получения высококачественных вложений слов от BERT (и подобных моделей). Для этого требуются обучающие данные и некоторые вычисления. AFAIK лучшие методы:
Интерпретация предварительно обученных контекстуализированных представлений посредством редукции к статическим вложениям (Боммасани и др., ACL 2020).
любимый.
import torch
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModel.from_pretrained("bert-base-uncased")
# get the word embedding from BERT
def get_word_embedding(word:str):
input_ids = torch.tensor(tokenizer.encode(word)).unsqueeze(0) # Batch size 1
# print(input_ids)
outputs = model(input_ids)
last_hidden_states = outputs[0] # The last hidden-state is the first element of the output tuple
# output[0] is token vector
# output[1] is the mean pooling of all hidden states
return last_hidden_states[0][1]
Спасибо за ваш ответ. Это поможет мне решить проблему!