`offset
offset_mapping
是什么
offset_mapping是 transformers
库中分词器(tokenizer
)在进行分词操作时返回的一个重要信息,它用于建立原始文本中的字符位置和分词后标记(tokens
)之间的映射关系。借助 offset_mapping
,你能够知晓每个标记在原始文本中对应的字符起始和结束位置,这在很多自然语言处理任务(像问答系统、命名实体识别等)里非常关键。
具体解释
offset_mapping
是一个元组列表:列表里的每个元组都代表一个标记在原始文本中的字符位置范围,元组的第一个元素是起始字符位置,第二个元素是结束字符位置。- 特殊标记的映射:特殊标记(例如
[CLS]
、[SEP]
)的映射通常是(0, 0)
,这表明它们在原始文本里没有对应的字符。
示例代码
下面是一个简单的示例,用来展示如何使用 offset_mapping
:
from transformers import AutoTokenizer
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
# 原始文本
text = "Hello, how are you?"
# 进行分词并获取 offset_mapping
encoding = tokenizer.encode_plus(
text,
add_special_tokens=True,
return_offsets_mapping=True
)
# 打印 input_ids 和 offset_mapping
input_ids = encoding['input_ids']
offset_mapping = encoding['offset_mapping']
print("Input IDs:", input_ids)
print("Offset Mapping:", offset_mapping)
# 将 input_ids 转换回 tokens
tokens = tokenizer.convert_ids_to_tokens(input_ids)
# 打印每个 token 及其对应的 offset
for i in range(len(tokens)):
token = tokens[i]
start, end = offset_mapping[i]
print(f"Token: {token}, Offset: ({start}, {end}), Text: {text[start:end]}")
代码解释
- 加载分词器:使用
AutoTokenizer.from_pretrained
加载bert-base-uncased
分词器。 - 分词并获取
offset_mapping
:调用tokenizer.encode_plus
方法,设置return_offsets_mapping=True
以获取offset_mapping
。 - 打印结果:打印
input_ids
、offset_mapping
以及每个标记对应的字符位置和文本。
示例输出
代码语言:javascript代码运行次数:0运行复制Input IDs: [101, 7592, 1010, 2129, 2024, 2017, 102]
Offset Mapping: [(0, 0), (0, 5), (5, 6), (7, 10), (11, 14), (15, 18), (0, 0)]
Token: [CLS], Offset: (0, 0), Text:
Token: hello, Offset: (0, 5), Text: Hello
Token: ,, Offset: (5, 6), Text: ,
Token: how, Offset: (7, 10), Text: how
Token: are, Offset: (11, 14), Text: are
Token: you, Offset: (15, 18), Text: you
Token: [SEP], Offset: (0, 0), Text:
从输出可以看出,offset_mapping
清晰地展示了每个标记在原始文本中的字符位置。特殊标记 [CLS]
和 [SEP]
的偏移量为 (0, 0)
,这意味着它们在原始文本中没有对应的字符。而其他标记则对应着原始文本中的具体字符范围。
发布评论