Я пытаюсь создать простую программу для проверки моего понимания о 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]
Где я это неправильно понял?Пожалуйста, помогите мне.Огромное спасибо.