gpt4 book ai didi

tokenize - 有没有办法获取 BERT 中生成某个 token 的子字符串的位置?

转载 作者:行者123 更新时间:2023-12-03 08:37:46 29 4
gpt4 key购买 nike

我正在将句子输入 BERT 模型(Hugging Face 库)。这些句子通过预训练的分词器进行分词。我知道您可以使用解码函数从标记返回到字符串。

string = tokenizer.decode(...)

但是,重建并不完美。如果您使用无外壳的预训练模型,大写字母就会丢失。此外,如果分词器将一个单词拆分为 2 个标记,则第二个标记将以“##”开头。例如,单词“coronavirus”被分为 2 个标记:“corona”和“##virus”。

所以我的问题是:有没有办法获取创建每个标记的子字符串的索引?例如,以字符串“东京报告近 370 例新的冠状病毒病例,创下单日新纪录”。第9个token是“virus”对应的token。

['[CLS]', 'tokyo', 'to', 'report', 'nearly', '370', 'new', 'corona', '##virus', 'cases', ',', 'setting', 'new', 'single', '-', 'day', 'record', '[SEP]']

我想要一些东西告诉我标记“##virus”来自原始字符串中的“virus”子字符串,该子字符串位于原始字符串的索引 37 和 41 之间。

sentence = "Tokyo to report nearly 370 new coronavirus cases, setting new single-day record"
print(sentence[37:42]) # --> outputs 'virus

最佳答案

我想更新答案。由于 HuggingFace 引入了他们的(更快)版本的 Rust 编写的快速分词器,因此此任务变得更加容易:

from transformers import BertTokenizerFast

tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')
sentence = "Tokyo to report nearly 370 new coronavirus cases, setting new single-day record"

encodings = tokenizer(sentence, return_offsets_mapping=True)
for token_id, pos in zip(encodings['input_ids'], encodings['offset_mapping']):
print(token_id, pos, sentence[pos[0]:pos[1]])



101 (0, 0)
5522 (0, 5) Tokyo
2000 (6, 8) to
3189 (9, 15) report
3053 (16, 22) nearly
16444 (23, 26) 370
2047 (27, 30) new
21887 (31, 37) corona
23350 (37, 42) virus
3572 (43, 48) cases
1010 (48, 49) ,
4292 (50, 57) setting
2047 (58, 61) new
2309 (62, 68) single
1011 (68, 69) -
2154 (69, 72) day
2501 (73, 79) record
102 (0, 0)

更重要的是,如果您使用单词列表(并设置 is_split_into_words=True )代替常规字符串,那么人们可以轻松地区分每个单词的第一个标记和结果标记(元组的第一个值将为零),这是 token 分类任务的常见需求。

关于tokenize - 有没有办法获取 BERT 中生成某个 token 的子字符串的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63413414/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com