Doc2vec выводит данные только для одного документа, а не для двух векторов документов - PullRequest
0 голосов
/ 21 сентября 2018

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

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

[["I have a pet"], ["They have a pet"], ["she has no pet"]]

Затем мы разбиваем его на 3 предложения

["I have a pet"]
["They have a pet"]
["she has no pet"]

и используем gensim TaggedDocumentили любой метод, который вы создали, чтобы пометить каждое предложение меткой.

["I", "have", "a", "pet"] Tag= positive
["They", "have", "a", "pet"] Tag= positive
["she", "has", "no", "pet"] Tag= negative

Затем мы используем библиотеку Doc2Vec gensim для построения модели, build_vocab и обучения ее.

Что я ожидал, так это то, что каждая метка для каждого предложения изучает векторы на основе другой метки предложения;затем выводим векторы для каждой метки, как в Word2Vec, но в word2vec векторы для каждого слова.

Если я не понял его неправильно, это должно быть что-то вроде этого:

["I have a pet"] Vectors = [-0.13150065 -0.13182896 -0.1564866 ]
["They have a pet"] Vectors = [-0.13150065 -0.13182896 -0.1564866 ]
["she has no pet"] Vectors = [ 0.14937358 -0.06767108  0.14668389]

Однако, когда я тренировал свою модель, я получал только векторы один для положительных и отрицательных и всего 2 вместо 3, как указано выше.Являются ли векторы только для каждой метки;отрицательный и положительный, и поэтому он имеет 2 разреженных вектора?Если да, то как мы можем сравнить первое предложение со вторым предложением и третьим предложением?Я очень запутался, когда получил такой вывод.

*** Есть ли способ проверить, какой положительный ярлык является тегом к какому предложению?Например, как я могу напечатать тег + напечатать предложение?

Пример,

tag: positive sentence: ["They have a pet"]

Мой код:

from gensim.models.doc2vec import Doc2Vec, TaggedDocument


file = [["I have a pet"], ["They have a pet"], ["she has no pet"]]

positiveFile = file[0:2]
negativeFile = file[2]

positive = [word.split() for sentence in positiveFile for word in sentence]
negative = [word.split() for sentence in [negativeFile] for word in sentence]
total = positive + negative

taggedPositiveFiles = [TaggedDocument(sentence, ["positive"])for i, sentence in enumerate(positive)]
taggedNegativeFiles = [TaggedDocument(sentence, ["negative"])for i, sentence in enumerate(negative)]
totalTagged = taggedNegativeFiles + taggedPositiveFiles


model = Doc2Vec(totalTagged, min_count = 1, workers=1, vector_size=3)
model.build_vocab(totalTagged, update=True)
model.train(totalTagged,total_examples=1, epochs=1)
print(model.docvecs["negative"])
print(model.docvecs["positive"])  

Текущий вывод:

[-0.13150065 -0.13182896 -0.1564866 ]
[ 0.14937358 -0.06767108  0.14668389]

Ожидаемый результат:

[-0.13150065 -0.13182896 -0.1564866 ]
[-0.13150065 -0.13182896 -0.1564866 ]
[ 0.14937358 -0.06767108  0.14668389]

Где я это неправильно понял?Пожалуйста, помогите мне.Огромное спасибо.

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете выбрать, как вы tag ваши тексты.Модель Doc2Vec учитывает векторы документов только для тех тегов, которые вы предоставляете.

В оригинальной статье Paragraph Vectors, на которой основан Doc2Vec (и с тех пор много опубликованных примеров), каждый документ получает свой собственный уникальный тег ID, поэтому для каждого документа существует уникальный вектор документа.Вы получите вектор документа для документа, запросив модель для уникального тега этого документа.

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

(Также можно присвоить текстам несколько тегов, чтобы они могли иметь как уникальный идентификатор , так и некоторые другие метки. Например: tags=['id001', 'positive']. Однако это лучше учитыватьпродвинутый / экспериментальный метод, который я бы порекомендовал только после того, как у вас есть более простые подходы, работающие хорошо, и я понимаю из этих более простых подходов, как различные качества вашей установки - такие как параметры, размер и качество корпуса и т. д. - влияют на результаты.обучение большего числа однозначно обозначенных векторов документов из одного и того же объема данных может на практике означать, что каждый вектор документа немного «слабее» в своей полезности. По сути, информация об одном источнике и «сигнал» в данных разбросаныболее изученных векторов. Таким образом, вы захотите делать необычные вещи, например, иметь несколько тегов на документ, если у вас много данных - и, возможно, даже делать больше обучающих проходов.)

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

  • Функция update=True build_vocab() официально поддерживается только для Word2Vec, являетсяпродвинутая функция, которая требует много экспериментов для правильного использования, и даже там следует использовать только 2-й или последующие раз вы build_vocab() на модели, а не 1-й.

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

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

...