Какой метод DM или Dbow хорошо работает для сходства документов с помощью Doc2Vec? - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь выяснить сходство между 2 документами .Я использую Doc2vec Gensim для обучения 10К документов .Есть около 10 строковых тегов .Каждый тег состоит из уникального слова и содержит какие-то документы.Модель обучается с использованием метода распределенной памяти .

Doc2Vec(alpha=0.025, min_alpha=0.0001, min_count=2, window=10, dm=1, dm_mean=1, epochs=50, seed=25, vector_size=100, workers=1)

Я также пробовал dm и dbow . дм дает лучший результат (оценка сходства) по сравнению с dbow .Я понял понятия дм против дбоу .Но не знаю, какой метод подходит для измерения сходства между двумя документами.

Первый вопрос: Какой метод лучше всего подходит для сходства?

model.wv.n_similarity(<words_1>, <words_2>) дает оценку сходства с использованием векторов слов .

model.docvecs.similarity_unseen_docs(model, doc1, doc2) дает оценку сходства, используя векторы doc , где doc1 и doc2 не являются тегами / или индексами doctag. Каждый документ doc1 и doc2 содержит 10-20 словосочетаний.

Оба wv.n_sdentifity и docvecs.simility_unseen_docs обеспечивают различные оценки сходства дляодинаковые типы документов.

docvecs.simility_unseen_docs дает немного хорошие результаты по сравнению с wv.n_shoity , но wv.n_shoity иногда также дает хорошие результаты.

Вопрос: В чем разница между docvecs.simility_unseen_docs и wv.n_simility?Могу ли я использовать docvecs.simility_unseen_docs, чтобы найти оценку сходства между невидимыми данными (это может быть глупый вопрос)?

Почему я спросил, потому что docvecs.shoity_unseen_docs предоставляет оценку сходства тегов, а не на реальных словах, принадлежащих их тегам.Я не уверен, пожалуйста, поправьте меня здесь, если я ошибаюсь.

Как я могу преобразовать косинусное сходство в вероятность?

Спасибо.

model = Doc2Vec(alpha=0.025, min_alpha=0.0001, min_count=2, window=10, dm=1, dm_mean=1, epochs=50, seed=25, vector_size=100, workers=4)
# Training of the model
tagged_data = [TaggedDocument(words=_d, tags=[str(i)]) for i, _d in enumerate(<list_of_list_of_tokens>)]
model.build_vocab(tagged_data)
model.train(tagged_data, total_examples=model.corpus_count, epochs=model.epochs)

# Finding similarity score
model.wv.n_similarity(<doc_words1>, <doc_words2>)
model.random.seed(25)
model.docvecs.similarity_unseen_docs(model, <doc_words1>, <doc_words2>)

1 Ответ

1 голос
/ 27 мая 2019

Оба режима PV-DM (dm=1, по умолчанию) и режим PV-DBOW (dm=0) могут работать хорошо.Что лучше, будет зависеть от ваших данных и целей.Если у вас есть надежный способ количественной оценки качества результатов модели для целей вашего проекта, которые вы захотите настроить для всех мета-параметров модели, включая режим DM / DBOW, вы можете и должны попробоватьи то и другое.

PV-DBOW быстро обучается и часто очень хорошо работает на коротких документах (несколько десятков слов).Однако обратите внимание, что этот режим не обучает используемые векторы слов , если только вы также не добавите опцию dbow_words=1, которая замедлит обучение.

Использование model.wv.n_similarity() опирается только на слова-векторы.Он усредняет каждый набор f слов-векторов, а затем сообщает косинусное сходство между этими двумя средними.(Таким образом, это будет разумно только в режиме PV-DM или PV-DBOW с активированным dbow_words=1.

Использование model. docvecs.similarity_unseen_docs() использует infer_vector() для обработки каждого из предоставленных документов как новых текстов, длякоторый вычисляет истинный Doc2Vec вектор документа ( не просто среднее векторное слово) (этот метод работает со списками слов, не списки-of-tags.)

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

Другие примечания по вашей настройке:

  • часто, установка min_count равным 2 - плохая идея: у этих редких слов недостаточно примеров, чтобы много значить, и они фактически мешают качеству окружающих слов

  • 10 тыс. Документов - это небольшая часть учебного корпуса по сравнению с опубликованными Doc2Vec результатами (которые обычно используют от десятков тысяч до миллионов документов).

  • опубликованные результаты часто используют 10-20 эпох обучения (хотя больше, например, ваш выбор из 50, может быть особенно полезным дляменьшие корпуса)

  • на типичных многоядерных машинах workers=1 будет намного медленнее, чем по умолчанию (workers=3);на машине с 8 или более ядрами до workers=8 часто хорошая идея.(Хотя, если не использовать более новую опцию ввода corpus_file, больше workers вплоть до полного количества ядер 16, 32 и т. Д. Не поможет.)

  • classic Doc2Vec Использование не назначает документы только известные метки (как в вашем "10 строковый тип тегов"), но уникальные идентификаторы для каждого документа.В некоторых случаях использование или добавление известных меток в качестве тегов может помочь, но имейте в виду, что если вы только поставляете 10 тегов, вы по существу превратили свои 10000 документов в 10 документов (с точки зренияпредставление модели, которое видит все тексты с таким же тегом, как если бы они были сегментами одного более крупного документа с этим тегом).В простом PV-DBOW обучение всего 10 документным векторам по 100 измерений каждый из 10 различных примеров не имело бы большого смысла: оно было бы подвержено серьезному переоснащению.(В PV-DM или PV-DBOW с dbow_words тот факт, что модель обучает как 10 документов-векторов, так и многие сотни / тысячи других словарных словарных векторов, помог бы компенсировать риск переобучения.)

...