如何在生产中使用doc2vec模型?

use*_*538 2 python nlp gensim doc2vec

我想知道如何在生产中部署 doc2vec 模型来创建词向量作为分类器的输入特征。具体来说,doc2vec 模型在语料库上进行如下训练。

dataset['tagged_descriptions'] = datasetf.apply(lambda x: doc2vec.TaggedDocument(
            words=x['text_columns'], tags=[str(x.ID)]), axis=1)

model = doc2vec.Doc2Vec(vector_size=100, min_count=1, epochs=150, workers=cores,
                                window=5, hs=0, negative=5, sample=1e-5, dm_concat=1)

corpus = dataset['tagged_descriptions'].tolist()

model.build_vocab(corpus)

model.train(corpus, total_examples=model.corpus_count, epochs=model.epochs)

Run Code Online (Sandbox Code Playgroud)

然后将其转储到 pickle 文件中。词向量用于训练分类器(例如随机森林)来预测电影情绪。

现在假设在生产中,有一个文档包含一些全新的词汇。话虽如此,他们并不在 doc2vec 模型训练期间在场的人中。我想知道如何处理这样的情况。

作为旁注,我知道更新 gensim Doc2Vec 模型Gensim 的训练文档:如何使用以前的 word2vec 模型重新训练 doc2vec 模型。然而,我希望能对此事有更多的了解。

goj*_*omo 5

模型Doc2Vec只能报告训练期间存在的文档的训练向量,并且只能报告包含infer_vector()训练期间存在的单词的文本的新文档向量。(传递给的无法识别的单词.infer_vector()将被忽略,类似于min_count训练期间忽略出现次数少于次数的任何单词的方式。)

\n\n

如果随着时间的推移,您获得了许多包含新词汇的新文本,并且这些单词很重要,那么您将不得不偶尔重新训练模型Doc2Vec。并且,重新训练后,重新训练模型中的文档向量通常无法与原始模型 \xe2\x80\x93 中的文档向量进行比较,因此使用文档向量的下游分类器和其他应用程序将需要更新,还有。

\n\n

您自己的生产/部署要求将决定重新训练的频率以及用新模型替换旧模型的频率。

\n\n

(虽然Doc2Vec模型可以随时输入新的训练数据,但作为一种“微调”增量地这样做会带来新旧数据之间平衡的棘手问题。而且,没有官方的 gensim 支持来扩展现有的词汇量模型Doc2Vec。因此,最可靠的方法是使用所有可用数据从头开始重新训练。)

\n\n

关于示例训练代码的一些附注:

\n\n
    \n
  • 这很少是min_count=1一个好主意:罕见的单词通常充当“噪音”,没有足够的使用示例来很好地建模,因此“噪音”只会减慢/干扰可以从更常见的单词中学习的模式

  • \n
  • dm_concat=1最好将其视为实验/高级模式,因为它使模型明显更大且训练速度更慢,但其优点尚未得到证实。

  • \n
  • 许多已发表的作品仅使用 10-20 个训练周期;较小的数据集或较小的文档有时会受益更多,但 150 可能会花费大量时间,而边际效益却很小。

  • \n
\n