python русский - Doc2vec:как получить векторы документов




что примеры (4)

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

Я использую gensim python library.

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» не имеет атрибутных «слов» всякий раз, когда я запускаю этот


Answers

Если вы хотите обучить модель 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]

ОБНОВЛЕНИЕ (как тренироваться в эпоху): функция Doc2Vec содержит параметры alpha и min_alpha , но это означает, что скорость обучения распадается в течение одной эпохи от alpha до min_alpha . Чтобы обучить несколько эпох, установите скорость обучения вручную, например:

from gensim.models import doc2vec
import random

alpha_val = 0.025        # Initial learning rate
min_alpha_val = 1e-4     # Minimum for linear learning rate decay
passes = 15              # Number of passes of one document during training

alpha_delta = (alpha_val - min_alpha_val) / (passes - 1)

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

model.build_vocab(docs) # Building vocabulary

for epoch in range(passes):

    # Shuffling gets better results

    random.shuffle(docs)

    # Train

    model.alpha, model.min_alpha = alpha_val, alpha_val

    model.train(docs)

    # Logs

    print('Completed pass %i at alpha %f' % (epoch + 1, alpha_val))

    # Next run alpha

    alpha_val -= alpha_delta

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


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

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

docvec = model.docvecs[99] 

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


Старый вопрос, но ответ был бы полезен для будущих посетителей. Вот некоторые из моих мыслей.

Есть некоторые проблемы в реализации tensorflow :

  • window имеет размер 1 стороны, поэтому window=5 будет 5*2+1 = 11 слов.
  • Обратите внимание, что с версией doc2vec PV-DM, batch_size будет количеством документов. Таким train_word_dataset формы train_word_dataset будет параметр batch_size * context_window , тогда как train_doc_dataset и train_labels будут иметь значение batch_size .
  • Что еще более важно, sampled_softmax_loss не является negative_sampling_loss . Это два разных приближения softmax_loss .

Таким образом, для перечисленных вопросов:

  1. Эта реализация doc2vec в tensorflow работает и исправлена ​​по-своему, но отличается от реализации gensim и бумаги.
  2. window имеет размер 1 стороны, как указано выше. Если размер документа меньше, чем размер контекста, то меньшим будет использование.
  3. Существует много причин, по которым реализация gensim выполняется быстрее. Во-первых, gensim был оптимизирован в значительной степени, все операции быстрее, чем наивные операции на python, особенно данные ввода / вывода. Во-вторых, некоторые этапы предварительной обработки, такие как фильтрация gensim в gensim , уменьшат размер набора данных. Что еще более важно, gensim использует negative_sampling_loss , который намного быстрее, чем sampled_softmax_loss , я думаю, это основная причина.
  4. Легче ли найти что-то, когда их много? Просто шучу ;-)
    Верно, что в этой непродуманной проблеме оптимизации есть много решений, поэтому модель просто найдет локальный оптимум. Интересно, что в нейронной сети большинство локальных оптимумов «достаточно хороши». Было замечено, что стохастический градиентный спуск, как представляется, находит лучшие локальные оптимумы, чем более крупный градиентный спуск партии, хотя это все еще является загадкой в ​​текущих исследованиях.




python gensim word2vec