如何解决如何将 SQuAD 数据中的令牌索引映射到 BERT 令牌生成器中的令牌?
我正在使用 SQuaD 数据集进行答案跨度选择。使用 BertTokenizer
标记段落后,对于某些样本,答案的开始和结束索引不再与段落标记中的实际答案跨度位置匹配。如何解决这个问题呢?一种方法是相应地修改答案索引(也是训练目标)?但是怎么做呢?
解决方法
原始数据集中的分词与 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],'attention_mask': [1,1,1],'offset_mapping': [(0,0),(0,1),(2,4),(5,6),(7,12),(12,16),(16,17),0)]}
在 BERT (0,0)
和 [CLS]
的情况下,[SEP]
跨度对应于技术令牌。
当您同时使用原始标记化和 BERT 标记化的偏移量时,您可以找出重新标记化的字符串中的索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。