我正在使用推文准备 Doc2Vec 模型。每条推文的单词数组都被视为一个单独的文档,并标记为“SENT_1”、SENT_2“等。
taggeddocs = [] for index,i in enumerate(cleaned_tweets): if len(i) > 2: # Non empty tweets sentence = TaggedDocument(words=gensim.utils.to_unicode(i).split(), tags=[u'SENT_{:d}'.format(index)]) taggeddocs.append(sentence) # build the model model = gensim.models.Doc2Vec(taggeddocs, dm=0, alpha=0.025, size=20, min_alpha=0.025, min_count=0) for epoch in range(200): if epoch % 20 == 0: print('Now training epoch %s' % epoch) model.train(taggeddocs) model.alpha -= 0.002 # decrease the learning rate model.min_alpha = model.alpha # fix the learning rate, no decay
我希望查找与给定推文类似的推文,例如“SENT_2”。怎么办?
我得到类似推文的标签:
sims = model.docvecs.most_similar('SENT_2') for label, score in sims: print(label)
打印为:
SENT_4372 SENT_1143 SENT_4024 SENT_4759 SENT_3497 SENT_5749 SENT_3189 SENT_1581 SENT_5127 SENT_3798
但是给定一个标签,我如何获得原始推文单词/句子?例如。例如,“SENT_3497”的推文是什么?我可以将其查询到 Doc2Vec 模型吗?
最佳答案
Gensim 的 Word2Vec/Doc2Vec 模型不存储语料库数据 - 它们仅通过多次检查来训练模型。如果您需要检索原始文本,您应该填充您自己的按键查找数据结构,例如 Python 字典(如果您的所有示例都适合内存)。
另外,在最新版本的 gensim 中,您的代码实际上会对您的 taggeddocs
进行 1,005 次训练,其中许多都具有无意义/破坏性的负 alpha
值。
通过将其传递给构造函数,您可以告诉模型使用您的参数和默认值(其中包括默认的
iter=5
遍数)进行 self 训练。然后再进行 200 次循环。每次调用
train()
都会执行默认的 5 遍。通过将alpha
从 0.025 递减 0.002 199 次,最后一个循环将使用有效的alpha
0.025-(200*0.002)=-0.375 - 一个负值,本质上是告诉我们模型在每个训练示例的改进方向上进行较大的修正。
只需使用iter
参数来选择所需的传递次数。让类自行管理 alpha
更改。如果在实例化模型时提供语料库,则无需执行进一步的步骤。但如果您在实例化时不提供语料库,则需要执行一次 model.build_vocab(tagged_docs)
一次,然后执行 model.train(tagged_docs)
一次。
关于python - 如何提取用于 Doc2Vec 的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40296765/