Как улучшить воспроизводимость косинусного подобия Doc2vec

Я использую Gensim's Doc2vec для обучения модели, и я использую infer_vector, чтобы вывести вектор нового документа для сравнения документа подобия модели. Однако повторное использование одного и того же документа может привести к очень разным результатам. Таким образом невозможно точно оценить похожие документы.
Поисковая сеть упоминает, что infer_vector имеет случайные характеристики, поэтому каждый раз, когда создается новый текстовый вектор, он будет другим.
Есть ли способ решить эту проблему проблема?

model_dm =pickle.load(model_pickle)

inferred_vector_dm = model_dm.infer_vector(i)  

simsinput =model_dm.docvecs.most_similar([inferred_vector_dm],topn=10)

person Barney    schedule 19.12.2018    source источник


Ответы (2)


Если вы предоставите infer_vector() необязательный аргумент epochs, который больше значения по умолчанию, результирующие векторы, от запуска до запуска для одного текста, должны стать более похожими. (Это, вероятно, будет особенно полезно для небольших текстов.)

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

Если разница между запусками остается большой - например, изменение результатов most_similar() значительно от цикла к запуску, то могут быть другие проблемы с вашей моделью или настройкой:

  • Doc2Vec плохо работает с обучающими наборами игрушечного размера - в опубликованной работе используются наборы документов от десятков тысяч до миллионов документов, каждый из которых состоит из десятков и тысяч слов. Если вы используете всего несколько коротких предложений, вы не получите хороших результатов.

  • infer_vector() необходимо получить список токенов-строк, не строку. И эти токены должны быть предварительно обработаны так же, как и данные обучения. Любые неизвестные слова, переданные в infer_vector(), будут проигнорированы, что сделает ввод короче (или нулевой длины), а результаты будут более (или полностью) случайными.

Кроме того, Doc2Vec gensim имеет собственные методы .save() и .load(), которые следует использовать, а не исходные pickle - особенно на больших моделях они будут работать более эффективно или без ошибок. (Однако обратите внимание: они могут создавать несколько файлов сохранения, которые должны храниться вместе, чтобы при загрузке основного файла можно было найти вспомогательные файлы.)

person gojomo    schedule 19.12.2018

Согласно документации, вам необходимо: увеличьте количество эпох / шагов (в зависимости от версии, которую вы используете), чтобы получить большую стабильность векторов. Если не указано, значение эпох из инициализации модели будет использоваться повторно.

Следовательно, попробуйте с более высоким значением для эпох / шагов, чтобы получить аналогичный вектор, в то же время вы должны найти компромисс со временем вычисления, которое кажется

infer_vector(doc_words, alpha=None, min_alpha=None, epochs=None, steps=None)
person Venkatachalam    schedule 19.12.2018