将S3中的Word2Vec二进制模型加载到Gensim失败

时间:2018-05-22 22:16:45

标签: python amazon-s3 gensim serverless

我将Word2Vec模型保存到二进制文件中。我正在尝试将其加载到从此blog改编的无服务器API中,并使用this作为基础。

这在本地工作正常:

self.model = KeyedVectors.load_word2vec_format('./models/models.bin', binary=True)

但是从S3调用文件时出现错误:

  

' IOError:[Errno 2]没有这样的文件或目录:' 46659 100 \ n,| PUNCT   \ XEC> \&XD8 GT; \ XAF \ xa8 \ X95'

def load_model(key):
response = S3.get_object(Bucket=BUCKET_NAME, Key=key)
model_str = response['Body'].read()

model = KeyedVectors.load_word2vec_format(model_str, binary=True)
return model

2 个答案:

答案 0 :(得分:2)

一种更干净,更快捷的方法是直接通过smart_opengensim.models.KeyedVectors.load()使用的gensim.models.KeyedVectors.load_word2vec_format()从S3加载模型。

AWS_ACCESS_KEY_ID = 'abc'
AWS_SECRET_ACCESS_KEY = 'abc'
url = 's3://' + AWS_ACCESS_KEY_ID + ":" + AWS_SECRET_ACCESS_KEY + "@bucket/file.model"
wv = gensim.models.KeyedVectors.load(url)

请参见自述文件中smart_open上的示例:https://github.com/RaRe-Technologies/smart_open

答案 1 :(得分:1)

我认为将文件下载到磁盘,然后从python读取文件,而不是尝试使用get_object()直接将该文件加载到内存中,这样比较干净。如果您担心磁盘空间不足,可以始终删除下载的文件。

这对我来说非常合适:

session = boto3.Session()
s3 = session.resource('s3')
destination_file = 'model.bin.gz'
s3.meta.client.download_file(bucket_name, object_name, destination_file)
model = gensim.models.KeyedVectors.load_word2vec_format(destination_file, binary=True)