为什么 BERT 标记器的功能不同?

数据挖掘 机器学习 深度学习 nlp 标记化
2022-03-14 18:51:56

在试验变压器的TFBertForSequenceClassificationBertTokenizer时,我注意到 BertTokenizer:

transformer_bert_tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

以不同于我用来为我的 BERT 模型构建的分词器的方式对文本进行分词:

!wget --quiet https://raw.githubusercontent.com/tensorflow/models/master/official/nlp/bert/tokenization.py
import tokenization
FullTokenizer = tokenization.FullTokenizer

进而

BERT_MODEL_HUB = 'https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/2'
bert_layer = hub.KerasLayer(BERT_MODEL_HUB, trainable=True)
to_lower_case = bert_layer.resolved_object.do_lower_case.numpy()
vocabulary_file = bert_layer.resolved_object.vocab_file.asset_path.numpy()

tokenizer = FullTokenizer(vocabulary_file, to_lower_case)

举个例子:

sequence = "Systolic arrays are cool. This 🐳 is cool too."
transformer_bert_tokenizer .tokenize(sequence)
# output: ['s', '##ys', '##to', '##lic', 'array', '##s', 'are', 'cool', '.', 'this', '[UNK]', 'is', 'cool', 'too', '.']
tokenizer2.tokenize(sequence)
# output: ['sy','##sto','##lic','arrays','are','cool','.','this','[UNK]', 'is','cool','too','.']

有谁知道为什么有区别?两个分词器不是使用相同的词汇吗?首选哪种方式?

1个回答

每个 BERT 变体都使用不同准备的文本进行训练,例如顾名思义,BERT uncased 使用所有字母都是小写的文本进行训练。这意味着词汇提取过程也使用小写文本作为输入,因此给出的结果与使用原始大小写文本的相同词汇提取过程不同。

请注意,由于词汇表不同,每个模型都应与用于训练它的标记器一起使用。使用具有不同标记器的模型可能会导致不良结果。

因此,tokenizer 的选择与 BERT 模型的选择有关。使用其中一种的标准(例如,不加壳与加壳)取决于具体情况。例如,对于用英语进行命名实体识别(NER),保留原始大小写可能很重要,这样模型才能更容易地区分专有名词。