Doc2Vec - Поиск сходства документов в тестовых данных - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь обучить модель doc2vec, используя обучающие данные, затем нахожу сходство каждого документа в тестовых данных для конкретного документа в тестовых данных , используя обученный doc2vecмодель.Однако я не могу определить, как это сделать.

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

Я попытался вручную сравнить выведенный вектор конкретного документа в данных теста с выведенными векторами каждого другого документа в данных теста, используя model.docvecs.n_similarity(inferred_vector.tolist(), testvectors[i].tolist()), но это возвращает KeyError: "tag '-0.3502606451511383' not seen in training corpus/invalid", поскольку есть векторы, которых нет всловарь.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

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

Как правило, выполнение любых операций с новыми документами, которые не были частью обучения, потребует использования infer_vector().Обратите внимание, что такой вывод:

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

С другой стороны, такой вывод из «замороженной» модели может быть распараллелен между процессами или машинами.

Упомянутый вами метод n_similarity() не совсем подходит для ваших нужд: он ожидает списки ключей поиска («тегов») для существующих векторов документов, не необработанных векторов, таких какВы предоставляете.

Метод similarity_unseen_docs(), который вы упомянули в своем ответе, несколько уместен, но он просто берет пару документов, каждый раз пересчитывая их векторы - несколько расточительно, если документ одного нового документавектор нужно сравнивать с документами многих других новых документов.

Возможно, вы просто захотите обучить совершенно новой модели с вашими «учебными документами» и вашими «тестовыми документами».Затем все «тестовые документы» рассчитывают свои векторы документов и сохраняют их внутри модели как часть массового обучения.Это подходящий выбор для многих возможных приложений, и он действительно может выучить интересные отношения, основанные на словах, которые появляются только в «тестовых документах» совершенно без присмотра.И еще нет ни одной части вашего вопроса, которая объясняет причины, по которым это не может быть рассмотрено здесь.

В качестве альтернативы, вы можете infer_vector() добавить все новые "тестовые документы" и поместить их вструктура, подобная различным KeyedVectors служебным классам в gensim - запоминание всех векторов в одном массиве, запоминание отображения от doc-ключа к vector-index и предоставление эффективного набора most_similar() по набору векторов.

0 голосов
/ 30 апреля 2019

Оказывается, есть функция с именем similarity_unseen_docs(...), которую можно использовать для поиска сходства 2 документов в тестовых данных .

Однако я пока оставлю этот вопрос нерешенным, поскольку он не очень оптимален, поскольку мне нужно было бы вручную сравнивать конкретный документ с каждым другим документом в тестовых данных .Кроме того, он сравнивает слова в документах вместо векторов, которые могут повлиять на точность.

...