迭代加载目录下gensim预训练Word2Vec模型报错如何解决?
第一个TypeError报错原因
你使用os.fsencode()将输入路径转为了字节类型,调用os.listdir()返回的文件名也为字节类型,最终拼接的file_path是字节对象,而gensim的load方法内部判断文件后缀时使用的是字符串类型的后缀名,类型不匹配触发报错。你后续将input_dir改为字符串类型的操作是正确的,已经解决了该问题。
第二个UnpicklingError报错原因
该错误属于反序列化失败,核心原因是你批量遍历目录时,将非Word2Vec主模型的无效文件传入了load方法:
- 可能是系统生成的隐藏文件(比如macOS的
.DS_Store、Windows的Thumbs.db) - 可能是gensim保存模型时自动生成的附属权重文件(比如
*.wv.vectors.npy这类,这类文件不需要手动加载,主模型加载时会自动读取) - 可能是目录下的子文件夹、临时缓存文件
你单独加载时选择的都是正确的主模型文件,因此不会触发错误,批量无差别加载时就会遇到无效文件触发反序列化失败。
解决方案
需要在遍历文件时增加过滤规则,只传入符合要求的模型主文件,也可以增加异常捕获避免无效文件中断加载流程,示例代码如下:
import gensim import os def iterated_gensim_load(embed_dir: str): loaded_models = {} for filename in os.listdir(embed_dir): # 跳过隐藏文件 if filename.startswith('.'): continue # 只加载你保存模型时约定后缀的文件,比如你保存时统一用.model作为主模型后缀,可按需修改 if not filename.endswith('.model'): continue file_path = os.path.join(embed_dir, filename) # 跳过子目录 if not os.path.isfile(file_path): continue # 异常捕获,跳过加载失败的文件 try: model = gensim.models.Word2Vec.load(file_path) loaded_models[filename] = model except Exception as e: print(f"文件{filename}加载失败,已跳过,错误信息:{e}") return loaded_models # 调用方法 input_dir = 'User/Directory/' all_word2vec_models = iterated_gensim_load(input_dir)
如果你保存模型时没有统一设置后缀,可以删除后缀判断的逻辑,仅保留隐藏文件过滤、子目录过滤和异常捕获逻辑,也可以正常完成批量加载。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

