Как использовать infer_vector в gensim.doc2vec?

def cosine(vector1,vector2):
    cosV12 = np.dot(vector1, vector2) / (linalg.norm(vector1) * linalg.norm(vector2))
    return cosV12
model=gensim.models.doc2vec.Doc2Vec.load('Model_D2V_Game')
string='民生 为了 父亲 我 要 坚强 地 ...'
list=string.split(' ')
vector1=model.infer_vector(doc_words=list,alpha=0.1, min_alpha=0.0001,steps=5)
vector2=model.docvecs.doctag_syn0[0]
print cosine(vector2,vector1)

-0,0232586

Я использую данные поезда, чтобы тренировать doc2vec модель. Затем я использую infer_vector() генерировать вектор с учетом документа, который находится в обученных данных. Но они разные. Значение косинуса было так мало (-0.0232586) расстояние между vector2 который был сохранен в doc2vec модель и vector1 который был создан infer_vector(), Но это не разумно ах...

Я нахожу, где у меня ошибка. Я должен использовать 'string=u'民生 为了 父亲 我 要 坚强 地 ...'' вместо 'string='民生 为了 父亲 我 要 坚强 地 ...''. Когда я исправляю это, расстояние косинуса до 0,889342.

1 ответ

Как вы заметили, infer_vector() требует его doc_words Аргументом должен быть список токенов, соответствующих тому же типу токенизации, который использовался при обучении модели. (Передача строки приводит к тому, что он просто видит каждый отдельный символ как элемент в списке токенов, и даже если несколько токенов являются известными словарными токенами - как с 'a' и 'I' в английском языке - вы вряд ли чтобы получить хорошие результаты.)

Кроме того, параметры по умолчанию infer_vector() может быть далеко не оптимальным для многих моделей. В частности, больший steps (по крайней мере, такое же большое, как количество итераций обучения модели, но, возможно, даже во много раз), часто полезно. Кроме того, меньший старт alphaВозможно, просто общее значение по умолчанию для массового обучения 0,025, может дать лучшие результаты.

Ваш тест на то, получает ли вывод вектор, близкий к одному и тому же вектору от массового обучения, является разумной проверкой работоспособности как для ваших параметров вывода, так и для более раннего обучения - является ли модель в целом обучением обобщаемых шаблонов в данных? Но поскольку большинство режимов Doc2Vec по своей природе используют случайность или (во время массового обучения) может зависеть от случайности, вызванной джиттером планирования многопоточности, вы не должны ожидать идентичных результатов. Как правило, они становятся ближе, чем больше итераций / шагов для обучения вы делаете.

Наконец, обратите внимание, что most_similar() метод на Doc2Vec"s docvecs Компонент также может принимать необработанный вектор, чтобы вернуть список наиболее похожих уже известных векторов. Таким образом, вы можете попробовать следующее...

ivec = model.infer_vector(doc_words=tokens_list, steps=20, alpha=0.025)
print(model.most_similar(positive=[ivec], topn=10))

... и получить рейтинг топ-10 самых похожих (doctag, similarity_score) пар.

Другие вопросы по тегам