Ваш общий подход разумен.Несколько замечаний о вашей настройке:
- вам нужно будет указать
epochs=10
в вашем train()
вызове, чтобы действительно получить 10 тренировочных пропусков - и 10 или более чаще всего встречается в опубликованных работах sample
-контролируемая понижающая выборка помогает ускорить обучение и часто улучшает качество вектора, и значение может стать более агрессивным (меньшим) с большими наборами данных train_lbls
не является параметром для Doc2Vec
в любой недавней gensim
версии
Существует несколько возможных способов интерпретации и достижения вашей цели «найти« наиболее похожие »документы для 700, которые мы уже закодировали вручную».Например, для документа-кандидата, как определить его сходство с набором 700 - как сходство с одним итоговым вектором «центроида» для полного набора?Или как его сходство с любым из документов?
Есть несколько способов получить один суммарный вектор для набора:
усреднить их 700 векторов вместе
объединить все их слова в один синтетический составной документ и infer_vector()
в этом документе.(Но обратите внимание: тексты, переданные в оптимизированные подпрограммы word2vec / doc2vec gensim
, сталкиваются с внутренним пределом реализации в 10 000 токенов - лишние слова игнорируются.)
Фактически, *Метод 1033 * может взять список из нескольких векторов в качестве «положительной» цели и автоматически усреднить их вместе, прежде чем вернуть свои результаты.Так, если, скажем, 700 идентификаторов документов (теги, используемые во время обучения) находятся в списке ref_docs
, вы можете попробовать ...
sims = model.docvecs.most_similar(positive=ref_docs, topn=0)
... и получить ранжированный список всех другихв модельных документах, по своему сходству со средним числом всех этих positive
примеров.
Однако альтернативная интерпретация того, что сходство документа с набором ссылок является его наибольшим сходством с каким-либо одним документом внутри набора, может быть лучше для вашей цели.Особенно это может быть в том случае, если сам набор ссылок варьируется по многим темам, и, следовательно, его нельзя суммировать одним усредненным вектором.
Вам придется вычислять эти сходства с вашими собственными циклами.Например, примерно:
sim_to_ref_set = {}
for doc_id in all_doc_ids:
sim_to_ref_set[doc_id] = max([model.docvecs.similarity(doc_id, ref_id) for ref_id in ref_docs])
sims_ranked = sorted(sim_to_ref_set.items(), key=lambda it:it[1], reverse=True)
Верхние элементы в sims_ranked
будут наиболее похожи на любой элемент в наборе ссылок.(Предполагая, что идентификаторы набора ссылок также находятся в all_doc_ids
, первые 700 результатов снова будут выбранными документами, все с самоподобием 1.0
.)