doc2vec (gensim) infer_vector нуждается в дополненном по размеру предложении? - PullRequest
0 голосов
/ 29 мая 2018

Согласно оригинальному документу Распределенные представления предложений и документов , вывод по невидимому абзацу можно сделать с помощью

, обучающего «этап вывода», чтобы получить векторы абзаца D для новых абзацев (никогда раньше не видел), добавив больше столбцов в D и градиент, уменьшающийся на D , удерживая W, U, b исправлено

Эта стадия вывода может быть выполнена в генсиме infer_vector().Если у меня есть window = 5 для модели doc2vec, и я пытаюсь вывести абзац, некоторые предложения которого len(sentence) < 5.

, такие как:

model = Doc2Vec(window=5) paragraph = [['I', 'am', 'groot'], ['I', 'am', 'groot', 'I', 'am', 'groot']] model.infer_vector(paragraph)

В этомв таком случае, должен ли я предварительно дополнить свой выводящий вектор специальным символом слова NULL, чтобы вся длина предложений в абзаце была больше размера окна?

, таких как:

paragraph = [['I', 'am', 'groot', NULL, NULL], ['I', 'am', 'groot', 'I', 'am', 'groot']]

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вам никогда не нужно делать какие-либо явные дополнения.

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

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

0 голосов
/ 29 мая 2018

Я обнаружил, что gensim автоматически предварительно заполняет документы как на этапе обучения, так и на этапе вывода.

gensim.models.doc2vec.train_document_dm_concat

    null_word = model.vocab['\0']
    pre_pad_count = model.window
    post_pad_count = model.window
    padded_document_indexes = (
        (pre_pad_count * [null_word.index])  # pre-padding
        + [word.index for word in word_vocabs if word is not None]  # elide out-of-Vocabulary words
        + (post_pad_count * [null_word.index])  # post-padding
    )
...