我想先训练部分语料库,然后再基于对整个语料库的嵌入训练。我可以用gensim skipgram实现吗?
我还没有找到可以通过初始嵌入的API。
我想要的是类似的东西
from gensim.models import Word2Vec
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"],
["cat2", "say2", "meow"], ["dog2", "say", "woof"]]
model = Word2Vec(sentences[:2], min_count=1)
X = #construct a new one
model = Word2Vec(sentences, min_count=1, initial_embedding=X)
答案 0 :(得分:0)
我不确定为什么要这样做:如果您拥有整个语料库,并且可以在整个语料库上进行训练,那么您可能会从整体语料库训练中获得最佳结果。
在某种程度上,第二语料库缺少任何内容,第二语料库训练将趋向于将仍在训练的单词的向量与不再在语料库中的单词拉离,从而使语料库中的向量具有可比性。衰变。 (只是示例之间的交错拔河,包括所有单词,将它们推到彼此有意义的位置。)
但是,请记住这一点:您可以继续train()
使用新数据的模型。那就是:
# initialize & do all default training
model = Word2Vec(sentences[:2], min_count=1)
# now train again even more with a slightly different mix
model.train(sentences, total_examples = len(sentences), epochs=model.epochs)
请注意,在这种情况下,模型的发现词汇仅基于原始初始化。如果sentences[0]
中只有单词,那么当将这些句子提交给模型时,在初始化过程中没有看到这些单词,它们将被忽略-永远不会得到向量。 (如果以这种方式使用微小的示例语料库,那么“猫”一词将不会得到向量。同样,您真的想在最大的语料库上进行训练,或者至少要使用最大的语料库,该词库带有单词的超集,第一个)
此外,将记录一条警告,因为第二次训练将再次以更大的初始值开始内部alpha
的学习速度,然后逐渐将其降低到最终的min_alpha
值。像这样的值不是标准的SGD,通常表示用户错误。但是,根据您的目标,这可能是可以容忍的–您只需要知道当您在执行这样的非常规训练序列时,您就处于实验/高级领域,必须通过自己的理解来应对可能的副作用