在Hugging Face的Transformers库中,将token ID转换回单词(token)可以使用tokenizer的decode()
或convert_ids_to_tokens()
方法。以下是具体方法和区别:
1. 使用decode()
方法(推荐用于完整文本)
# 假设有token IDs列表 token_ids = tokenizer("你好世界", add_special_tokens=False)["input_ids"] # 例如 [2769, 2157, 742] # 转换回文本(自动合并子词) text = tokenizer.decode(token_ids) print(text) # 输出: "你好世界"
2. 使用convert_ids_to_tokens()
方法(获取原始token)
tokens = tokenizer.convert_ids_to_tokens(token_ids) print(tokens) # 输出: ['你', '好', '世界'] 或子词如 ['[UNK]'](未知词)
3. 处理特殊情况的完整示例
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese") # 编码 text = "自然语言处理" input_ids = tokenizer(text, add_special_tokens=False)["input_ids"] print("Token IDs:", input_ids) # 例如 [3207, 976, 1798, 1920] # 解码方法1:完整文本 decoded_text = tokenizer.decode(input_ids) print("Decoded text:", decoded_text) # "自然语言处理" # 解码方法2:逐个token tokens = tokenizer.convert_ids_to_tokens(input_ids) print("Tokens:", tokens) # ['自', '然', '语', '言', '处', '理'] 或子词 # 处理特殊符号(如[CLS]、[SEP]) special_text = "[CLS]自然语言处理[SEP]" special_ids = tokenizer(special_text)["input_ids"] # 注意这里没有add_special_tokens=False print("With special tokens:", tokenizer.decode(special_ids)) # "[CLS] 自然语言处理 [SEP]"
关键区别
方法 | 输出类型 | 是否合并子词 | 处理特殊token |
---|---|---|---|
decode() | 字符串 | 是 | 是 |
convert_ids_to_tokens() | token列表 | 否 | 否 |
注意事项
-
子词处理:对于像BERT这样的子词分词器,一个中文词可能被分成多个token:
python
复制
ids = tokenizer("深度学习")["input_ids"] # 可能分解为 ['深', '度', '学', '习']
-
特殊token:默认会添加[CLS]、[SEP]等,如需去除需设置
add_special_tokens=False
-
未知词:遇到词汇表没有的词会显示为
[UNK]
,可通过扩展词汇表解决
反向转换完整流程示例
# 编码 → 解码完整流程 original_text = "这是一个测试" token_ids = tokenizer(original_text, add_special_tokens=False)["input_ids"] reconstructed_text = tokenizer.decode(token_ids) print(f"原始文本: {original_text}") print(f"Token IDs: {token_ids}") print(f"重建文本: {reconstructed_text}")
输出示例:
原始文本: 这是一个测试 Token IDs: [6821, 3221, 671, 1368] 重建文本: 这是一个测试