gensim - 为什么 Gensim Doc2vec 对象返回空文档标签?
问题描述
我的问题是我应该如何解释我的情况?
我按照本教程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 对象不返回任何 doctags 而只返回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}]')
解决方案
如果tags
您提供的所有内容都是纯 Python 整数,则这些整数将用作向量数组的直接索引。
这节省了维护从任意标签到索引的映射的开销。
但是,它也可能导致向量数组的过度分配,对于您提供的最大 int 标记来说足够大,即使从未使用其他较低的 int 也是如此。(也就是说:如果您提供了一个带有 的文档,tags=[1000000]
它将分配一个足以容纳标签 0 到 1000000 的数组,即使其中大多数从未出现在您的训练数据中。)
如果要model.docvecs.doctags
收集所有标签的列表,请使用字符串标签而不是纯整数。
另外:不要train()
在你自己的循环中多次调用,或者alpha
在你自己的代码中管理学习率,除非你有充分的理由这样做。它效率低下且容易出错。(例如,您的代码实际上执行了 200 个训练周期,如果您在不仔细调整alpha
增量的情况下增加循环计数,您可能会得到无意义的负值alpha
——这是遵循这种不良做法的代码中非常常见的错误。使用所需的 epoch 数调用.train()
一次。将alpha
and设置min_alpha
为合理的起始值和接近零的值——可能只是默认值,除非你确定你的更改有帮助——然后不要管它们。
推荐阅读
- tensorflow - 在 tf.while_loop 期间将 Tensorflow 索引到 python 列表中
- performance - Firebase 实时数据库:我的查询是否需要额外的容器?
- oracle - 将触发器的参数序列化为字符串
- javascript - 将变量添加到属性
- asp.net - 错误:配置部分不能包含 CDATA 或文本元素
- r - 删除数据框中某个变量下的值为 0 的行
- eclipse - Eclipse 图标不清晰
- javascript - 如何将'>'添加到javascript中字符串的每个新行?
- html - 如何为条形图剪辑路径设置动画?
- java - Netty - 如何在 DDOS 中生存?