在Token 到底是个啥?这篇文章中,介绍了token的概念。
我们可以这么认为,token是自然语言处理场景中(如文本生成、AI聊天),AI模型处理的最小单位。
在计算机视觉中,模型是以像素为单位,来处理图像像素之间的关系的,而语言模型则是以token为单位来理解token之间的关系。
下面我将通过一个小例子,来展示一下语言模型是如何将一段文本转换为token的,以及模型将文本转换为token之后是什么样子。
通过这个例子,希望你可以对模型处理 token 这个过程有一个感性的认识。
1、BERT 如何对文本进行转换
我们使用 BERT 这个模型来对文本进行处理。
BERT,全称是Bidirectional Encoder Representations from Transformers,是由Google 在2018年提出的自然语言处理模型。
当时,这个模型在很多 nlp 任务中都取得了非常好的性能,包括文本问答、自然语言推断和情感分析等,可以说一度SOTA了很长时间。
我们可以使用下面的代码,来调用bert模型对一段文本进行token化。
需要说明的是,首次运行上述代码时,如缺少相关的库,需要下载安装。
比如,使用 pip3 install transformers 下载安装 transformers库。
在运行下面的代码时,会从Hugging Face上下载bert的tokenizer等文件,建议先按照三条命令快速配置 Hugging Face的内容配置好相关的环境。
第一次下载可能时间会较长,等待即可。
下载完成后相关文件会放在系统缓存目录下,再一次运行时就不会再下载了,可直接使用。
# 从transformers库中导入BertTokenizer类
from transformers import BertTokenizer
# 初始化BertTokenizer,加载'bert-base-uncased'预训练模型。
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# 定义一个示例文本字符串。
text = "I debug my code all day, and I am like a debugger."
# 使用tokenizer对文本进行编码,将文本分割成tokens,同时映射到相应的ID。
encoded_input = tokenizer(text)
# 使用tokenizer的convert_ids_to_tokens方法将tokens的ID转换回可读的tokens。
tokens = tokenizer.convert_ids_to_tokens(encoded_input['input_ids'])
# 打印出tokens及其对应的ID。
print("Tokens:", tokens)
print("Token IDs:", encoded_input['input_ids'])
上述代码中,我定义的文本为"I debug my code all day, and I am like a debugger."
2、Token解释
运行上述代码后,使用bert模型对该文本进行token化之后,输出的token为:
Tokens: ['[CLS]', 'i', 'de', '##bu', '##g', 'my', 'code', 'all', 'day', ',', 'and', 'i', 'am', 'like', 'a', 'de', '##bu', '##gger', '.', '[SEP]']
可以看到,模型将文本进行了拆分,同时 debug 这个单词拆分为了 de, bu, g 三个子词。
同时将debugger拆分为了de,bu, gger三个子词。
上面bert模型转换的token中,CLS (Classifier token)可以认为是输入开始位置的特殊标记符号。
SEP (Separator token)为分隔不同的句子或段落的特殊符号。
比如在处理两个句子时,SEP可以用来区分两个独立的句子,这样有助于模型正确区分出句子的边界,从而可以正确理解多个句子之间的语义关系。
## 符号可以认为是单词的子词分割符号。
BERT模型使用WordPiece算法对单词进行分割,它会将一些单词分解为比单词本身更小的单位。
比如上面把 debug 拆分为 de, ##bu, ##g三个部分,##表示该子词和前面的词为一个单词。
这些特殊符号我们不用太关注,在一些其他的算法或模型中输出的特殊符号可能不一样,但基本都是为了进行分割以及标注文本信息用的。
上述代码,除了输出token之外,还会输出每个token对应的ID。
Token IDs: [101, 1045, 2139, 8569, 2290, 2026, 3642, 2035, 2154, 1010, 1998, 1045, 2572, 2066, 1037, 2139, 8569, 13327, 1012, 102]
这个ID可以认为是每个 token 在模型词汇表中对应的唯一标识符,也可以认为是将文本转换为计算机能够识别和处理的数字形式的一种方式。
你可以修改上述代码中的文本text,看模型将其token化之后是什么样的。
------------------
不同的模型使用的token化算法不同。
本文bert使用的是WordPiece算法,而GPT系列使用的则是BPE算法,这个在《我的Transformer专栏》中会有更详细的介绍。
参考:^ 利用 Bert 将文本token化