Именно так и была обучена модель BERT : замаскируйте несколько случайных слов в предложении и заставьте свою сеть предсказать эти слова.Так что да, это возможно.И нет, необязательно иметь список предлагаемых слов в качестве учебного материала.Однако эти предлагаемые слова должны быть частью общего словаря, с которым этот BERT был обучен.
Я адаптировал этот ответ , чтобы показать, как может работать функция завершения.
# install this package to obtain the pretrained model
# ! pip install -U pytorch-pretrained-bert
import torch
from pytorch_pretrained_bert import BertTokenizer, BertForMaskedLM
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
model.eval(); # turning off the dropout
def fill_the_gaps(text):
text = '[CLS] ' + text + ' [SEP]'
tokenized_text = tokenizer.tokenize(text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [0] * len(tokenized_text)
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])
with torch.no_grad():
predictions = model(tokens_tensor, segments_tensors)
results = []
for i, t in enumerate(tokenized_text):
if t == '[MASK]':
predicted_index = torch.argmax(predictions[0, i]).item()
predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]
results.append(predicted_token)
return results
print(fill_the_gaps(text = 'I bought an [MASK] because its rainy .'))
print(fill_the_gaps(text = 'Im sad because you are [MASK] .'))
print(fill_the_gaps(text = 'Im worried because you are [MASK] .'))
print(fill_the_gaps(text = 'Im [MASK] because you are [MASK] .'))
Символ [MASK]
обозначает пропущенные слова (их может быть любое количество).[CLS]
и [SEP]
являются специальными токенами BERT.Выходные данные для этих конкретных отпечатков:
['umbrella']
['here']
['worried']
['here', 'here']
Дублирование не удивительно - NN трансформатора, как правило, хороши при копировании слов.И с семантической точки зрения эти симметричные продолжения выглядят действительно очень вероятными.
Более того, если пропущено не случайное слово, а именно последнее слово (или последние несколько слов), вы можете использовать любую языковую модель (например, другую известную языковую модель SOTA, GPT-2 ), чтобы завершить предложение.