Как улучшить воспроизводимость косинусного сходства Doc2vec - PullRequest
0 голосов
/ 19 декабря 2018

Я использую Gensim 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)

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

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

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

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

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

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

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

0 голосов
/ 19 декабря 2018

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

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

infer_vector(doc_words, alpha=None, min_alpha=None, epochs=None, steps=None)
...