标记器解码步骤中的标记到单词映射拥抱面?

DsC*_*Cpp 5 tokenize pytorch huggingface-transformers

有没有办法知道从标记到tokenizer.decode()函数中原始单词的映射?
例如:

from transformers.tokenization_roberta import RobertaTokenizer

tokenizer = RobertaTokenizer.from_pretrained('roberta-large', do_lower_case=True)

str = "This is a tokenization example"
tokenized = tokenizer.tokenize(str) 
## ['this', '?is', '?a', '?token', 'ization', '?example']

encoded = tokenizer.encode_plus(str) 
## encoded['input_ids']=[0, 42, 16, 10, 19233, 1938, 1246, 2]

decoded = tokenizer.decode(encoded['input_ids']) 
## '<s> this is a tokenization example</s>'
Run Code Online (Sandbox Code Playgroud)

目标是有一个函数将decode过程中的每个标记映射到正确的输入词,因为这里它将是:
desired_output = [[1],[2],[3],[4,5],[6]]
Asthis对应于 id 42,而tokenization对应于位于数组[19244,1938]索引4,5处的ids input_ids

Dav*_*rth 10

如果您使用快速分词器,即库中的 rust 支持版本,则tokenizers编码包含一种word_ids可用于将子词映射回其原始词的方法。aword与 asubword的构成取决于分词器,单词是由预分词阶段生成的,即用空格分割,子词是由实际模型(BPEUnigram例如)生成的。

即使预标记化执行额外的分割,下面的代码通常也应该可以工作。例如,我创建了自己的自定义步骤,该步骤根据 PascalCase 进行分割 - 这里wordsPascalCase,接受的答案在这种情况下不起作用,因为它假设单词是空格分隔的。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('roberta-large', do_lower_case=True)

example = "This is a tokenization example"

encoded = tokenizer(example)

desired_output = []
for word_id in encoded.word_ids():
    if word_id is not None:
        start, end = encoded.word_to_tokens(word_id)
        if start == end - 1:
            tokens = [start]
        else:
            tokens = [start, end-1]
        if len(desired_output) == 0 or desired_output[-1] != tokens:
            desired_output.append(tokens)
desired_output
Run Code Online (Sandbox Code Playgroud)


cro*_*oik 5

据我所知,他们没有内置的方法,但你可以自己创建一个:

from transformers.tokenization_roberta import RobertaTokenizer

tokenizer = RobertaTokenizer.from_pretrained('roberta-large', do_lower_case=True)

example = "This is a tokenization example"

print({x : tokenizer.encode(x, add_special_tokens=False, add_prefix_space=True) for x in example.split()})
Run Code Online (Sandbox Code Playgroud)

输出:

{'This': [42], 'is': [16], 'a': [10], 'tokenization': [19233, 1938], 'example': [1246]}
Run Code Online (Sandbox Code Playgroud)

要准确获得所需的输出,您必须使用列表理解:

{'This': [42], 'is': [16], 'a': [10], 'tokenization': [19233, 1938], 'example': [1246]}
Run Code Online (Sandbox Code Playgroud)

输出:

[[1], [2], [3], [4, 5], [6]]
Run Code Online (Sandbox Code Playgroud)