加载葡萄牙语预训练词向量时遇UnicodeDecodeError问题求助
解决Polyglot葡萄牙语词向量加载的UnicodeDecodeError问题
我之前处理过类似的Python3加载Polyglot预训练向量的问题,核心原因其实是Polyglot的预训练文件大多是用Python2序列化保存的,而Python3的pickle默认编码和Python2不兼容,才会抛出UnicodeDecodeError。结合你的MacOS+Python3环境,给你几个可行的解决方案:
方案1:给pickle加载显式指定编码参数
你提到用pickle加载时报错,只需要在pickle.load()里加上encoding='latin1'参数就能解决,这个编码是Python2 pickle文件的常用编码,能正确把旧格式的字符串解码为Python3的str类型。
示例代码:
import pickle # 替换成你的Polyglot向量文件路径 with open("/path/to/polyglot_pt.pkl", "rb") as f: embedding_data = pickle.load(f, encoding="latin1") # 如果需要转成Polyglot的Embedding对象 from polyglot.mapping import Embedding embeddings = Embedding(embedding_data["words"], embedding_data["vectors"])
方案2:修复官方Embedding.load的编码逻辑
如果用Polyglot官方的Embedding.load()方法还是报错,那可以直接手动控制pickle的反序列化过程,绕过官方方法的默认编码限制:
from polyglot.mapping import Embedding import pickle def load_polyglot_with_fix(file_path): with open(file_path, "rb") as f: unpickler = pickle._Unpickler(f) # 设置编码为latin1适配Python2的pickle文件 unpickler.encoding = "latin1" data = unpickler.load() return Embedding(data["words"], data["vectors"]) # 调用自定义加载函数 embeddings = load_polyglot_with_fix("/path/to/polyglot_pt.pkl")
方案3:改用文本格式的向量文件加载
如果上述方法都不奏效,你可以找找Polyglot葡萄牙语向量的纯文本版本(每行格式为「单词 + 空格分隔的向量值」),然后用Gensim来加载,这样更直观也不容易出编码问题:
from gensim.models import KeyedVectors # 加载文本格式的向量,根据实际编码调整encoding参数 vectors = KeyedVectors.load_word2vec_format( "/path/to/polyglot_pt.txt", binary=False, encoding="utf-8" # 或者latin1,看文件实际编码 )
额外注意事项
- 先确认你的向量文件没有损坏,建议重新下载一次Polyglot的葡萄牙语向量包,避免因下载中断导致文件残缺;
- MacOS下如果文件路径包含特殊字符或中文,尽量用绝对路径,避免路径解析错误;
- 可以尝试安装Polyglot的兼容版本,比如
pip install polyglot==16.7.4,这个版本对Python3的兼容性比新版更好。
内容的提问来源于stack exchange,提问作者Luís Flávio
相关产品推荐
相关产品推荐

