我已经将Word2Vec模型保存到二进制文件中。我正在尝试将其加载到改编自此博客的无服务器 API 中,并以此为基础。
这在本地工作正常:
self.model = KeyedVectors.load_word2vec_format('./models/models.bin', binary=True)
但是从 S3 调用文件时,它出错:
'IOError: [errno 2] 没有这样的文件或目录: '46659 100,|标点 \xec>\xd8>\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
一种更干净、更快捷的方法是直接从 S3 加载模型到smart_open
,gensim.models.KeyedVectors.load()
和gensim.models.KeyedVectors.load_word2vec_format()
都使用它。
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
我认为将文件下载到磁盘,然后从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)