在自然语言处理任务中,像 BERT 这样的模型会在输入前自动加上一些特殊token

🌱 1. 什么是 BERT?

BERT 是一个自然语言理解模型。你可以把它想象成一个超级聪明的“语言理解机器人”。你把一句话丢进去,它能:

  • 理解这句话的意思;
  • 告诉你哪个词是实体(人名、地名);
  • 判断两个句子是不是一个意思,等等。

🧱 2. 什么是 Token?

Token 就是把一句话拆成一个个小块的结果。

比如原句是:

我爱北京天安门

模型不能直接理解汉字或词语,所以会先用分词器(Tokenizer)把它切成 token

["我", "爱", "北京", "天", "安", "门"]

这些 token 就是模型处理的最小单位。


🧪 3. 什么是“实体标注”?

举个例子,我们想让模型识别句子中的地名:

我爱北京天安门
👉 地名是 “北京天安门”

这时候我们会标注 token 的位置:

北京:第2个 token
天安门:第3~5个 token

于是,我们会记录下这些位置:

annotations = [(2, 6)]  # 表示从第2个到第5个token(Python里右边不包含,所以是6)

这些是原始位置,还没有添加特殊 token 的时候。


🛠️ 4. 模型会“偷偷”加一些 token(重点来了)

在实际输入 BERT 模型之前,它会自动加上一些“特殊 token”,来帮助模型更好地理解任务:

🟡 例子:

原始句子:

我爱北京天安门

模型输入前会变成这样:

[CLS] 请识别地名:我 爱 北京 天 安 门 [SEP]

你看到:

  • [CLS] 是开头特殊 token;
  • “请识别地名:” 是任务提示(instruction tokens);
  • [SEP] 是结束符号。

这些词在原始文本中根本不存在! 但它们被加进去了,所以 token 的位置整体往后挪了


🎯 5. 为什么要“挪一下”实体的位置?

因为你原来的标注是这样:

annotations = [(2, 6)]

表示“北京天安门”在原来的第2~5个 token。

但模型看到的 token 是:

0: [CLS]
1: 请
2: 识
3: 别
4: 地
5: 名
6: :
7: 我
8: 爱
9: 北京
10: 天
11: 安
12: 门
13: [SEP]

原来的“北京天安门”现在变成了:

token 9 ~ 12

所以你得把原来的 (2, 6) 改成 (9, 13),否则模型会以为你要标注“请识别地名”这几个词,完全错了!


✅ 总结一下,用人话讲就是:

你原来在“干净句子”上标注了位置,比如第3个词是“北京”;
但模型偷偷加了开头结尾的词([CLS], instruction, [SEP]),所以“北京”变成第9个词了;
👉 为了标注不出错,你得把原来的位置往后挪一挪

在自然语言处理任务中,像 BERT 这样的模型会在输入前自动加上一些特殊token,例如:

  • [CLS]:加在句子最前面,代表整个句子的汇总;

  • [SEP]:加在每个句子或段落末尾,表示分隔;

  • instruction_tokens:某些任务中可能还会加一些说明任务的提示词。

而你对文本的实体标注(如 “北京” 在第2到3个token)是基于原始的文本分词结果,不包含这些特殊token。所以你需要在加入这些token后,手动把实体的位置“挪一下”,避免标注错位。

### 如何搭建和使用 BERT 预训练模型 #### 加载预训练的 BERT 模型与分词器 为了构建基于 BERT自然语言处理应用,首先需要加载预训练好的 BERT 模型以及相应的分词工具。通过 `transformers` 库可以方便地获取这些资源。 ```python from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertModel.from_pretrained('bert-base-chinese') ``` 这段代码展示了如何利用 Hugging Face 提供的 `transformers` 库来初始化一个中文版的基础 BERT 模型及其配套的分词器[^1]。 #### 数据准备与转换 当有了模型之后,下一步就是准备好输入模型的数据。对于文本数据来说,通常会先将其转化为适合喂入神经网络的形式——即 token ID 列表加上一些必要的辅助信息(比如 attention mask)。这里给出一段简单的例子说明这一过程: ```python text = "这是一个测试句子" tokens = tokenizer.encode_plus( text, add_special_tokens=True, # 添加特殊的CLS 和 SEP标记 max_length=50, # 填充或截断至固定长度 pad_to_max_length=True, return_attention_mask=True, # 返回attention masks return_tensors='pt' # 将结果返回为PyTorch张量 ) input_ids = tokens['input_ids'] attention_masks = tokens['attention_mask'] ``` 上述代码片段实现了对单条文本数据的编码操作,并设置了最大序列长度为50个token。如果原始文本过短,则会被填充;反之则被裁剪掉多余部分。 #### 使用模型进行推理 一旦完成了数据准备工作,就可以把它们送入到已经加载完毕的 BERT 模型当中去执行向传播计算了。下面是一个具体的实现方式: ```python with torch.no_grad(): # 关闭梯度追踪以节省内存 outputs = model(input_ids=input_ids, attention_mask=attention_masks) last_hidden_states = outputs.last_hidden_state ``` 在这里,关闭了自动求导机制 (`torch.no_grad()`) 来减少不必要的运算开销。最后得到的结果存储于变量 `outputs` 中,其中包含了每一层 Transformer 编码后的隐藏状态表示。特别关注的是最后一层的状态(`last_hidden_states`),它往往用于后续的任务建模中作为特征提取的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值