为什么Gensim Doc2vec对象返回空doctag?

问题描述 投票:1回答:1

我的问题是我应该如何解释我的处境?

我按照本教程https://blog.griddynamics.com/customer2vec-representation-learning-and-automl-for-customer-analytics-and-personalization/训练了Doc2Vec模型。

由于某种原因,doc_model.docvecs.doctags返回{}。但是doc_model.docvecs.vectors_docs似乎返回了正确的值。

为什么doc2vec对象不返回任何doctag而是vectors_docs?

谢谢您的任何评论和答复。

这是我用来训练Doc2Vec模型的代码。

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

gensim doc2vec
1个回答
0
投票

如果您提供的所有tags都是纯Python整数,则这些整数将用作vectors数组的直接索引。

这节省了维护从任意标签到索引的映射的开销。

但是,即使从未使用过其他较低的int值,也可能导致vectors数组的过度分配,对于您提供的最大int标记而言,其足够大。 (也就是说:如果您提供一个带有tags=[1000000]的文档,它将为标签0到1000000分配足够的数组,即使其中大多数标签从未出现在训练数据中也是如此。)

如果要model.docvecs.doctags收集所有标签的列表,请使用字符串标签,而不要使用纯整数。

单独:不要在自己的循环中多次调用train(),也不要在自己的代码中管理alpha的学习率,除非您有充分的理由这样做。它效率低下且容易出错。 (例如,您的代码实际上执行了200个训练周期,如果您在不仔细调整alpha增量的情况下增加循环计数,则可能会出现无意义的alpha负值–这是一个非常常见的错误遵循这种不良做法的代码。以所需的时期数调用一次.train()。将alphamin_alpha设置为合理的起始值和接近零的值(除非您确定所做的更改有帮助,否则可能只是默认值)–然后不理他们。

© www.soinside.com 2019 - 2024. All rights reserved.