Transformer 通关秘籍2:利用 BERT 将文本 token 化
在上一节,我们介绍了 token 的概念。
你可以这么认为, token 是自然语言处理场景(如文本生成、AI聊天)下,AI 模型能够处理的最小单位。
在计算机视觉中,模型以像素为单位来处理图像像素之间的关系,而语言模型则是以 token 为单位理解 token 之间的关系。
下面通过一个小例子,来展示一下语言模型是如何将一段文本转换为 token 的,以及模型将文本转换为 token 之后是什么样子。
通过这个例子,希望你可以对模型处理 token 的过程有一个感性的认识,以下代码现在不用太关注细节,主要了解这个过程即可。
BERT 如何对文本进行转换
这里使用 BERT 这个模型来对文本进行处理。
BERT (Bidirectional Encoder Representations from Transformers)是由 Google 在2018年发布的自然语言处理模型。当时,这个模型在很多 NLP 任务中都取得了非常好的性能,包括文本问答、自然语言推断和情感分析等,可以说一度霸榜了很长时间。
你可以使用下面的代码,来调用 BERT 模型对一段文本 token 化。
需要说明的是,首次运行上述代码时,如缺少相关的库的话需要先下载安装,比如使用 pip3 install transformers 下载安装 transformers库。
在运行下面的代码时,会从 HuggingFace 上下载 BERT 的 token izer 等文件。
第一次下载可能时间会较长,等待即可。
下载完成后相关文件会放在系统缓存目录下,再一次运行时就不会再下载了,可直接使用。
# 从transformers库中导入 BERT token izer类
from transformers import BERT token izer
# 初始化 BERT token izer,加载' BERT -base-uncased'预训练模型。
token izer = BERT token izer.from_pretrained(' BERT -base-uncased')
# 定义一个示例文本字符串。
text = "I debug my code all day, and I am like a debugger."
# 使用 token izer对文本进行编码,将文本分割成 token s,同时映射到相应的ID。
encoded_input = token izer(text)
# 使用 token izer的convert_ids_to_ token s方法将 token s的ID转换回可读的 token s。
token s = token izer.convert_ids_to_ token s(encoded_input['input_ids'])
# 打印出 token s及其对应的ID。
print(" token s:", token s)
print(" token IDs:", encoded_input['input_ids'])
上述代码中,我定义的文本为"I debug my code all day, and I am like a debugger."。
运行上述代码后,使用 BERT 模型对该文本进行 token 化之后,输出的 token 为:
token s: ['[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可以用来区分两个独立的句子,这样有助于模型正确区分出句子的边界,从而可以正确理解多个句子之间的语义关系。
这里有一个全程一站式的 Transformer 讲解和实战辅导,带你从零手写一个可对话的大模型,点击链接查看详情从零手写大模型实战
符号可以认为是单词的子词分割符号。
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 化之后是什么样的。
本文代码可以在下面的链接中获得:0_token/00_token_bert.py · iwaihou/transformer_learning_from_scratch - Gitee.com