1

我正在使用推文准备一个 Doc2Vec 模型。每条推文的单词数组都被视为一个单独的文档,并被标记为“SENT_1”、SENT_2”等。

标记文档 = []
对于索引,我在枚举(cleaned_tweets):
    if len(i) > 2: # 非空推文
        句子 = TaggedDocument(words=gensim.utils.to_unicode(i).split(), tags=[u'SENT_{:d}'.format(index)])
        taggeddocs.append(句子)

# 建立模型
模型 = gensim.models.Doc2Vec(taggeddocs, dm=0, alpha=0.025, size=20, min_alpha=0.025, min_count=0)

对于范围内的纪元(200):
    如果纪元 % 20 == 0:
        print('现在训练 epoch %s' % epoch)
    model.train(标记文档)
    model.alpha -= 0.002 # 降低学习率
    model.min_alpha = model.alpha # 固定学习率,没有衰减

我希望找到与给定推文类似的推文,例如“SENT_2”。如何?

我得到类似推文的标签:

sims = model.docvecs.most_similar('SENT_2')
对于标签,在模拟人生中得分:
    打印(标签)

它打印为:

SENT_4372
SENT_1143
SENT_4024
SENT_4759
SENT_3497
SENT_5749
SENT_3189
SENT_1581
SENT_5127
SENT_3798

但是给定一个标签,我如何获得原始推文单词/句子?例如,“SENT_3497”的推文是什么。我可以向 Doc2Vec 模型查询这个吗?

4

1 回答 1

1

Gensim 的 Word2Vec/Doc2Vec 模型不存储语料库数据——他们只检查它,多遍,以训练模型。如果您需要检索原始文本,您应该填充自己的按键查找数据结构,例如 Python 字典(如果您的所有示例都适合内存)。

另外,在最近版本的 gensim 中,您的代码实际上将在您taggeddocsalpha.

  • 通过将其传递给构造函数,您是在告诉模型使用您的参数和默认值来训练自己,其中包括默认的iter=5传递次数。

  • 然后你再做 200 次循环。每次调用train()都会执行默认的 5 次传递。通过alpha从 0.025 减少 0.002 199 倍,最后一个循环将使用alpha0.025-(200*0.002)=-0.375 的有效值 - 一个负值基本上告诉模型在每次训练的相反方向上进行大修正 -例子。

只需使用iter参数选择所需的通过次数。让班级alpha自己管理更改。如果在实例化模型时提供语料库,则不需要进一步的步骤。但是,如果您在实例化时不提供语料库,则需要执行model.build_vocab(tagged_docs)一次,然后执行model.train(tagged_docs)一次。

于 2017-01-19T03:54:21.820 回答