Заменить НЕИЗВЕСТНЫЕ слова на волшебное слово в МТ - PullRequest
0 голосов
/ 13 февраля 2020

Я работаю над системой машинного обучения ИИ-перевода, и я хочу сделать ее более адаптируемой, мой код теперь, когда слово новое, заменит UNK , что означает UNKNOWN и оставьте его, но я хочу скопировать то же слово и вставить его обратно вместо печати UNK , поэтому, если появляется новое слово, оно должно передать то же слово, что и перевод вместо UNK мой код выглядит следующим образом:

любые идеи, что я должен изменить:

# Adding the word 'UNK' to the end of the array (stands for UNKNOWN words)
    X_ix_to_word.append('UNK')

    # Creating the word-to-index dictionary from the array created above
    X_word_to_ix = {word:ix for ix, word in enumerate(X_ix_to_word)}

    # Converting each word to its index value
    for i, sentence in enumerate(X):
        for j, word in enumerate(sentence):
            if word in X_word_to_ix:
                X[i][j] = X_word_to_ix[word]
            else:
                X[i][j] = X_word_to_ix['UNK']

    y_ix_to_word = [word[0] for word in y_vocab]
    y_ix_to_word.insert(0, 'ZERO')
    y_ix_to_word.append('UNK')
    y_word_to_ix = {word:ix for ix, word in enumerate(y_ix_to_word)}
    for i, sentence in enumerate(y):
        for j, word in enumerate(sentence):
            if word in y_word_to_ix:
                y[i][j] = y_word_to_ix[word]
            else:
                y[i][j] = y_word_to_ix['UNK']
    return (X, len(X_vocab)+2, X_word_to_ix, X_ix_to_word, y, len(y_vocab)+2, y_word_to_ix, y_ix_to_word)

def load_test_data(source, X_word_to_ix, max_len):
    f = open(source, 'r')
    X_data = f.read()
    f.close()

    X = [text_to_word_sequence(x)[::-1] for x in X_data.split('\n') if len(x) > 0 and len(x) <= max_len]
    for i, sentence in enumerate(X):
        for j, word in enumerate(sentence):
            if word in X_word_to_ix:
                X[i][j] = X_word_to_ix[word]
            else:
                X[i][j] = X_word_to_ix['UNK']
    return X

1 Ответ

1 голос
/ 13 февраля 2020

Это непростая проблема.

Вы предлагаете заменить слова на уровне предварительной обработки данных. Для этого вам понадобится выравнивание слов, которое скажет вам, какие исходные слова соответствуют вашему целевому слову. Для этого есть такие инструменты, как FastAlign . Даже если у вас есть выравнивание, нет гарантии, что скопированное исходное слово будет в целевом словаре.

Некоторые люди пытались решить эту проблему на уровне моделирования и включают в свою сеть явные механизмы копирования (например, эта статья ), однако она делает сеть довольно сложной и дает лишь небольшое улучшение.

Наиболее распространенный обходной путь для этой проблемы - использование словарного запаса, такого как BPE или SentencePiece . С помощью этих методов, нечастые слова сегментируются на более мелкие единицы, так что в конце словарный запас ничего не выходит. Если слово одинаково как на стороне источника, так и на стороне цели (это часто происходит с собственными именами), оно будет сегментировано одинаково на стороне источника и цели, и модель узнает, что копирование фрагментов слова - это то, что обычно должен сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...