Как сделать генерацию перефразирования с помощью BERT/ GPT-2
Я очень стараюсь понять, как сделать генерацию перефразирования с помощью BERT/GPT-2. Я не могу понять, как мне это сделать. Не могли бы вы предоставить мне какие-либо ресурсы, где я смогу сделать модель генерации перефразирования?«На входе будет предложение, а на выходе - перефразировать предложение»
3 ответа
Вот мой рецепт тренировки перефразатора:
Вместо BERT (только кодировщик) или GPT (только декодер) используйте модель seq2seq как с кодировщиком, так и с декодером, например T5, BART или Pegasus. Я предлагаю использовать многоязычную модель T5, которая была предварительно обучена 101 языку. Если вы хотите загрузить вложения для вашего собственного языка (вместо использования всего 101), вы можете следовать этому рецепту .
Найдите корпус перефразирований для вашего языка и предметной области. Для английского языка хорошими кандидатами являются ParaNMT, PAWS и QQP. Корпус под названием Tapaco, извлеченный из Tatoeba, представляет собой корпус перефразирования, охватывающий 73 языка, поэтому это хорошая отправная точка, если вы не можете найти корпус перефразирования для своего языка.
Настройте свою модель на этом корпусе. Код может быть примерно таким:
import torch
from transformers import T5ForConditionalGeneration, T5Tokenizer
# use here a backbone model of your choice, e.g. google/mt5-base
backbone_model = 'cointegrated/rut5-base-multitask'
model = T5ForConditionalGeneration.from_pretrained(backbone_model)
tokenizer = T5Tokenizer.from_pretrained(backbone_model)
model.cuda();
optimizer = torch.optim.Adam(params=[p for p in model.parameters() if p.requires_grad], lr=1e-5)
# todo: load the paraphrasing corpus and define the get_batch function
for i in range(100500):
xx, yy = get_batch(mult=mult)
x = tokenizer(xx, return_tensors='pt', padding=True).to(model.device)
y = tokenizer(yy, return_tensors='pt', padding=True).to(model.device)
# do not force the model to predict pad tokens
y.input_ids[y.input_ids==0] = -100
loss = model(
input_ids=x.input_ids,
attention_mask=x.attention_mask,
labels=y.input_ids,
decoder_attention_mask=y.attention_mask,
return_dict=True
).loss
loss.backward()
optimizer.step()
optimizer.zero_grad()
model.save_pretrained('my_paraphraser')
tokenizer.save_pretrained('my_paraphraser')
Более полную версию этого кода можно найти в этой записной книжке .
После обучения модель можно использовать следующим образом:
from transformers import pipeline
pipe = pipeline(task='text2text-generation', model='my_paraphraser')
print(pipe('Here is your text'))
# [{'generated_text': 'Here is the paraphrase or your text.'}]
Если вы хотите, чтобы ваши пересказы были более разнообразными, вы можете управлять процессом генерации, используя такие аргументы, как
print(pipe(
'Here is your text',
encoder_no_repeat_ngram_size=3, # make output different from input
do_sample=True, # randomize
num_beams=5, # try more options
max_length=128, # longer texts
))
Наслаждаться!
вы можете использовать перефразирование T5 для генерации перефразирования
Как бы то ни было, перефразируйте, что вы получили из приведенного выше кода, который идет последовательно, например, ваш текст = «Кохли, индийский игрок в крикет», после перефразирования он идет в такой последовательности, как «Кохли, индийский игрок в крикет», что означает, что я хочу SOV(объект субъектного глагола).