【发布时间】:2019-11-21 16:43:31
【问题描述】:
在使用 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 这样的额外参数,但这是为了不同的东西。
我应该如何在解码和编码中使用什么来获得前后完全相同的文本。这也发生在其他特殊标志上。
【问题讨论】:
-
我不认为 BERT 标记化过程是 100% 可逆的,正如您所注意到的。你为什么需要它?可能还有其他方法可以完成您想要的,例如通过保留原始字符串而不是从标记重构它。
-
相比之下,像github.com/kovalevfm/SubTokenizer 这样的东西实际上是完全可逆的。我希望 BERT 对此要小心,但对文本分割细节的关注似乎是一个“生产”问题而不是“研究”问题 :(
-
这只是我脚本中的一个 sn-p 来显示问题。在这之间我正在回答问题,我想要实现的是一个完全可追溯的文本
-
啊,所以理想情况下你应该有类似github.com/huggingface/transformers/pull/1274 的东西。假设您可以将答案范围捕捉到整个单词,您可以使用 bistring.readthedocs.io/en/latest/Python/Tokenizer.html 之类的东西在跟踪字符串索引的同时拆分成单词,然后只需使用
BertTokenizer获取子词
标签: python pytorch tokenize torch bert-language-model