有没有办法使用带有字词前缀的 Huggingface 预训练分词器?

Is there a way to use Huggingface pretrained tokenizer with wordpiece prefix?

我正在用 Bert 做一个序列标记任务。为了将词块与标签对齐,我需要一些标记来识别它们,这样我就可以通过求和或平均得到每个词的单个嵌入。

例如,我想将单词 New~york 标记为 New ##~ ##york,并查看互联网上的一些旧示例,这是您之前使用 BertTokenizer 得到的结果,但显然不再是(说他们的文档)

所以当我 运行:

tokenizer = BertTokenizer.from_pretrained('bert-base-cased')

batch_sentences = ["hello, i'm testing this efauenufefu"]

inputs = tokenizer(batch_sentences, return_tensors="pt")

decoded = tokenizer.decode(inputs["input_ids"][0])

print(decoded)

我得到:

[CLS] hello, i'm testing this efauenufefu [SEP]

但编码清晰表明,最后的废话确实被分解成碎片......

In [4]: inputs
Out[4]: 
{'input_ids': tensor([[  101, 19082,   117,   178,   112,   182,  5193,  1142,   174,  8057,
         23404, 16205, 11470,  1358,   102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])} 

我也试过使用BertTokenizerFast,它不像BertTokenizer,它允许你指定wordpiece前缀:

tokenizer2 = BertTokenizerFast("bert-base-cased-vocab.txt", wordpieces_prefix = "##")
batch_sentences = ["hello, i'm testing this efauenufefu"]

inputs = tokenizer2(batch_sentences, return_tensors="pt")

decoded = tokenizer2.decode(inputs["input_ids"][0])

print(decoded)

然而解码器给了我一模一样的...

[CLS] hello, i'm testing this efauenufefu [SEP]

那么,有没有办法使用带前缀的预训练 Huggingface 分词器,或者我必须自己训练自定义分词器?

也许您正在寻找 tokenize:

from transformers import BertTokenizerFast
t = BertTokenizerFast.from_pretrained('bert-base-uncased')
t.tokenize("hello, i'm testing this efauenufefu")

输出:

['hello',
 ',',
 'i',
 "'",
 'm',
 'testing',
 'this',
 'e',
 '##fa',
 '##uen',
 '##uf',
 '##ef',
 '##u']

您还可以获得每个标记到相关单词的映射,并且 other things:

o = t("hello, i'm testing this efauenufefu", add_special_tokens=False, return_attention_mask=False, return_token_type_ids=False)
o.words()

输出:

[0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7]