Я получаю больше векторов, чем размер моего документа - gensim doc2vec

У меня есть белковые последовательности, и я хочу сделать 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)

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


person user10950908    schedule 04.02.2019    source источник


Ответы (1)


Количество тегов, которые усвоит модель 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 обязательно поможет.

person gojomo    schedule 04.02.2019