You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取多语言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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 04:06:37