token ID 与 token 的相互转换

在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列表

注意事项

  1. 子词处理:对于像BERT这样的子词分词器,一个中文词可能被分成多个token:

    python

    复制

    ids = tokenizer("深度学习")["input_ids"]  # 可能分解为 ['深', '度', '学', '习']
  2. 特殊token:默认会添加[CLS]、[SEP]等,如需去除需设置add_special_tokens=False

  3. 未知词:遇到词汇表没有的词会显示为[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]
重建文本: 这是一个测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值