【问题标题】:Why does a Gensim Doc2vec object return empty doctags?为什么 Gensim Doc2vec 对象返回空文档标签?
【发布时间】:2020-05-25 16:54:27
【问题描述】:

我的问题是我应该如何解释我的情况?

我按照本教程 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 对象只返回vectors_docs 而不返回任何doctags?

感谢您提前提供任何 cmet 和答案。

这是我用来训练 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返回

【问题讨论】:

    标签: gensim doc2vec


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我提供的tags 实际上是字符串。除了 int vs string 标签,还有哪些其他因素会影响结果?
    • 唯一会导致model.docvecs.doctags 为空的事情是(1)仅使用整数作为标签;或 (2) 实际上根本不提供任何标签。仔细检查您正在创建的 TaggedDocument 实例。 (例如,查看train_corpus[0].tags,以确保它是您想要的标签类型,并查看len(train_corpus),以确保它是您想要的大小。)
    • 显然,我的tags 是整数。我插入的words 是字符串。非常感谢你的帮助。我通过将tags 转换为strings 解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多