Doc2Vec: вывести наиболее похожий вектор из ConcatenatedDocvecs - PullRequest
0 голосов
/ 14 января 2019

Я генерирую Doc2Vec для встраивания DataFrame Pandas, следуя предоставленным инструкциям здесь

from gensim.models import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from gensim.test.test_doc2vec import ConcatenatedDoc2Vec
import gensim.models.doc2vec
from collections import OrderedDict
import pandas as pd
import numpy as np

cube_embedded =  # pandas cube
# convert the cube to documents
alldocs = [TaggedDocument(doc, [i]) for i, doc in enumerate(cube_embedded.values.tolist())]

# train models
simple_models = [
    # PV-DBOW plain
    Doc2Vec(dm=0, vector_size=100, negative=5, hs=0, min_count=2, sample=0, epochs=20, workers=cores),
    # PV-DM w/ default averaging; a higher starting alpha may improve CBOW/PV-DM modes
    Doc2Vec(dm=1, vector_size=100, window=10, negative=5, hs=0, min_count=2, sample=0, epochs=20, workers=cores, alpha=0.05, comment='alpha=0.05'),
    # PV-DM w/ concatenation - big, slow, experimental mode window=5 (both sides) approximates paper's apparent 10-word total window size
    Doc2Vec(dm=1, dm_concat=1, vector_size=100, window=5, negative=5, hs=0, min_count=2, sample=0, epochs=20, workers=cores),
]

for d2v_model in simple_models:
    d2v_model.build_vocab(alldocs)
    d2v_model.train(alldocs, total_examples=d2v_model.corpus_count, epochs=d2v_model.epochs)

models_by_name = OrderedDict((str(d2v_model), d2v_model) for d2v_model in simple_models)
models_by_name['dbow+dmm'] = ConcatenatedDoc2Vec([simple_models[0], simple_models[1]])
models_by_name['dbow+dmc'] = ConcatenatedDoc2Vec([simple_models[0], simple_models[2]])

Учитывая вектор документа V, если я пытаюсь вывести наиболее похожие документы на вектор документа V из модели ConcatenatedDocvecs, я получаю следующую ошибку:

V = np.random.rand(200)
models_by_name['dbow+dmc'].docvecs.most_similar([V])

AttributeError: 'ConcatenatedDocvecs' object has no attribute 'most_similar'

Конечно, я не могу использовать простые модели для вывода похожих документов, так как полученные вложения векторов имеют размер 100 (а не 200, как у конкатенированных векторов).

Как получить список наиболее похожих документов для вектора документа из модели ConcatenatedDocvecs?

1 Ответ

0 голосов
/ 15 января 2019

ConcatenatedDocvecs - это простой служебный класс-обертка, который позволяет получить доступ к объединению векторов тега в нескольких базовых Doc2Vec моделях. Он существует, чтобы немного легче воспроизвести некоторые результаты анализа в оригинальной статье «ParagraphVector».

Он не воспроизводит все функциональные возможности модели Doc2Vec (или набора векторов-ключей), поэтому не может напрямую помочь вам с most_similar(), который вы хотите выполнить.

Вместо этого вы можете выполнить наиболее похожую операцию в каждой из составляющих моделей, а затем объединить две меры сходства (для каждого соседа) - например, путем их усреднения - чтобы получить пригодное для использования значение подобия для объединенной модели (и потом пересортируй на это). Я подозреваю, но не уверен, что такое значение из двух 100-мерных моделей будет вести себя как истинное косинус-сходство из конкатенированной 200-мерной модели.

В качестве альтернативы, вместо использования ConcatenatedDoc2Vec класса-оболочки (который только создает и возвращает конкатенированные 200d-векторы при запросе), вы можете посмотреть на различный класс KeyedVectors в gensim и использовать (или адаптировать) один для заполнения со всеми объединенными 200d векторами из двух составляющих моделей. Тогда его most_similar() будет работать.

...