предварительно обученный Word2Vec с LSTM, предсказать следующее слово в предложении - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть текстовый корпус.Для предварительной обработки данных я векторизовал весь текст, используя gensim Word2Vec.Я не понимаю, что я делаю совершенно неправильно.За основу я взял эту дискуссию (и хороший учебник) Предсказание следующего слова .Код: Исходный код .

В качестве ввода у меня есть строки предложений.Я хочу взять каждую строку, затем взять слово [0] этой строки -> слово предсказания [1].Затем с помощью слова [0] и слова [1] можно предсказать слово [3] и т. Д. До конца строки.

В этом руководстве каждый раз прогнозируется фиксированная длина слов.Что я делаю:

def on_epoch_end(epoch, _):
    print('\nGenerating text after epoch: %d' % epoch)
    for sentence in inpt:
        word_first=sentence.split()[0]
        sample = generate_next(word_first, len(sentence))
        print('%s... -> %s' % (word_first, sample))

Я беру первое слово и использую его для генерации всего следующего.И в качестве второго параметра я даю длину предложения (не num_generated=10), как в учебнике.Но это мне совсем не помогает.Каждый раз, когда я получаю прогнозируемую последовательность слов со случайной (на мой взгляд) длиной.

Что я делаю не так и как это исправить?

1 Ответ

0 голосов
/ 17 февраля 2019

Мой сценарий тестирования:

texts = [
    'neural network',
    'this',
    'it is very',
]
for text in texts:
  print('%s... -> %s' % (text, generate_next(text, num_generated=5)))

Выход:

neural network... -> neural network that making isometry adopted riskaverting
this... -> this dropout formalize locally secondly spectrogram
it is very... -> it is very achievable machinery our past possibly

Вы можете видеть, что длина вывода равна num_generated плюс длина входа.

Полагаю, вы ожидаете, что все выходные данные будут иметь длину num_generated.Но это не так, как работает generate_next.Эта функция фактически генерирует num_generated слов и добавляет их к исходному вводу.

Если вы хотите получить вывод фиксированной длины, попробуйте:

generate_next(text, num_generated=5-len(text.split()))
...