如何将 SQuAD 数据中的令牌索引映射到 BERT 令牌生成器中的令牌?

时间:2021-03-17 03:21:42

标签: bert-language-model transformer question-answering huggingface-tokenizers squad

我正在使用 SQuaD 数据集进行答案跨度选择。使用 BertTokenizer 标记段落后,对于某些样本,答案的开始和结束索引不再与段落标记中的实际答案跨度位置匹配。如何解决这个问题呢?一种方法是相应地修改答案索引(也是训练目标)?但是怎么做呢?

1 个答案:

答案 0 :(得分:1)

原始数据集中的分词与 BERT 对输入分词的方式不同。在 BERT 中,频率较低的词被拆分为子词单元。您可以轻松地找出原始数据集中标记的字符偏移量。

在较新版本的 Transformer 中,分词器可以选择 return_offsets_mapping。如果设置为 True,则返回字符偏移量(元组 (char_start, char_end))。如果原始文本中有字符偏移,则可以将它们与标记器的输出进行映射。

from transformers import BertTokenizerFast
tok = BertTokenizerFast.from_pretrained("bert-base-cased")
tok("I am a tokenizer.", return_offsets_mapping=True)

输出:

{'input_ids': [101, 146, 1821, 170, 22559, 17260, 119, 102],
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0],
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1],
 'offset_mapping': [(0, 0),  (0, 1), (2, 4), (5, 6), (7, 12), (12, 16), (16, 17), (0, 0)]}

在 BERT (0, 0)[CLS] 的情况下,[SEP] 跨度对应于技术令牌。

当您同时使用原始标记化和 BERT 标记化的偏移量时,您可以找出重新标记化的字符串中的索引。