gensim:泡菜与否?

Chr*_*her 7 memory model pickle gensim

我有一个与gensim有关的问题.我想知道在保存或加载模型(或多个模型)时是否建议或必须使用pickle,因为我在GitHub上找到了可以执行任何操作的脚本.

mymodel = Doc2Vec(documents, size=100, window=8, min_count=5, workers=4)
      mymodel.delete_temporary_training_data(keep_doctags_vectors=True, keep_inference=True)
Run Code Online (Sandbox Code Playgroud)

看到这里

变式1:

import pickle
# Save
mymodel.save("mymodel.pkl")  # Stores *.pkl file
# Load
mymodel = pickle.load("mymodel.pkl")
Run Code Online (Sandbox Code Playgroud)

变式2:

# Save
model.save(mymodel) # Stores *.model file
# Load
model = Doc2Vec.load(mymodel)
Run Code Online (Sandbox Code Playgroud)

gensim.utils我看来,嵌入了一个pickle函数:https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/utils.py

def save ... try:_pickle.dump(self,fname_or_handle,protocol = pickle_protocol)...

我的问题的目标: 我很乐意学习1)我是否需要pickle(为了更好的内存管理)和2)万一,为什么它比加载*.model文件更好.

谢谢!

Wol*_*ngK 5

每当您使用内置 gensim 函数存储模型时save(),无论文件扩展名如何,都会使用pickle。utils文档告诉我们:

类 gensim.utils.SaveLoad

Bases: object

Class which inherit from this class have save/load functions, which un/pickle them to disk.

Warning

This uses pickle for de/serializing, so objects must not contain unpicklable attributes, such as lambda functions etc.
Run Code Online (Sandbox Code Playgroud)

所以gensim会使用pickle来保存任何模型,只要模型类继承自gensim.utils.SaveLoad该类即可。在您的情况下,gensim.models.doc2vec.Doc2Vec继承自gensim.models.base_any2vec.BaseWordEmbeddingsModel哪个又继承自gensim.utils.SaveLoad哪个提供实际save()功能。

回答您的问题:

  1. 是的,除非您想编写自己的函数来将模型存储到磁盘,否则您需要 pickle。使用 pickle 应该没有问题,因为它在标准库中。你甚至不会注意到它。
  2. 如果您使用 gensimsave() 函数,您可以选择任何文件扩展名:*.model、*.pkl、*.p、*.pickle。保存的文件将被腌制。