BertTokenizer - 当编码和解码序列时出现额外的空格
BertTokenizer - when encoding and decoding sequences extra spaces appear
当使用 HuggingFace 的变形金刚时,我遇到了编码和解码方法的问题。
我有以下字符串:
test_string = 'text with percentage%'
那我是运行下面的代码:
import torch
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
test_string = 'text with percentage%'
# encode Converts a string in a sequence of ids (integer), using the tokenizer and vocabulary.
input_ids = tokenizer.encode(test_string)
output = tokenizer.decode(input_ids)
输出如下所示:
'text with percentage %'
在 % 前多了一个 space。我已经尝试了像 clean_up_tokenization_spaces
这样的额外参数,但这是不同的东西。
我应该如何在解码和编码中使用什么来获得前后完全相同的文本。这也适用于其他特殊标志。
据https://github.com/huggingface/transformers/pull/1274称,他们正在努力。希望下周某个时候会有解决方案。
如果您尝试使用 BERT 进行标记分类以便在原始字符串中找到跨度,则一种解决方法是使用 BertTokenizerFast
和选项 return_offsets_mapping=True
.
test_string = 'text with percentage%'
tokenizer = BertTokenizerFast.from_pretrained('bert-base-cased')
tokens = tokenizer(test_string, return_offsets_mapping=True)
input_ids = tokens.data["input_ids"]
span_start_index, span_stop_index = some_model(input_ids)
然后一旦你得到了token的分类结果,你就可以做类似的事情
predicted_span = test_string[tokens.encodings[0].offsets[span_start_index][0]:tokens.encodings[0].offsets[span_stop_index][1]]
当使用 HuggingFace 的变形金刚时,我遇到了编码和解码方法的问题。
我有以下字符串:
test_string = 'text with percentage%'
那我是运行下面的代码:
import torch
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
test_string = 'text with percentage%'
# encode Converts a string in a sequence of ids (integer), using the tokenizer and vocabulary.
input_ids = tokenizer.encode(test_string)
output = tokenizer.decode(input_ids)
输出如下所示:
'text with percentage %'
在 % 前多了一个 space。我已经尝试了像 clean_up_tokenization_spaces
这样的额外参数,但这是不同的东西。
我应该如何在解码和编码中使用什么来获得前后完全相同的文本。这也适用于其他特殊标志。
据https://github.com/huggingface/transformers/pull/1274称,他们正在努力。希望下周某个时候会有解决方案。
如果您尝试使用 BERT 进行标记分类以便在原始字符串中找到跨度,则一种解决方法是使用 BertTokenizerFast
和选项 return_offsets_mapping=True
.
test_string = 'text with percentage%'
tokenizer = BertTokenizerFast.from_pretrained('bert-base-cased')
tokens = tokenizer(test_string, return_offsets_mapping=True)
input_ids = tokens.data["input_ids"]
span_start_index, span_stop_index = some_model(input_ids)
然后一旦你得到了token的分类结果,你就可以做类似的事情
predicted_span = test_string[tokens.encodings[0].offsets[span_start_index][0]:tokens.encodings[0].offsets[span_stop_index][1]]