Переводчики Huggingface MarianMT теряют контент, в зависимости от модели

Контекст

Я использую MarianMT von Huggingface через Python, чтобы переводить текст из источника на целевой язык.

Ожидаемое поведение

Я ввожу последовательность в модель MarianMT и получаю ее обратный перевод. Для этого я использую соответствующую языковую модель и токенизатор. Все предложения, которые я ввожу, также возвращаются. Предложения рассматриваются как последовательность.

Текущее поведение

В зависимости от языковой модели модель не переводит все, а только возвращает части. В этом примере отсутствует последнее предложение:

Оригинал (немецкий): Ein Nilpferd lief im Dschungel rum und musste aufs WC. Da traf es einen Kakadu und fragte nach dem Weg. Der sagte wenn du Kaka musst, dann pass mal ganz kurz auf. Ich sag dir wo du hingehen musst, ich kenn mich hier gut aus.

Результат (английский): бегемот бегал по джунглям и вынужден был сходить в туалет. Был какаду и спросил дорогу. Он сказал, что если тебе нужно кака, то берегись минутку. Я скажу вам, куда вам нужно идти, я здесь знаю свой путь.

Результат (голландский): Een nijlpaard liep rond in de jungle en moest naar het toilet ... en een kaketoe vroeg naar de weg ... die zei dat als je Kaka moest, ik even moest oppassen.

Текущий код

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM


def translate_text(input, source, target):

    # Prepare output
    output = ""

    model = AutoModelForSeq2SeqLM.from_pretrained("Helsinki-NLP/opus-mt-" + source + "-" + target)
    tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-" + source + "-" + target)

    inputs = tokenizer.encode(input[:512], return_tensors="pt", padding='longest')
    outputs = model.generate(inputs, max_length=4000, num_beams=4, early_stopping=True)

    for t in [tokenizer.convert_ids_to_tokens(s) for s in outputs.tolist()[0]]:
        output = output + t.replace("▁", " ").replace("</s>", "")

    output.replace("<pad>", "")

    return output


print(translate_text("Ein Nilpferd lief im Dschungel rum und musste aufs WC. Da traf es einen Kakadu und fragte nach dem Weg. Der sagte wenn du Kaka musst, dann pass mal ganz kurz auf. Ich sag dir wo du hingehen musst, ich kenn mich hier gut aus.", "de", "nl"))
print(translate_text("Ein Nilpferd lief im Dschungel rum und musste aufs WC. Da traf es einen Kakadu und fragte nach dem Weg. Der sagte wenn du Kaka musst, dann pass mal ganz kurz auf. Ich sag dir wo du hingehen musst, ich kenn mich hier gut aus.", "de", "en"))

Нужна помощь

Что я скучаю? Почему отсутствуют некоторые части последовательности?


person Lorento Palanomi    schedule 22.12.2020    source источник
comment
Что произойдет, если вы попробуете использовать "Ein Nilpferd ... вместо "in Nilpferd ...?   -  person Adam Bittlingmayer    schedule 22.12.2020
comment
Благодарим за выделение опечатки, которую я исправил выше. Но это не меняет описанного поведения!   -  person Lorento Palanomi    schedule 22.12.2020
comment
Вы знаете, как Opus MT сегментировал данные обучения? Видела ли модель такие последовательности при обучении?   -  person Adam Bittlingmayer    schedule 22.12.2020
comment
Насколько я знаю, это приговор-приговор. Это означает, что модель фактически не знает о других последовательностях предложений. Но если я разбиваю предложения до их перевода, я теряю важный контекст для перевода!   -  person Lorento Palanomi    schedule 22.12.2020
comment
Когда я разбиваю предложения, все работает так, как ожидалось. Но я потеряю контекст таким образом: ['Er liep een nijlpaard rond in de jungle en hij moest naar het toilet.', 'Toen ontmoette hij een kaketoe en vroeg naar de weg.', 'Hij zei dat als je Kaka moest, je even moet opletten. ',' Ik vertel je waar je heen moet. Ik ken het hier goed. ']   -  person Lorento Palanomi    schedule 22.12.2020
comment
Если модель не была обучена контексту, она все равно не будет знать, что с ней делать.   -  person Adam Bittlingmayer    schedule 22.12.2020


Ответы (1)


В этом случае вы можете перевести его на английский язык:

de_en = translate_text("Ein Nilpferd lief im Dschungel rum und musste aufs WC. Da traf es einen Kakadu und fragte nach dem Weg. Der sagte wenn du Kaka musst, dann pass mal ganz kurz auf. Ich sag dir wo du hingehen musst, ich kenn mich hier gut aus.", "de", "en")

en_nl = translate_text(de_en, "en", "nl")

print(en_nl)

Результат: Een nijlpaard rende rond in de jungle en moest naar het toilet. Er was een kaketoe en vroeg om de weg. Hij zei als je moet Kaka, dan uitkijken voor een minuut. Ik zal je vertellen waar je moet gaan, Ik weet mijn weg hier.


Последнее предложение не пропало, но качество ниже. Модели De- ›En и En-› Nl вероятно имели гораздо более длинные предложения в своих обучающих данных (вы никогда не знаете), чем De- ›Nl, и поэтому последнее предложение не исчезло из перевод. Но в то же время перевод на английский может вызвать некоторую потерю информации (например, du / Sie - ›you).

Учитывая название модели (обученной на корпусе OPUS), насколько большими могут быть предложения теоретически, вы можете увидеть здесь: http://opus.nlpl.eu/Europarl/v8/de-nl_sample.html или здесь: http://opus.nlpl.eu/MultiParaCrawl/v7.1/de-nl_sample.html; или в других примерах de-nl на opus.nlpl.eu

Дополнительная информация доступна здесь: https://github.com/Helsinki-NLP/Opus-MT < / а>

tl; dr Тот факт, что эти модели переводят несколько предложений, склеенных вместе, скорее всего, является побочным эффектом, на который не следует полагаться.

person Bohdan I    schedule 23.12.2020