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

发布于:2025-05-12 ⋅ 阅读:(12) ⋅ 点赞:(0)

🌱 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后,手动把实体的位置“挪一下”,避免标注错位。