Почему объект Gensim Doc2ve c возвращает пустые теги документов? - PullRequest
1 голос
/ 25 мая 2020

Мой вопрос: как мне интерпретировать свою ситуацию?

Я обучил модель Doc2Ve c, следуя этому руководству https://blog.griddynamics.com/customer2vec-representation-learning-and-automl-for-customer-analytics-and-personalization/.

По какой-то причине doc_model.docvecs.doctags возвращает {}. Но doc_model.docvecs.vectors_docs, похоже, возвращает правильное значение.

Почему объект doc2ve c не возвращает никаких тегов, кроме vectors_docs?

Заранее благодарим вас за любые комментарии и ответы.

Это код, который я использовал для обучения модели Doc2Ve c.

from gensim.models.doc2vec import LabeledSentence, TaggedDocument, Doc2Vec
import timeit
import gensim

embeddings_dim = 200    # dimensionality of user representation

filename = f'models/customer2vec.{embeddings_dim}d.model'
if TRAIN_USER_MODEL:

    class TaggedDocumentIterator(object):
        def __init__(self, df):
           self.df = df
        def __iter__(self):
            for row in self.df.itertuples():
                yield TaggedDocument(words=dict(row._asdict())['all_orders'].split(),tags=[dict(row._asdict())['user_id']])

    it = TaggedDocumentIterator(combined_orders_by_user_id)

    doc_model = gensim.models.Doc2Vec(vector_size=embeddings_dim, 
                                      window=5, 
                                      min_count=10, 
                                      workers=mp.cpu_count()-1,
                                      alpha=0.055, 
                                      min_alpha=0.055,
                                      epochs=20)   # use fixed learning rate

    train_corpus = list(it)

    doc_model.build_vocab(train_corpus)

    for epoch in tqdm(range(10)):
        doc_model.alpha -= 0.005                    # decrease the learning rate
        doc_model.min_alpha = doc_model.alpha       # fix the learning rate, no decay
        doc_model.train(train_corpus, total_examples=doc_model.corpus_count, epochs=doc_model.iter)
        print('Iteration:', epoch)

    doc_model.save(filename)
    print(f'Model saved to [{filename}]')

else:
    doc_model = Doc2Vec.load(filename)
    print(f'Model loaded from [{filename}]')

doc_model.docvecs.vectors_docs возвращает enter image description here

1 Ответ

1 голос
/ 25 мая 2020

Если все tags, которые вы предоставляете, являются простыми Python целыми числами, эти целые числа используются как прямые индексы в массиве векторов.

Это экономит накладные расходы на поддержание сопоставления произвольных тегов с индексами.

Но это также может привести к перераспределению массива векторов, которое будет достаточно большим для самого большого тега int вы предоставили, даже если другие нижние целые числа никогда не используются. (То есть: если вы предоставили один документ с tags=[1000000], он выделит массив, достаточный для тегов от 0 до 1000000, даже если большинство из них никогда не появляется в ваших обучающих данных.)

Если вы хотите, чтобы model.docvecs.doctags собирал список всех ваших тегов, используйте строковые теги, а не простые целые числа.

Отдельно: не вызывайте train() несколько раз в вашем собственном l oop или управляйте скоростью обучения alpha в своем собственном коде, если у вас нет очень веских причин для этого. Это неэффективно и подвержено ошибкам. (Ваш код, например, на самом деле выполняет 200 тренировочных эпох, и если бы вы увеличили счет l oop без тщательной регулировки приращения alpha, вы могли бы получить бессмысленные отрицательные значения alpha - очень распространенная ошибка в коде, следующая за этой плохой практикой. Вызовите .train() один раз с желаемым количеством эпох. Установите alpha и min_alpha на разумные начальные и почти нулевые значения - возможно, только значения по умолчанию, если вы не уверены в своем изменении помогает - а потом оставьте их в покое.

...