在大模型使用的过程中,经常会用到token。对于token的过程,有2种方法:tokenizer和tokenizer.tokenize。那么这2种方法之间有什么区别呢?示例代码如下所示。
current_prefix = "输入文本"
# 代码方式1
encoded_input = tokenizer(current_prefix, return_tensors="pt")
# 代码方式2
encoded_input = tokenizer.tokenize(current_prefix, return_tensors="pt")
具体来说,它们分别使用了不同的方法来处理输入文本,并且返回的结果格式也不同。下面详细解释两者的区别:
1. encoded_input = tokenizer(current_prefix, return_tensors="pt")
方法:
tokenizer():这是分词器的默认调用方法,它会执行完整的编码过程,包括分词、转换为 token ID、添加特殊标记(如<s>和</s>)、以及根据需要填充或截断序列。
参数:
return_tensors="pt":指示分词器返回 PyTorch 张量(tensor)。这通常用于直接传递给模型进行推理或训练。
返回值:
- 返回一个字典,包含以下键(取决于具体的分词器和配置):
input_ids:表示 token ID 的张量。attention_mask:可选,表示注意力掩码的张量,用于区分有效 token 和填充 token。token_type_ids:可选,用于区分不同句子类型的 token。
示例输出:
{
'input_ids': tensor([[ 101, 7592, 102]]), # Token IDs
'attention_mask': tensor([[1, 1, 1]]) # Attention mask
}
2. encoded_input = tokenizer.tokenize(current_prefix, return_tensors="pt")
方法:
tokenizer.tokenize():这个方法仅执行分词操作,将输入文本拆分为 token 字符串列表。它不会直接生成 token ID 或其他编码后的结构。
参数:
current_prefix:输入文本字符串。return_tensors="pt":这个参数实际上在这里是无效的,因为tokenize方法不支持此参数。tokenize只返回 token 字符串列表。
返回值:
- 返回一个由 token 字符串组成的列表,每个元素是一个 token。
示例输出:
['[CLS]', '你', '好', '[SEP]']
关键区别
-
功能不同:
tokenizer()执行完整的编码过程,返回的是可以传递给模型的张量。tokenizer.tokenize()仅执行分词操作,返回的是 token 字符串列表。
-
参数支持不同:
tokenizer()支持return_tensors参数,可以指定返回张量的类型(如"pt"表示 PyTorch 张量)。tokenizer.tokenize()不支持return_tensors参数,因为它只返回 token 字符串列表。
-
返回结果不同:
tokenizer()返回一个包含input_ids等信息的字典。tokenizer.tokenize()返回一个 token 字符串列表。
-
应用场景不同:
- 使用
tokenizer()适用于准备模型输入,因为它提供了完整的编码信息。 - 使用
tokenizer.tokenize()适用于需要查看或调试分词结果的情况,但不适合直接传递给模型。
- 使用
正确的使用方式
如果你的目标是准备输入数据并直接传递给模型进行推理或训练,应该使用第一种方式:
from transformers import AutoTokenizer
# 加载预训练的分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
# 示例前缀文本
current_prefix = "你好世界"
# 使用分词器对文本进行完整编码
encoded_input = tokenizer(current_prefix, return_tensors="pt")
print(encoded_input)
如果你想查看分词后的 token 字符串,应该使用第二种方式,但要注意 return_tensors 参数在这种情况下是无效的:
from transformers import AutoTokenizer
# 加载预训练的分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
# 示例前缀文本
current_prefix = "你好世界"
# 使用分词器仅进行分词
tokens = tokenizer.tokenize(current_prefix)
print(tokens)
2376

被折叠的 条评论
为什么被折叠?



