Подтвердить что ты не робот

Doc2vec: Как получить векторы документов

Как получить векторы документов двух текстовых документов, используя Doc2vec? Я новичок в этом, поэтому было бы полезно, если бы кто-то мог указать мне правильное направление/помочь мне с некоторым учебником

Я использую Gensim.

doc1=["This is a sentence","This is another sentence"]
documents1=[doc.strip().split(" ") for doc in doc1 ]
model = doc2vec.Doc2Vec(documents1, size = 100, window = 300, min_count = 10, workers=4)

я получил

AttributeError: у объекта 'list' нет атрибута 'words'

всякий раз, когда я запускаю это.

4b9b3361

Ответ 1

Если вы хотите обучить модель Doc2Vec, ваш набор данных должен содержать списки слов (аналогично формату Word2Vec) и теги (идентификаторы документов). Он также может содержать некоторую дополнительную информацию (см. Https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb для получения дополнительной информации).

# Import libraries

from gensim.models import doc2vec
from collections import namedtuple

# Load data

doc1 = ["This is a sentence", "This is another sentence"]

# Transform data (you can add more data preprocessing steps) 

docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for i, text in enumerate(doc1):
    words = text.lower().split()
    tags = [i]
    docs.append(analyzedDocument(words, tags))

# Train model (set min_count = 1, if you want the model to work with the provided example data set)

model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4)

# Get the vectors

model.docvecs[0]
model.docvecs[1]

ОБНОВЛЕНИЕ (как тренироваться в эпоху): этот пример устарел, поэтому я удалил его. Для получения дополнительной информации об обучении в эпоху, смотрите этот ответ или комментарий @gojomo.

Ответ 2

Обновлен Gensim. Синтаксис LabeledSentence не содержит ярлыков. В настоящее время теги - см. Документацию для LabeledSentence https://radimrehurek.com/gensim/models/doc2vec.html

Однако @bee2502 был прав с

docvec = model.docvecs[99] 

Это будет значение 100-го вектора для обученной модели, оно работает с целыми числами и строками.

Ответ 3

doc=["This is a sentence","This is another sentence"]
documents=[doc.strip().split(" ") for doc in doc1 ]
model = doc2vec.Doc2Vec(documents, size = 100, window = 300, min_count = 10, workers=4)

Я получил AttributeError: объект "list" не имеет атрибутов "слова", потому что входные документы в Doc2vec() не были в правильном формате LabeledSentence. Я надеюсь, что этот ниже пример поможет вам понять формат.

documents = LabeledSentence(words=[u'some', u'words', u'here'], labels=[u'SENT_1']) 

Подробнее здесь: http://rare-technologies.com/doc2vec-tutorial/ Однако я решил проблему, взяв входные данные из файла с помощью TaggedLineDocument().
Формат файла: один документ = одна строка = один объект TaggedDocument. Предполагается, что слова уже предварительно обработаны и разделены пробелами, тэги автоматически создаются из номера строки документа.

sentences=doc2vec.TaggedLineDocument(file_path)
model = doc2vec.Doc2Vec(sentences,size = 100, window = 300, min_count = 10, workers=4)

Чтобы получить вектор документа: Вы можете использовать docvec. Подробнее здесь: https://radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.TaggedDocument

docvec = model.docvecs[99] 

где 99 - это идентификатор документа, вектор которого мы хотим. Если метки находятся в целочисленном формате (по умолчанию, если вы загружаете с помощью TaggedLineDocument()), прямо используйте целочисленный идентификатор, как я. Если метки находятся в строчном формате, используйте "SENT_99". Это похоже на Word2vec

Ответ 4

from gensim.models.doc2vec import Doc2Vec, TaggedDocument 
Documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(doc1)]
Model = Doc2Vec(Documents, other parameters~~)

Это должно работать нормально. Вам необходимо пометить свои документы для обучения модели doc2vec.