Как с помощью модели doc2vec рассчитать схожесть слова или пары слов с документом?

В gensim у меня есть обученная модель doc2vec, если у меня есть документ и одно слово или два-три слова, как лучше всего рассчитать сходство слов с документом?

Я просто делаю стандартное косинусное сходство между ними, как если бы они были двумя документами? Или есть лучший подход для сравнения небольших строк с документами?

На первый взгляд, я мог бы получить косинусное сходство для каждого слова в строке из 1-3 слов и каждого слова в документе, взяв средние значения, но я не знаю, насколько это будет эффективно.


person OultimoCoder    schedule 13.04.2019    source источник


Ответы (1)


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

С любой моделью Doc2Vec вы можете вывести вектор для нового текста, который содержит известные слова - даже текст из одного слова - с помощью метода infer_vector(). Однако, как и Doc2Vec в целом, это обычно лучше работает с документами, состоящими не менее чем из десятков, а лучше всего сотен слов. (Крошечные документы из 1-3 слов, кажется, особенно склонны к несколько странным / экстремальным предполагаемым векторам, особенно если модель / обучающие данные были недостаточно мощными с самого начала.)

Помните, что неизвестные слова игнорируются infer_vector(), поэтому, если вы скармливаете ему документы из 3 слов, для которых два слова неизвестны, это действительно просто вывод на основе одного известного слова. И если вы скармливаете ему только неизвестные слова, он вернет случайный, умеренный вектор инициализации, который не подвергался настройке логического вывода. (Все выводы / обучение всегда начинаются с такого случайного вектора, и если нет известных слов, вы просто получаете их обратно.)

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

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

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

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

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

person gojomo    schedule 13.04.2019
comment
Я обучил свою модель в корпусе Википедии, и сначала я пытался напрямую сравнить векторы большого и маленького документа, что может быть причиной того, что результаты были не такими хорошими, как я ожидал, основываясь на вашем объяснении. У меня действительно был установлен параметр dbow_words = 1, поэтому я посмотрю на WMD и сравню отдельные векторы слов с векторами документов, но при сравнении отдельных векторов слов с общим вектором документа вы бы порекомендовали разделить документ на абзацы и проанализировать против каждого вектора абзаца, или это не окажет заметного эффекта? - person OultimoCoder; 14.04.2019
comment
Вы также упомянули, что неизвестные слова имеют случайные векторы, как этому способствуют векторы слов? например doc2vecmodel ['ананас'] где ананас - это неизвестное слово? - person OultimoCoder; 14.04.2019
comment
Если сравнение векторов tiny-doc и large-doc не работает, это может быть по множеству причин - может быть, это факт, что tiny-docs могут не получать хорошие векторы (как вы создаете векторы tiny-doc?), но могут быть и другие вещи - трудно догадаться, не видя больше вашей настройки. (Например, лучше ли работает сравнение больших документов с большими?) Может ли помочь разделение документов на более мелкие части, зависеть от ваших реальных целей и экспериментов - вам нужен абзац, а не результаты полного документа? Лучшее соответствие абзаца более полезно для ваших пользователей, чем полное соответствие документа? - person gojomo; 14.04.2019
comment
Неизвестные слова - которых вообще не было в обучающем корпусе - не имеют случайных векторов слов, у них вообще нет векторов слов. Если вы попробуете doc2vecmodel.wv.['pineapple'], а «ананас» не будет в обучающих данных, вы получите сообщение об ошибке. С другой стороны, если в обучающих данных было слово «яблоко», то для некоторых режимов doc2vecmodel.wv.['apple'] вернет полезно обученный вектор слов, но простая модель PV-DBOW (dm=0, dbow_words=0) просто вернет слабый случайный нетренированный вектор слов. это действительно не должно использоваться ни для чего. - person gojomo; 14.04.2019
comment
Я создаю векторы tiny-doc с помощью model.infer_vector (tinydoc). Для больших сравнений документов, например, если я выполняю поисковый запрос в Google и сравниваю два верхних документа друг с другом, я вижу высокую точность, такую ​​как 0,7+, и если я сравниваю один и тот же документ с самим собой, я увижу точность 0,99. Проблема возникает при сравнении крошечных слов документа (1-3) с одним из этих документов, сходство для одного слова очень низкое, то есть 0,06, другие несвязанные слова будут иметь отрицательное сходство, что имеет смысл. Но 0,06 предполагает, что они не связаны, что я не считаю правильным. - person OultimoCoder; 14.04.2019
comment
Я на самом деле исправил это, я сделал ошибку и не обрабатывал свой крошечный документ, что значительно повысило мою точность. Я все еще собираюсь изучить усреднение векторов слов, чтобы увидеть, как это влияет на точность. Спасибо за вашу помощь, потому что вы отвечаете на все вопросы, и это потрясающе. - person OultimoCoder; 14.04.2019
comment
Ах, да, это распространенная ошибка - передать в infer_vector() только строку или что-то не совсем предварительно обработанное / токенизированное, как и обучающие данные. Также при отладке вывода: (1) в последних версиях по умолчанию используется значение модели epochs. Это может быть всего 5, если не указано иное, в то время как 10-20 гораздо чаще встречается в Doc2Vec опубликованных работах, а меньшие документы / корпуса могут получить еще больше. (В частности, выводимые крошечные документы могут выиграть от гораздо большего количества эпох, чтобы имитировать более крупный документ.) (2) Проверка того, что повторный вывод обучающего документа дает аналогичный вектор,… - person gojomo; 14.04.2019
comment
… Хорошая проверка на вменяемость. Из-за присущей алгоритму случайности / дрожания, повторно выведенный вектор не будет идентичным. Но исходный doc-вектор, обученный в обучении модели, почти всегда должен быть ближайшим к повторно выведенному вектору, а если нет, то либо вывод должен быть дополнительно улучшен (предварительная обработка, выбор epochs), либо обучение исходной модели имело проблемы - возможно, слишком мало данных, слишком большой размер модели, склонной к переобучению, слишком мало epochs и т. д. - person gojomo; 14.04.2019