python - 如何使用预训练嵌入到 gensim skipgram 模型?
问题描述
我想先训练部分语料库,然后基于整个语料库的嵌入训练。我可以用 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)
解决方案
我不确定您为什么要这样做:如果您拥有整个语料库,并且可以在整个语料库上进行训练,那么您可能会从整体语料库训练中获得最佳结果。
而且,在第二语料库中缺少任何内容的情况下,第二语料库训练将倾向于将仍在训练的单词的向量从语料库中不再存在的单词中拉出——导致语料库中向量的可比性衰减。(这只是示例之间交错的拔河比赛,包括所有将它们推到彼此有意义相关的位置的单词。)
但是,请记住这一点:您可以继续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]
,当这些句子被呈现给在初始化期间没有看到这些单词的模型时,它们将被忽略——并且永远不会得到向量。(如果以这种方式使用您的小型示例语料库,“猫”这个词将不会得到向量。同样,您真的想在最大的语料库上进行训练——或者至少使用最大的语料库,带有单词的超集,1st .)
此外,还会记录一个警告,因为第二次训练将再次alpha
以较大的起始值启动内部学习率,然后逐渐降低到最终min_alpha
值。像这样的值不是标准的 SGD,通常表示用户错误。但是,根据你的目标,这可能是可以忍受的——你只需要注意当你在做这样不寻常的训练序列时,你在实验/先进的领域,必须通过你自己的理解来处理可能的副作用.
推荐阅读
- ubuntu-18.04 - NFS 内核服务器活动但已退出状态
- java - 客户端可以负责按需创建由 HikariCP(或其他池解决方案)管理的 java.sql.Connnection 吗?
- java - 有没有办法在无限滚动网站上用硒捕获“div”元素?
- python - python:修改参数而不创建新对象
- html - 如何比较来自firebase的两个字符串的总和
- android - NativeScript HTTP 获取请求不起作用。安卓版本问题?
- javascript - 创建一个读取文本并使用它的 API
- c# - 我想创建 get 方法来从我的 mongo 服务器返回原始 bson 文档,而不将它们映射到具有特定字段的模型
- javascript - 设置状态后无法发送响应
- javascript - 如何添加前缀以响应本机文本输入?