Я получаю больше векторов, чем размер моего документа - gensim doc2vec - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть белковые последовательности и я хочу сделать doc2vec.Моя цель - иметь один вектор для каждого предложения / последовательности.

У меня есть 1612 предложений / последовательностей и 30 классов, поэтому метка не уникальна, и многие документы имеют одинаковые метки.

Так что, когдаЯ впервые попробовал doc2vec, он дал мне всего 30 векторов, что является количеством уникальных меток.Затем я решил использовать несколько тегов, чтобы получить вектор для каждого предложения.

Когда я это сделал, у меня оказалось больше векторов, чем в моих предложениях.Любые объяснения, что могло пойти не так?

Скриншот моих данных

Скриншот корпуса

tagged = data.apply(lambda r: TaggedDocument(words=(r["A"]), tags=[r.label,r.id]), axis=1)

print(len(tagged))

1612

sents = tagged.values

model = Doc2Vec(sents, size=5, window=5, iter=20, min_count = 0)

sents.shape

(1612,)

model.docvecs.vectors_docs.shape

(1643,5)

Скриншот моих данных

1 Ответ

0 голосов
/ 04 февраля 2019

Количество тегов, которые выучит модель Doc2Vec, равно количеству предоставленных вами уникальных тегов.Вы предоставили 1612 различных значений r.id и 30 различных значений r.label, следовательно, общее количество тегов больше, чем просто количество документов.

(Я подозреваю, что ваши r.id значения являются простыми целыми числами, но начинаются с 1. Если вы используете простые целые числа, а не строки, в качестве тегов, то Doc2Vec будет использовать эти целые числа как индексы для своих внутреннихнепосредственно к массиву векторов. И, таким образом, также будут выделяться индексы int, которые меньше используемых вами чисел, например, 0. Таким образом, вы насчитываете 1612 + 30 + 1 общих известных тегов, поскольку он также выделил место для тега 0.)

Итак, это объясняет количество ваших тегов, и в этом нет ничего плохогоОднако остерегайтесь:

  • Ваш набор данных очень мал: в большинстве опубликованных работ используются от десятков тысяч до миллионов документов.Иногда вы все еще можете выбрать полезные векторы, используя меньшие векторы или более обучающие эпохи, но в основном Doc2Vec и подобные алгоритмы нуждаются в большем количестве данных для лучшей работы.(Тем не менее: вектор size=5 довольно мал!)

  • При небольших данных, особенно, простой режим PV-DBOW (dm=0) часто является быстрым тренировочным топом.исполнитель.(Но обратите внимание: он не обучает словосочетания с помощью контекстных окон, если вы не добавите опцию dbow_words=1, которая затем снова замедляет его с помощью этого дополнительного словесно-векторного обучения.)

  • Не следует ли вообще использовать метки в качестве тегов документа - классическое использование Doc2Vec просто присваивает каждому документу уникальный идентификатор, а затем позволяет последующим шагам изучать отношения с другими вещами.Смешивание в известных других метках уровня документа может иногда помочь или повредить, в зависимости от ваших данных и конечных целей.(Больше тегов может, в некоторой степени, «разбавить» все, что изучено на более крупной модели.)

  • По крайней мере, на естественном языке, сохраняя слова, которые появляются только один или несколько раз, можночасто наносит вред общему качеству вектора.Слишком мало случаев, чтобы их можно было смоделировать, и, поскольку по закону Ципфа будет много таких слов, они могут сильно помешать обучению других лиц.Таким образом, значение по умолчанию min_count=5 (или даже выше с большими наборами данных) часто помогает улучшить общее качество, и не следует полагать, что просто сохранение большего количества данных с min_count=0 обязательно поможет.

...