DzenIT

HOME ZEN IT SOFT APK LIVE GAME OTHER W CONTACT SEARCH

Нейронная сеть для выполнения перефразировки фразы

Если вам нужно качественно перефразировать фразу, можно использовать метод back-translation, переводим на английский, потом обратно на русский. Чтобы избежать повторения одной и той же фразы, модельный переводчик может запретить воспроизводить n-грамм (токен), найденные в оригинальном предложении.

Введенная фраза

Так же, как эта чашка, — сказал Нан-ин, — Вы полны Ваших собственных мнений и размышлений

Результат

Как и в этой чаше, сказал Нань Ин, вы полны собственных мыслей и желаний."

Сам код в colab

!nvidia-smi4
!pip install transformers
!pip install sacremoses
import torch
from transformers import FSMTModel, FSMTTokenizer, FSMTForConditionalGeneration
tokenizer = FSMTTokenizer.from_pretrained("facebook/wmt19-en-ru")
model = FSMTForConditionalGeneration.from_pretrained("facebook/wmt19-en-ru")
inverse_tokenizer = FSMTTokenizer.from_pretrained("facebook/wmt19-ru-en")
inverse_model = FSMTForConditionalGeneration.from_pretrained("facebook/wmt19-ru-en")
model.cuda();
inverse_model.cuda();

def paraphrase(text, gram=4, num_beams=5, **kwargs):
    """ Generate a paraphrase using back translation. 
    Parameter `gram` denotes size of token n-grams of the original sentence that cannot appear in the paraphrase.
    """
    input_ids = inverse_tokenizer.encode(text, return_tensors="pt")
    with torch.no_grad():
        outputs = inverse_model.generate(input_ids.to(inverse_model.device), num_beams=num_beams, **kwargs)
    other_lang = inverse_tokenizer.decode(outputs[0], skip_special_tokens=True)
    # print(other_lang)
    input_ids = input_ids[0, :-1].tolist()
    bad_word_ids = [input_ids[i:(i+gram)] for i in range(len(input_ids)-gram)]
    input_ids = tokenizer.encode(other_lang, return_tensors="pt")
    with torch.no_grad():
        outputs = model.generate(input_ids.to(model.device), num_beams=num_beams, bad_words_ids=bad_word_ids, **kwargs)
    decoded = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return decoded
	
text = input('Enter text:\n ')
print(paraphrase(text, gram=3, do_sample=False))

Закомментировав строки ниже, можно обойтись традиционным процессором вместо графической карты

 #model.cuda();
#inverse_model.cuda();

Изучить этот код можно самостоятельно в colab

Используя данный код можно даже целые тексты перефразировать построчно. Нужно лишь добавить текстовый файл себе в проект и прописать в конце код:

import time
f = open("text.txt", "r", encoding='utf-8')
f2 = open("new_text_721.txt", "a", encoding='utf-8')
count = 0
for line in f:
    try:
        print(line)
        print (paraphrase(line, gram=3, do_sample=False))
        f2.write(paraphrase(line, gram=3, do_sample=False) + '\n')
        time.sleep(0.5)
        count += 1
        print(count)
    except:
        print(line)
        print (paraphrase(line, gram=3, do_sample=False))
        f2.write(paraphrase(line, gram=3, do_sample=False) + '\n')
        time.sleep(0.5)
        count += 1
        print(count)


f2.close()  
print(count)
try и except добавлены, т.к. были замечены непредвиденные ошибки в выполнении, а счетчик count поможет определить на какой строке мы остановились