python - 如何在生产中使用 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)
然后将其转储到泡菜文件中。词向量用于训练分类器(例如随机森林)来预测电影情绪。
现在假设在生产中,有一个包含一些全新词汇表的文档。话虽如此,他们并不在 doc2vec 模型的训练期间出现。我想知道如何处理这种情况。
作为旁注,我知道更新 gensim Doc2Vec 模型和Gensim 的培训文档:如何使用以前的 word2vec 模型重新训练 doc2vec 模型。然而,我希望能在这个问题上得到更多的启发。
解决方案
模型Doc2Vec
将只能报告训练期间出现的文档的训练向量,并且只能infer_vector()
为包含训练期间出现的单词的文本生成新的文档向量。(传递给的无法识别的单词将被忽略,类似于在训练期间.infer_vector()
任何出现次数少于次数的单词都会被忽略。)min_count
如果随着时间的推移,你获得了许多带有新词汇的新文本,并且这些词很重要,你将不得不偶尔重新训练Doc2Vec
模型。而且,在重新训练之后,来自重新训练模型的 doc-vectors 通常无法与来自原始模型的 doc-vectors 进行比较——因此下游分类器和其他使用 doc-vectors 的应用程序也需要更新。
您自己的生产/部署要求将决定这种重新训练的频率,以及用新模型替换旧模型的频率。
(虽然Doc2Vec
可以随时为模型提供新的训练数据,但作为一种“微调”,这样做会逐渐引入新旧数据之间的平衡问题。而且,没有官方的 gensim 支持扩展现有的词汇表一个Doc2Vec
模型。因此,最稳健的课程是使用所有可用数据从头开始重新训练。)
关于您的示例培训代码的一些旁注:
很难
min_count=1
成为一个好主意:稀有词通常用作“噪音”,没有足够的使用示例来很好地建模,因此“噪音”只会减慢/干扰可以从更常见的词中学习的模式dm_concat=1
最好将其视为实验/高级模式,因为它使模型显着更大且训练速度更慢,并且具有未经证实的好处。许多已发表的作品仅使用 10-20 个训练时期;较小的数据集或较小的文档有时会受益更多,但 150 可能会花费大量时间而边际收益却很少。
推荐阅读
- html - 将图标添加到 wpform 提交按钮
- d3.js - 如何在 d3 中为图表制作工具提示?
- c# - 我如何将资源文件导入 DGV
- python - 浏览器“ERR_CONNECTION_REFUSED”中的 Ray Dashboard 错误
- javascript - curl API PHP 使用 ajax
- python-3.x - Requests.post 仅在设置偏移量和限制后才返回前 50 条记录
- mysql - SQL查询从多个表中选择问题
- enums - Swashbuckle 中的自定义 SchemaFilter 以显示带有描述的枚举但更改输入值
- javascript - 在 href 表达式中查找 http并将其替换为 https
- solr - Solr数据导入-刷新状态获取不同状态