如何提取多语言Universal Sentence Encoder训练词汇?
提取多语言版Universal Sentence Encoder的SentencePiece词表
问题背景
从多语言QA版Universal Sentence Encoder(SavedModel格式)中提取到SentencepieceOp的model属性字节串后,尝试用pickle、普通解码等方法解析均失败,字节串示例如下:
model_string[100:200] >>> b"\x19\n\x10extra_token_id_3\x15\x00\x00\x00\x00\x18\x04\n\n\n\x03\xe2\x96\x81\x15_\xbaU\xc0\n\x08\n\x01,\x15~\xdac\xc0\n\x08\n\x01.\x15\x08\xf6d\xc0\n\x08\n\x01s\x15\xe8\xa8\x8b\xc0\n\x0b\n\x04\xe2\x96\x81a\x15\xaf \x9b\xc0\n\x08\n\x01'\x15j\xe9\x9b\xc0\n\r\n\x06\xe2\x96\x81th"
错误原因
该字节串是SentencePiece模型的Protocol Buffer序列化数据,并非pickle或通用压缩格式,因此不能用pickle加载或普通文本解码方式解析。
正确提取方法
使用官方sentencepiece库直接解析该字节串,无需写入临时文件:
import sentencepiece as spm # 初始化SentencePiece处理器 sp_processor = spm.SentencePieceProcessor() # 直接从序列化字节串加载模型 sp_processor.LoadFromSerializedProto(model_string) # 验证词表 print(f"词表总大小:{sp_processor.get_piece_size()}") # 查看前10个词表条目 for idx in range(10): print(f"ID {idx}: {sp_processor.id_to_piece(idx)}") # 测试分词功能 print("测试分词:", sp_processor.encode("Hello 世界", out_type=str))
如果需要保存模型文件备用,也可以先将字节串写入文件再加载:
# 写入临时模型文件 with open("use_multilingual_sp.model", "wb") as f: f.write(model_string) # 从文件加载 sp_processor = spm.SentencePieceProcessor() sp_processor.load("use_multilingual_sp.model")
内容的提问来源于stack exchange,提问作者Drivebyluna
相关产品推荐
相关产品推荐

