一、引言
这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。
🤗 Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。它的宗旨是让最先进的 NLP 技术人人易用。
🤗 Transformers 提供了便于快速下载和使用的API,让你可以把预训练模型用在给定文本、在你的数据集上微调然后通过 model hub 与社区共享。同时,每个定义的 Python 模块均完全独立,方便修改和快速研究实验。
🤗 Transformers 支持三个最热门的深度学习库: Jax, PyTorch 以及 TensorFlow — 并与之无缝整合。你可以直接使用一个框架训练你的模型然后用另一个加载和推理。
本文重点介绍Tokenizer类。
二、Tokenizer
2.1 概述
Tokenizer在自然语言处理(NLP)中是一个关键组件,它负责将文本字符串转换成模型可以处理的结构化数据形式,通常是将文本切分成“tokens”或单词、短语、子词等单位。这些tokens是模型理解文本的基础。Tokenizer的类型和复杂性可以根据任务需求而变化,从简单的基于空格的分割到更复杂的基于规则或机器学习的分词方法。
2.2 主要功能
1. **分词**:将句子拆分成单词或子词。例如,中文分词器会将“自然语言处理”拆分成“自然”、“语言”、“处理”,而英文Tokenizer可能使用Subword Tokenization如Byte-Pair Encoding (BPE)来处理罕见词。
2. **添加特殊标记**:在序列的开始和结束添加特殊标记,如BERT中的[CLS]和[SEP],用于特定任务的序列分类或区分输入片段。
3. **编码**:将tokens转换为数字ID,这些ID是模型的输入。每个token在词汇表中有一个唯一的ID。
4. **处理填充和截断**:为了确保输入序列的一致长度,Tokenizer可以对较短的序列进行填充,对较长的序列进行截断。
5. **生成Attention Mask**:在某些模型中,Tokenizer还会生成一个Attention Mask,指示哪些输入位置是实际的tokens(通常标记为1),哪些是填充的(标记为0)。
2.3 代码示例
使用示例(以Hugging Face的Transformers库为例):
import os os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" os.environ["CUDA_VISIBLE_DEVICES"] = "2" os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0" from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') print("------------单句分词------------") token = tokenizer.encode("我在北京的,互联网公司工作") print(token) #[101, 2769, 1762, 1266, 776, 4638, 117, 757, 5468, 5381, 1062, 1385, 2339, 868, 102] print(tokenizer.decode(token)) #[CLS] 我 在 北 京 的, 互 联 网 公 司 工 作 [SEP] print("------------多句分词------------") batch_token1 = tokenizer(["我在,北京工作","想去外地看一看世界多么美好"],padding=True,return_tensors="pt") print(batch_token1) """ {'input_ids': tensor([[ 101, 2769, 1762, 117, 1266, 776, 2339, 868, 102, 0, 0, 0, 0, 0, 0], [ 101, 2682, 1343, 1912, 1765, 4692, 671, 4692, 686, 4518, 1914, 720, 5401, 1962, 102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])} """ print(batch_token1["input_ids"]) """提取input_ids tensor([[ 101, 2769, 1762, 117, 1266, 776, 2339, 868, 102, 0, 0, 0, 0, 0, 0], [ 101, 2682, 1343, 1912, 1765, 4692, 671, 4692, 686, 4518, 1914, 720, 5401, 1962, 102]]) """
这个例子展示了如何使用BertTokenizer来处理文本,生成包括token input_ids、token_type_ids和attention mask在内的编码数据,这些数据可以直接用于BERT模型的输入。
三、总结
本文对使用transformers的BertTokenizer进行尝试,主要功能是将字、词转换为可以运算的数字ID编码,供后面的model层使用。