【问题标题】:How to map token indices from the SQuAD data to tokens from BERT tokenizer?如何将 SQuAD 数据中的标记索引映射到 BERT 标记器中的标记?
【发布时间】:2021-06-14 09:41:25
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    原始数据集中的标记化与 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 标记化获得偏移量时,您可以找出重新标记化字符串中的索引。

    【讨论】:

    • 非常感谢您的回复,Jindřich。这很有帮助。请问您是否可以共享代码以在重新标记的字符串中查找索引?
    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 2020-08-10
    • 2021-02-10
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多