我使用SQuaD数据集来选择答案范围。在使用BertTokenizer对段落进行标记化之后,对于某些样本,答案的开始和结束索引不再与段落标记中的实际答案跨度位置匹配。如何解决这个问题?一种方法是相应地修改答案索引(以及训练目标)?但是该怎么做呢?
发布于 2021-03-17 16:26:26
原始数据集中的标记化与BERT对输入进行标记化的方式不同。在BERT中,频率较低的单词被拆分为子词单元。您可以很容易地找到原始数据集中标记的字符偏移量。
在较新版本的Transformers中,标记器具有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 [CLS]和[SEP]的情况下,(0, 0)跨度对应于技术标记。
当您使用原始标记化和BERT标记化获得偏移量时,您可以找出重新标记化字符串中的索引是什么。
https://stackoverflow.com/questions/66666525
复制相似问题