save/reuse 用于进一步预测的基于 doc2vec 的模型

save/reuse doc2vec based model for further predictions

我一直在关注以下使用 doc2vec 进行文本分类的示例:

https://github.com/susanli2016/NLP-with-Python/blob/master/Text%20Classification%20model%20selection.ipynb

我 运行 这个笔记本在我的数据集上,想将其中一个 doc2vec 模型应用到第三个数据集(例如,构建 test/train 模型的整个数据集)。我试过了:

X_train, X_test, y_train, y_test = train_test_split(df.post, df.tags, random_state=0, test_size=0.3)
X_train = label_sentences(X_train, 'Train')
X_test = label_sentences(X_test, 'Test')

#added
big_text = label_sentences(big_text, 'Test') #big_text = larger dataframe

#old
#all_data = X_train + X_test

#new
all_data = X_train + X_test + big_text 

1 - 这对于应用目的来说并不实用。想要预测的数据可能在 train/testing 时不可用。

2 - 模型性能因此下降

那么我怎样才能保存一次模型并应用到一个完全不同的数据集呢?看来我还需要用其他数据集的文档更新 doc2vec 模型。

gensim Doc2Vec 模型可以使用 .save(filepath).load(filepath) 方法保存和加载。 (使用这些原生到 gensim 的方法将适用于比普通 Python pickling 可以支持的更大的模型,并且更有效地将一些较大的内部数组存储为单独的文件。(如果移动保存的模型,请务必将此附属文件与位于 filepath 位置的主文件放在一起。)

先前训练的 Doc2Vec 模型可以通过 .infer_vector(list_of_words) 方法为新文本生成文档向量。

请注意,提供给此方法的 list_of_words 应该 preprocessed/tokenized 与训练数据完全相同——以及任何不存在的词(或足够 min_count 频繁出现的词) 在训练数据中将被忽略。 (在极端情况下,这意味着如果你传入一个 list_of_words 没有识别的词,所有的词都会被忽略,你会得到一个随机初始化但完全没有通过推理改进的向量。)

不过,如果您要根据来自某个新领域的新数据重新评估或重新训练下游预测模型,您通常也想重新训练 Doc2Vec 阶段,使用所有可用数据,以便它有机会从新的使用上下文中学习新单词。 (这主要是当您的训练数据广泛且具有代表性,并且您的新数据以增量方式出现并且 vocabulary/usage/domain 没有重大变化时,您会希望依赖 .infer_vector()。)