Использование Doc2Vec от gensim для создания векторов предложений

Я пытаюсь использовать Doc2Vec для чтения файла, который представляет собой список таких предложений:

The elephant flaps its large ears to cool the blood in them and its body.

A house is a permanent building or structure for people or families to live in.

...

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

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

sentences = []
for uid, line in enumerate(open(filename)):
    sentences.append(LabeledSentence(words=line.split(), labels=['SENT_%s' %       uid]))

model = Doc2Vec(alpha=0.025, min_alpha=0.025)
model.build_vocab(sentences)
for epoch in range(10):
    model.train(sentences)
    model.alpha -= 0.002
    model.min_alpha = model.alpha
sent_reg = r'[SENT].*'
for item in model.vocab.keys():
    sent = re.search(sent_reg, item)
    if sent:
        continue
    else:
        print item

###I'm not sure how to produce the vectors from here and this doesn't work##   
sent_id = 0
for item in model:
    print model["SENT_"+str(sent_id)]
    sent_id += 1

person jdv12    schedule 17.08.2015    source источник
comment
Вы пробовали установить min_count = 1? Doc2Vec (min_count = 1)   -  person slizb    schedule 20.08.2015


Ответы (1)


С последней версией gensim (0.12.1) вы можете попробовать:

распечатать model.docvecs ["SENT _" + str (sent_id)]

person Nicholas    schedule 31.08.2015
comment
Да, векторы-документы теперь находятся в подсвойстве model.docvecs. - person gojomo; 01.10.2015
comment
@gojomo @Nicholas, почему model.docvecs не обязательно имеет такое же количество строк, как у меня количество предложений? - person Katya Handler; 12.05.2016
comment
Размер docvecs будет числом уникальных тегов док-тегов, видимых во время первоначального сканирования примеров, с добавленным предупреждением о том, что если вы используете простые целые числа в качестве тегов док-тегов, он будет выделять пространство для всех целых чисел, вплоть до самого большого. Итак, если вы предоставите 10 примеров, но повторяются только 2 уникальных строковых документа, в docvecs.doctag_syn0 будет только 2 строки. Если вы предоставите только 1 пример, но с int doctag 10, будет 11 строк (для int 0-10). (В базовом случае, когда каждое предложение получает свой собственный идентификатор int, отсчитываемый от 0, docvecs строк будут точно соответствовать количеству приведенных примеров.) - person gojomo; 12.05.2016
comment
@gojomo большое спасибо за ответ. Сейчас мои теги - ids = [str(x) for x in range(0, len(sentences)], где len(sentences) - 150 000. Но у меня есть уникальный тег для каждого предложения. По-прежнему len(model.docvecs) как 10. Ищу ответ на этот вопрос здесь. stackoverflow.com/ вопросы / 37196520 / - person Katya Handler; 13.05.2016
comment
Поскольку текстовый пример может иметь более одного тега, tags считается последовательностью, поэтому ваши числовые идентификаторы превращаются в 10 тегов '0', '1', ..., '9'. ids = [ [str(x), ] for x in range(len(sentences)] должен работать, но поскольку можно использовать и необработанные целые числа в качестве тегов, ids = [ [x, ] for x in range(len(sentences)] тоже. - person gojomo; 15.05.2016