8

在使用 HuggingFace 的 Transformers 时,我遇到了编码和解码方法的问题。

我有以下字符串:

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 %'

在 % 之前有一个额外的空格。我已经尝试过额外的论点,clean_up_tokenization_spaces 但这是为了不同的东西。

我应该如何在解码和编码中使用什么来获得前后完全相同的文本。这也发生在其他特殊标志上。

4

2 回答 2

3

如果您尝试使用 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)

然后一旦你得到令牌分类结果,你可以做类似的事情

predicted_span = test_string[tokens.encodings[0].offsets[span_start_index][0]:tokens.encodings[0].offsets[span_stop_index][1]]
于 2021-03-01T16:09:35.023 回答
2

根据https://github.com/huggingface/transformers/pull/1274,他们正在研究它。希望下周的某个时候会有解决方案。

于 2019-12-05T14:50:37.263 回答