我想使用Gensim在Python中重新训练经过预训练的词嵌入。我要使用的经过预先训练的嵌入是GoogleNews-vectors-negative300.bin文件中的Google Word2Vec。
在Gensim的word2vec教程之后,“无法使用C工具load_word2vec_format()生成的模型继续进行训练。您仍然可以将它们用于查询/相似性,但是那里缺少对训练至关重要的信息(词汇树) ”。 因此,我不能使用KeyedVectors,而为了训练模型,本教程建议使用:
model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)
(https://rare-technologies.com/word2vec-tutorial/)
但是,当我尝试此操作时:
from gensim.models import Word2Vec
model = Word2Vec.load('data/GoogleNews-vectors-negative300.bin')
我收到一条错误消息:
1330 # Because of loading from S3 load can't be used (missing readline in smart_open)
1331 if sys.version_info > (3, 0):
-> 1332 return _pickle.load(f, encoding='latin1')
1333 else:
1334 return _pickle.loads(f.read())
UnpicklingError: invalid load key, '3'.
我没有找到将google新二进制文件正确转换为文本文件的方法,即使这样,我也不确定是否能解决我的问题。
有人能解决这个问题吗?或者知道另一种重新训练预训练词嵌入的方法吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
Word2Vec.load()
方法只能以gensim的本机格式(基于Python对象提取)加载完整模型,而不能加载其他任何二进制/文本格式。
并且,根据文档的注释,“无法使用C工具生成的模型来继续训练”,GoogleNews
原始向量文件中根本没有足够的信息来重构完整的工作模型,被用来训练他们。 (这将需要一些内部模型权重(未保存在该文件中)和字频信息(用于控制采样),也未保存在该文件中。)
您能做的最好的事情是创建一个新的Word2Vec
模型,然后在进行自己的训练之前将其中的所有GoogleNews
向量打补丁。这是一个容易出错的过程,没有真正的最佳实践,并且对最终结果的解释有很多警告。 (例如,如果您引入所有向量,但是仅仅使用自己的语料库和词频来重新训练一个子集,则您进行的训练越多–使词向量更适合您的语料库–越少训练的单词将与保留的未训练单词具有任何有用的可比性。)
从本质上讲,如果您可以查看gensim Word2Vec
的源代码并了解如何将这样的科学怪人模型修补在一起,则可能是合适的。但是,没有内置的支持或方便的现成配方,因为这是固有的模糊过程。