我正在使用 SQuaD 数据集来选择答案范围。使用 对BertTokenizer
段落进行标记后,对于某些样本,答案的开始和结束索引不再与段落标记中的真实答案跨度位置匹配。如何解决这个问题呢?一种方法是相应地修改答案指数(也是训练目标)?但是怎么做呢?
问问题
1056 次
1 回答
2
原始数据集中的标记化与 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)]}
在(0, 0)
BERT[CLS]
和[SEP]
.
当您同时使用原始标记化和 BERT 标记化时,您可以找出重新标记化字符串中的索引是什么。
于 2021-03-17T08:26:26.260 回答